• 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:
    MegaMan

    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