-
Notifications
You must be signed in to change notification settings - Fork 0
Tutorial JPlay 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?
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.
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);
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.
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();
}
}
}
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();
}
}
}
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);
}
}
}
}
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();
}
}
}
//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.
//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
FGA - The Endless Game