Skip to content

Tutorial JPlay Animação

Lucas S edited this page Apr 28, 2018 · 1 revision

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

Clone this wiki locally