Animação
Animações é um dos quesitos muito importantes em jogos, você não acha?
Para isso o JPlay tem uma classe específica para lidar com animações.
Essa classe se chama Animation. Bem sugestivo o nome não?
1 - Como criar uma animação?
Para criar uma animação precisamos de uma imagem e que ela contenha alguns frames. O número de frames é uma escolha sua.
Um frame é um pedaço da imagem responsável por um movimento da animação.
Exemplo: temos a imagem abaixo:
Repare que existem quatro desenhos do Megaman em uma única imagem. Sendo que cada um desses desenhos pode ser chamado de frame. Logo, essa imagem possui 4 frames.
O conceito de frame é muito importante em animações, tenha-o sempre em mente.
2 - Instanciando a classe Animation.
A classe a Animation tem três construtores.
//Passa-se o nome da imagem que será usada e a mesma terá somente um frame. Animation(String fileName); //Passa-se o nome da imagem que será usada e o númeo de frames da imagem. Animation(String fileName, int numberFrames); //Passa-se o nome da imagem que será usada, o númeo de frames da imagem e o último //parâmetro serve para dizer se a animação ficará em loop ou não. Animation(String fileName, int numberFrames, boolean loop);Para criar um objeto dessa classe procedemos do seguinte modo:
String nomeDaImagem = "animacao01.png"; int numeroDeFrames = 4; Animation animacao = new Animation(nomeDaImagem, numeroDeFrames);
3 - Setando o tempo entre a mudança de frames.
Em animações os frames devem mudar depois de um certo tempo. Para informar o tempo de mudança entre os frames ou o tempo em que cada frame será apresentado na tela, usamos o método:
public void setTotalDuration(long time);
Exemplo:
int numeroDeFrames = 4; int tempoTotal = 1000; //Tempo em milisegundos. String nomeDaImagem = "robo.png"; Animacao a = Animacao(nomeDaImagem, numeroDeFrames); animacao.setTotalDuration(tempoTotal);
Se temos 4 frames e tempo total é 1000 milisegundos, então, cada frame será mostrado na tela durante 1000 / 4 = 250 milisegundos,
Obs.: Lembre-se que 1 segundo é igual a 1000 milissegundos, 1s = 1000ms e que sempre deve-se setar o tempo total de duração da animação.
4 - Executando a animação.
Para fazer a animação ser executada o método abaixo que é responsável pela troca dos frames:
public void update();
Até agora temos:
Animation animacao = new Animation( "animacao01.png ", 4);
animação.setTotalDuration(125);
animacao.update();
Estamos prontos para criar a nossa primeira animação.
Exemplo: Executando uma animação.
package animation001; import jplay.Animation; import jplay.GameImage; import jplay.Window; /** * @author Gefersom Cardoso Lima * Federal Fluminense University - UFF - Brazil * Computer Science */ public class Animation001 { /** * @param args the command line arguments */ public static void main(String[] args) { Window janela = new Window(800,600); GameImage fundo = new GameImage("fundo.png"); Animation animacao = new Animation("animacao.png", 4); animacao.setTotalDuration(500); while(true) { fundo.draw(); animacao.draw(); janela.update(); animacao.update(); } } }
5 - Animando um subconjunto de frames
Para animarmos um subconjunto de frames podemos usar os métodos:
//O número do frame inicial e do frame final devem ser passados como parâmetro. void setSequence(int initialFrame, int finalFrame); //Nesse tem-se a liberdade de escolher se o subconjunto escolhido será executado em loop. void setSequence(int initialFrame, int finalFrame, booleanloop); //Nesse podemos escolher o tempo total de execução do subconjunto. void setSequenceTime(int initialFrame, int finalFrame, long time); //Este método faz a junção do segundo e do terceiro método citados acima. void setSequenceTime(int initialFrame, int finalFrame, boolean loop, long time);Se tivermos uma imagem com 28 frames e fizessemos animacao.setSequence(0,13), os frames a serem utilizados na animação serão os 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13.
Já ser fizermos animacao.setSequence(14, 27) os frames a serem utilizados na animação serão os 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 25, 26, 27.
Exemplo: Executando um subconjunto de frames.
package animation002; import jplay.Animation; import jplay.GameImage; import jplay.Window; /** * @author Gefersom Cardoso Lima * Federal Fluminense University - UFF - Brazil * Computer Science */ public class Animation002 { /** * @param args the command line arguments */ public static void main(String[] args) { Window janela = new Window(800,600); GameImage fundo = new GameImage("fundo.png"); GameImage megaMan = new GameImage("animacaoMenor.png"); Animation animacao = new Animation("animacao.png", 28); animacao.setTotalDuration(2000); animacao.setSequence(0, 13); animacao.y = 250; animacao.x = 200; megaMan.y = 150; while(true) { fundo.draw(); megaMan.draw(); animacao.draw(); janela.update(); animacao.update(); } } }
Exemplo: Acelerar ou desacelerar a execução dos frames.
package Animation003; import jplay.Animation; import jplay.GameImage; import jplay.Keyboard; import jplay.Window; import java.awt.Color; /** * @author Gefersom Cardoso Lima * Federal Fluminense University - UFF - Brazil * Computer Science */ //Accelerate or decelerate a frameset. public class Animation003 { /** * @param args the command line arguments */ public static void main(String[] args) { Window janela = new Window(800,600); GameImage fundo = new GameImage("fundo.png"); Animation animacao = new Animation("inuyasha.png", 13); Keyboard teclado = janela.getKeyboard(); animacao.setTotalDuration(1000000); animacao.y = 250; animacao.x = 200; while(true) { fundo.draw(); animacao.draw(); janela.drawText("Press Space Bar to accelerate or Enter to decelerate.", 200, 210, Color.yellow); janela.update(); if (teclado.keyDown(Keyboard.ENTER_KEY)) { animacao.setSequenceTime(0, 12, 6000); } else { if (teclado.keyDown(Keyboard.SPACE_KEY)) animacao.setSequenceTime(0, 12, 1500); } animacao.update(); } } }
6 - Trocando os frames manualmente.
Para setar qual o frame a ser desenhado usamos o método:
//Seta o frame que será desenhado no próximo loop. public void setCurrFrame(int frame);
Obs.: Se estiver usando este método não é necessário setar o tempo de duracação da animação.
Exemplo: Trocando os frames manualmente.
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package Animation004; import jplay.Animation; import jplay.GameImage; import jplay.Keyboard; import jplay.Window; /** * @author Gefersom Cardoso Lima * Federal Fluminense University - UFF - Brazil * Computer Science */ //It sets the frame to be drawn. public class Animation004 { /** * @param args the command line arguments */ public static void main(String[] args) { Window janela = new Window(800,600); GameImage fundo = new GameImage("paisagem.png"); Animation animacao = new Animation("navio.png", 2); Keyboard teclado = janela.getKeyboard(); animacao.y = 250; animacao.x = 200; while(true) { fundo.draw(); animacao.draw(); janela.update(); if (teclado.keyDown(Keyboard.LEFT_KEY)) animacao.setCurrFrame(0); else { if (teclado.keyDown(Keyboard.RIGHT_KEY)) animacao.setCurrFrame(1); } } } }
7 - Setando um tempo para cada frame.
Em certas animações certa parte da animação deve ser executada mais rápida ou mais lenta do que outra parte. Para isso existe o seguinte método:
public void setDuration(int frame, long time);
Os parâmetros são: o número do frame e o valor do tempo em que o frame deve ser mostrado.
Exemplo: Frames com tempo de troca diferentes.
package Animation005; import JPlay.Animation; import JPlay.GameImage; import JPlay.Keyboard; import JPlay.Window; /** * @author Gefersom Cardoso Lima * Federal Fluminense University - UFF - Brazil * Computer Science */ //Frames have different times of change public class Animation005 { /** * @param args the command line arguments */ public static void main(String[] args) { Window janela = new Window(800,600); GameImage fundo = new GameImage("paisagem.png"); Animation animacao = new Animation("fotos.png", 8); animacao.setDuration(0, 2000); // Frame 0 será mostrado por 2000 milissegundos. animacao.setDuration(1, 1800); // Frame 1 será mostrado por 1800 milissegundos. animacao.setDuration(2, 1600); // Frame 2 será mostrado por 1600 milissegundos. animacao.setDuration(3, 1400); // Frame 3 será mostrado por 1400 milissegundos. animacao.setDuration(4, 1200); // Frame 4 será mostrado por 1200 milissegundos. animacao.setDuration(5, 1000); // Frame 5 será mostrado por 1000 milissegundos. animacao.setDuration(6, 800); // Frame 6 será mostrado por 800 milissegundos. animacao.setDuration(7, 600); // Frame 7 será mostrado por 600 milissegundos. animacao.loop(false); while(true) { fundo.draw(); animacao.draw(); janela.update(); animacao.update(); } } }
8 - Escondendo a animação.
//Pára de desenhar a imagem na tela do computador. public void hide(); //Volta a desenhar a imagem na tela do computador. public void unhide();
Obs.: Mesmo que animação não seja mostrada na tela, se o método update() estiver sendo chamado os frames continuarão a ser trocados.
9 - Outros métodos.
//Retorna true se a animação não está pausada ou sofreu um stop, caso contrário, retorna falso. public boolean isPlaying(); //Retorna o número do frame corrente a ser desenhado. public int getCurrFrame(); //Retorna true se a animação será repetida, caso contrário, false. public boolean isLooping(); //Retorna o tempo em milissegundos que o frame será mostrado na tela. public long getDuration(int frame); //Pára de executar a animação e retorna ao primeiro frame. public void stop(); //Pausa a execução da animação. public void pause(); //Seta o frame que será usado para começar a animação. public void setInitialFrame(int frame); //Retorna o número do frame usado para começar a animação. public int getInitalFrame(); //Seta o número do frame que será apresentado por último. public void setFinalFrame(int frame); //Retorna o número do frame final que é usado na animação. public int getFinalFrame(); //Retorna o tempo total de execução do conjunto de frames setados. public long geTotalDuration(); //Se vc quiser que a animação seja executada em loop passe o valor 'true', //caso contrário, passe o valor 'false'. public void loop(boolean value);
A classe Animation não possui métodos que façam a animação se mover pela tela. Para isso você pode usar as variáveis públicas 'x' e 'y'.
UFF - Universidade Federal Fluminense - Institudo de Computação - Ciência da Computação