Animação de Sprites com Java2D
30/04/2019
0
Bom dia, ou boa noite, gente. Possuo uma classe chamada Player, e nela, tenho um objeto do tipo Sprite, e um objeto do tipo BufferedImage, assim:
Bem, dentro dessa classe Sprite, eu tenho isso:
Basicamente, a classe sprite pega uma SpriteSheet e a divide em 16 sprites, considerando que há esse número de sprites na SpriteSheet. O método getSprite() retorna uma sprite das 16. Voltando para a classe Player, possuo listeners que movem o personagemd, e métodos que deveriam animar o mesmo, assim:
Os métodos animate****Sprite() nada fazem além de mudar a variável currentSprite com o método getSprite(), e o desanimate fazem a mesma coisa.
O Player é inserido dentro de um GameLoop, que o atualiza e o renderiza 60 vezes por segundo.
Bem, agora que o código foi explicado, a minha primeira dúvida é o seguinte:
Como eu animo o meu personagem com esses recursos?
Eu já tentei um bocado de coisas, até multithreading para animá-lo, mas nada deu certo até agora.
public class Player extends GameObject implements KeyListener{ private BufferedImage currentSprite; private Sprite sprites;
Bem, dentro dessa classe Sprite, eu tenho isso:
public class Sprite { private String className; private BufferedImage sprites[]; private ImageIcon face; private static final ResourceBundle CLASSES_SPRITE = ResourceBundle.getBundle(Constants.CLASSES_FILE_PATH); private static final String SPRITES_PATH = "/client/datafiles/graphics/characters/"; private static final String FACES_PATH = "/client/datafiles/graphics/characters/faces/"; /** * Initializes the sprite. * @param className Name of the choosed class. */ public Sprite(String className){ BufferedImage spriteSheet; this.className = className.toLowerCase(); int spriteWidth = Integer.parseInt(CLASSES_SPRITE.getString(this.className + ".width")); int spriteHeight = Integer.parseInt(CLASSES_SPRITE.getString(this.className + ".height")); String spriteName = CLASSES_SPRITE.getString(this.className + ".sprite"); try { String spriteURL = SPRITES_PATH.concat(spriteName); spriteSheet = ImageIO.read(getClass().getResource(spriteURL)); this.sprites = SpriteSheetDivider.getSpriteDivided(spriteSheet, spriteWidth, spriteHeight); spriteURL = FACES_PATH.concat(spriteName); face = new ImageIcon(ImageIO.read(getClass().getResource(spriteURL))); } catch (IOException ex) { throw new RuntimeException(ex); } } /** * Returns the selected sprite. * @param spriteIndex the sprite index to be returned. * @return a BufferedImage containing the selected sprite. */ public BufferedImage getSprite(int spriteIndex) { return sprites[spriteIndex]; }
Basicamente, a classe sprite pega uma SpriteSheet e a divide em 16 sprites, considerando que há esse número de sprites na SpriteSheet. O método getSprite() retorna uma sprite das 16. Voltando para a classe Player, possuo listeners que movem o personagemd, e métodos que deveriam animar o mesmo, assim:
@Override public void keyPressed(KeyEvent e) { int cod = e.getKeyCode(); if (cod == KeyEvent.VK_W) { animateUpSprite(); up = true; down = false; right = false; left = false; vY = -SPEED; } if (cod == KeyEvent.VK_A) { animateLeftSprite(); up = false; down = false; right = false; left = true; vX = -SPEED; } if (cod == KeyEvent.VK_S) { animateDownSprite(); up = false; down = true; right = false; left = false; vY = SPEED; } if (cod == KeyEvent.VK_D) { animateRightSprite(); up = false; down = false; right = true; left = false; vX = SPEED; } } @Override public void keyReleased(KeyEvent e) { int cod = e.getKeyCode(); if (cod == KeyEvent.VK_W) { desanimate(); vY = 0; } if (cod == KeyEvent.VK_A) { desanimate(); vX = 0; } if (cod == KeyEvent.VK_S) { desanimate(); vY = 0; } if (cod == KeyEvent.VK_D) { desanimate(); vX = 0; } }
Os métodos animate****Sprite() nada fazem além de mudar a variável currentSprite com o método getSprite(), e o desanimate fazem a mesma coisa.
O Player é inserido dentro de um GameLoop, que o atualiza e o renderiza 60 vezes por segundo.
Bem, agora que o código foi explicado, a minha primeira dúvida é o seguinte:
Como eu animo o meu personagem com esses recursos?
Eu já tentei um bocado de coisas, até multithreading para animá-lo, mas nada deu certo até agora.
Lucas
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)