I'm not sure what is wrong with my animation. It was smooth, now it's not, I only have two classes here. Is it something to do with my delay or is it something to do with how I'm using spritemanager.getSprite();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| package tiledgame;
import java.awt.Point; import java.util.Map; import org.newdawn.slick.Image; import org.newdawn.slick.SpriteSheet;
public class CharacterEntity { public static final int UP = 0; public static final int RIGHT = 1; public static final int DOWN = 2; public static final int LEFT = 3; public static final int IDLE = 0; public static final int WALK = 1; private SpriteSheet spriteSheet; private int facing = 0; private int state = 0; private float locationX; private float locationY; private int walkDelay = 200; private int currentFrame = 0; private int timePassed = 0; private int walkColumn = 0;
public CharacterEntity(SpriteSheet spriteSheet, float locationX, float locationY) { this.spriteSheet = spriteSheet; this.locationX = locationX; this.locationY = locationY; }
public int getFacing() { return facing; }
public void setFacing(int facing) { this.facing = facing; }
public float getLocationX() { return locationX; }
public void setLocationX(float locationX) { this.locationX = locationX; }
public float getLocationY() { return locationY; }
public void setLocationY(float locationY) { this.locationY = locationY; }
public void setState(int state) { this.state = state; }
public int getState() { return state; }
public int getWalkDelay() { return walkDelay; }
public void setWalkDelay(int walkDelay) { this.walkDelay = walkDelay; }
public int getWalkColumn() { return walkColumn; }
public void setWalkColumn(int walkColumn) { this.walkColumn = walkColumn; }
public void tick(int delta) { if (this.state == WALK) { if (timePassed >= walkDelay) { timePassed = 0; if (this.currentFrame == 1) { this.currentFrame = -1; } else { this.currentFrame = 1; } } else { timePassed += delta; } }else{ currentFrame = 0; } } public Image getSprite() { return this.spriteSheet.getSprite(this.currentFrame + this.walkColumn, this.facing); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| package tiledgame;
import org.newdawn.slick.AppGameContainer; import org.newdawn.slick.BasicGame; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; import org.newdawn.slick.Input; import org.newdawn.slick.SlickException; import org.newdawn.slick.SpriteSheet;
public class TiledGame extends BasicGame {
private GameContainer gc; private float moveSpeed = 1; private CharacterEntity testEntity; private boolean playerIsMoving = false;
public TiledGame() { super("Tiled game"); }
public static void main(String[] args) throws SlickException { AppGameContainer app = new AppGameContainer(new TiledGame()); app.setDisplayMode(1024, 768, false); app.start(); }
@Override public void init(GameContainer gc) throws SlickException { testEntity = new CharacterEntity(new SpriteSheet("com/hadesvine/tilegame/tiles/crono.png", 24, 32), 400, 300); testEntity.setWalkColumn(4); testEntity.setWalkDelay(200); }
@Override public void update(GameContainer gc, int delta) throws SlickException { playerIsMoving = false; Input input = gc.getInput(); float rate = delta / 10; if (input.isKeyDown(Input.KEY_W)) { testEntity.setFacing(CharacterEntity.UP); testEntity.setLocationY(testEntity.getLocationY() - moveSpeed * rate); playerIsMoving = true; } if (input.isKeyDown(Input.KEY_D)) { testEntity.setFacing(CharacterEntity.RIGHT); testEntity.setLocationX(testEntity.getLocationX() + moveSpeed * rate); playerIsMoving = true; } if (input.isKeyDown(Input.KEY_S)) { testEntity.setFacing(CharacterEntity.DOWN); testEntity.setLocationY(testEntity.getLocationY() + moveSpeed * rate); playerIsMoving = true; } if (input.isKeyDown(Input.KEY_A)) { testEntity.setFacing(CharacterEntity.LEFT); testEntity.setLocationX(testEntity.getLocationX() - moveSpeed * rate); playerIsMoving = true; } if (input.isKeyDown(Input.KEY_2)) { if (moveSpeed != 500) { moveSpeed += 1; } } if (input.isKeyDown(Input.KEY_1)) { if (moveSpeed > 1) { moveSpeed -= 1; } } if (input.isKeyDown(Input.KEY_3)) { if (moveSpeed > 1) { moveSpeed = 1; } } if (playerIsMoving) { testEntity.setState(CharacterEntity.WALK); } else { testEntity.setState(CharacterEntity.IDLE); } testEntity.tick(delta); }
@Override public void render(GameContainer gc, Graphics g) throws SlickException { testEntity.getSprite().draw(testEntity.getLocationX(), testEntity.getLocationY()); } } |
Any help would be appreciated.