• Sprite

    Sprites diferentemente de animações possuem métodos que podem fazer a imagem se locomover pela tela.

    A classe Sprite extende a classe Animation, isso quer dizer que tudo que fizemos na parte de animação também pode ser aplicado aos Sprites.

    1 - Criando um Sprite

    A classe Sprite possui dois construtores:

    					//Basta passar o nome da imagem a ser exibida, o número de frames automaticamente será 1
    					public Sprite(String fileName);
    					
    					//É passado o nome da imagem que será exibida e o número de frames que ela contém.
    					public Sprite(String fileName, int numFrames);
    				

    Exemplo: Criando um sprite

    					/*
    					 * To change this template, choose Tools | Templates
    					 * and open the template in the editor.
    					 */
    
    					package Sprite001;
    
    					import JPlay.GameImage;
    					import JPlay.Sprite;
    					import JPlay.Window;
    
    					/**
    					 * @author Gefersom Cardoso Lima
    					 * Federal Fluminense University
    					 * Computer Science
    					 */
    
    					//Creates a sprite.
    					public class Sprite001
    					{
    						/**
    						 * @param args the command line arguments
    						 */
    						public static void main(String[] args)
    						{
    								Window janela = new Window(800,600);
    								GameImage fundo = new GameImage("fundo.png");
    								Sprite inuyasha = new Sprite("inuyasha.png", 13);
    
    								inuyasha.y = 250;
    								inuyasha.x = 200;
    
    								inuyasha.setSequence(0, 2);
    								inuyasha.setTotalDuration(1200);
    								while(true)
    								{
    									fundo.draw();
    									inuyasha.draw();
    									janela.display();
    
    									inuyasha.
    									inuyasha.update();
    								}
    						}
    
    					}
    
    				


    2 - Movimentando um sprite - Somente pelo eixo X

    Para começar vamos aprender como fazer a movimentação do sprite usando as coordenadas (x,y) e as teclas direcionais.

    Para fazer o sprite se movimentar no eixo X temos que modificar o valor da variável x."

    Exemplo:
    a posição de um sprite no eixo x é 100 (sprite.x = 100)
    para fazer o sprite se movimentar para o valor 99 devemos decrementar o valor de x: sprite.x--;
    já para o valor movimentar o sprite para a posição 101 devemos incrementar o valor de x: sprite.x++;

    O significado do -- e do ++ para a movimentação do sprite no eixo X:

    '--' : faz o sprite se deslocar 1 pixel para a esquerda.
    '++' : faz o sprite se deslocar 1 pixel para a direita.

    O fato de o sprite se movimentar para a direita ou para a esquerda se relaciona ao modo de como o java manipula as coordenadas de tela.

    Tomemos uma tela com 798 pixels de largura, no java a configuração da tela será a seguinte:

    O canto esquerdo se inicia com o valor de coordenada 0 (x = 0).
    O canto direito possui o valor 800 (x = 800).

    Desenho da coordenada X

    Exemplo : Movendo um sprite pelo eixo X

    					package Sprite002;
    
    					import JPlay.Keyboard;
    					import JPlay.Sprite;
    					import JPlay.Window;
    					import java.awt.Color;
    					import java.awt.Event;
    					import java.awt.event.KeyEvent;
    
    					/**
    					 * @author Gefersom Cardoso Lima
    					 * Federal Fluminense University
    					 * Computer Science
    					 */
    
    					public class Main
    					{
    						//Move the sprite by the x-axis
    						public static void main(String[] args)
    						{
    							Window janela = new Window(800,600);
    							Keyboard teclado = janela.getKeyboard();
    							teclado.addKey(KeyEvent.VK_N, Keyboard.DETECT_EVERY_PRESS);
    
    							Sprite sprite = new Sprite("boia.png");
    							sprite.y = 250;
    							sprite.x = 350;
    
    							boolean executando = true;
    							while(executando)
    							{
    									janela.clear(Color.black);
    									sprite.draw();
    									janela.display();
    
    									if(teclado.keyDown(Keyboard.LEFT_KEY))
    										sprite.x -= 3;
    									else
    										if( teclado.keyDown(Keyboard.RIGHT_KEY))
    											sprite.x += 3;
    
    									janela.delay(10);
    
    									if (teclado.keyDown(KeyEvent.VK_N) == true)
    										executando = false;
    
    							}
    							janela.exit();
    						}
    					}
    
    				


    3 - Movimentando um sprite - Somente pelo eixo Y

    Para fazer o sprite se movimentar no eixo Y temos que modificar o valor da variável y.

    Barra do eixo Y

    (y = 0)

    Exemplo:
    A posição de um sprite no eixo y é 347 (sprite.y = 347).
    Para fazer o sprite se movimentar para o valor 340 devemos decrementar o valor de y:
    sprite.y -= 7 .

    Já para o valor movimentar o sprite para a posição 154 devemos incrementar o valor de y:
    sprite.y += 7;

    O significado do '-7' e do '+7' para a movimentação do sprite no eixo Y:

    '-7' : faz o sprite se deslocar 7 pixels para a cima.
    '+7' : faz o sprite deslocar 7 pixels para baixo.

    Tomemos uma tela com 325 pixels de largura, no java a configuração da tela será a seguinte:

    O canto esquerdo se inicia com o valor de coordenada 0 (y = 0).
    O canto direito possui o valor 355 (y = 355).

    (y = 355)


    Exemplo : Movendo um sprite pelo eixo Y.

    					package Sprite004;
    
    					import JPlay.GameImage;
    					import JPlay.Keyboard;
    					import JPlay.Sprite;
    					import JPlay.Window;
    
    					/**
    					 * @author Gefersom Cardoso Lima
    					 * Universidade Federal Fluminense - UFF - Brasil - 2010
    					 * Ciência da Computação
    					 */
    					public class Sprite004
    					{
    						//Movendo o sprite no eixo Y
    						public static void main(String[] args)
    						{
    							Window janela = new Window(800,600);
    							Keyboard keyboard = janela.getKeyboard();
    
    							GameImage backGround = new GameImage("mar.png");
    
    							Sprite sprite = new Sprite("boia.png");
    							sprite.y = 450;
    							sprite.x = 300;
    
    							while(true)
    							{
    									backGround.draw();
    									sprite.draw();
    									janela.display();
    
    									if( keyboard.keyDown(Keyboard.UP_KEY) )
    										sprite.y -= 7;
    									else
    										if( keyboard.keyDown(Keyboard.DOWN_KEY) )
    											sprite.y += 7;
    
    									janela.delay(50);
    							}
    						}
    					}				
    				


    4 - Movimentando um sprite pela tela dentro de uma área delimitada.

    					package Sprite006;
    
    
    					import JPlay.GameImage;
    					import JPlay.Keyboard;
    					import JPlay.Sprite;
    					import JPlay.Window;
    
    					/**
    					 * @author Gefersom Cardoso Lima
    					 * Universidade Federal Fluminense - UFF - Brasil - 2010
    					 * Ciência da Computação
    					 */
    					public class Sprite006
    					{
    						//Delimitando a área de movimento do sprite no eixo X e no eixo Y
    						public static void main(String[] args)
    						{
    							Window janela = new Window(800,600);
    							Keyboard keyboard = janela.getKeyboard();
    
    							GameImage backGround = new GameImage("mar.png");
    
    							Sprite sprite = new Sprite("boia.png");
    							sprite.y = 400;
    							sprite.x = 300;
    
    							while(true)
    							{
    									backGround.draw();
    									sprite.draw();
    									janela.display();
    
    									//Move no eixo Y
    									if(keyboard.keyDown(Keyboard.UP_KEY) && sprite.y > 0)
    										sprite.y--;
    									else
    										if( keyboard.keyDown(Keyboard.DOWN_KEY) 
    										&& sprite.y  + sprite.height < janela.getHeight())
    										{
    											sprite.y++;
    										}
    
    									//Move no eixo X
    									if(keyboard.keyDown(Keyboard.LEFT_KEY) && sprite.x > 100)
    										sprite.x--;
    									else
    										if( keyboard.keyDown(Keyboard.RIGHT_KEY) && sprite.x  + sprite.width < 650)
    											sprite.x++;
    							}
    						}
    					}					
    				

    5 - Movimentando um sprite usando métodos da classe Sprite

    Para a movimentação de um sprite os seguintes métodos podem ser usados:

     
    					//Move o Sprite na tela somente no eixo x, deve-se passar a velocidade de locomoção do sprite.
    					public void moveX(double  velocity);
    
    					//Move o Sprite na tela somente no eixo y, deve-se passar a velocidade de locomoção do sprite.
    					public void moveY(double velocity);
    				

    Exemplo: Movendo o Sprite no eixo X com velocidade 10 e no eixo Y com velocidade = 6.

     
    					package Sprite007;
    
    					import JPlay.GameImage;
    					import JPlay.Sprite;
    					import JPlay.Window;
    
    					/**
    					 * @author Gefersom Cardoso Lima
    					 * Universidade Federal Fluminense - UFF - Brasil - 2010
    					 * Ciência da Computação
    					 */
    					public class Sprite007
    					{
    						//Movendo um sprite usando os método moveY(double) e moveX(double)
    						public static void main(String[] args)
    						{
    							Window janela = new Window(800,600);
    
    							GameImage backGround = new GameImage("mar.png");
    
    							Sprite sprite = new Sprite("boia.png");
    							sprite.y = 400;
    							sprite.x = 300;
    
    							while(true)
    							{
    									backGround.draw();
    									sprite.draw();
    									janela.display();
    
    									//Move no eixo Y
    									sprite.moveY(6);//velocidade = 6
    
    									//Move no eixo X
    									sprite.moveX(10);//velocidade = 10
    							}
    						}
    					}
    				

    Obs.: as teclas padrões para fazer o Sprite se movimentar são as setas direcionais.

    Para fazer com que o Sprite use outras teclas para se movimentar use os seguintes métodos:

     
    					//passe os códigos das teclas a serem usadas para locomover o sprite para a esquerda ou para a direita.
    					public void moveX(int leftKey, int rightKey);
    					
    					//Passe os códigos das teclas a serem usadas para locomover o sprite para cima ou para baixo.
    					public void moveY(int upKey, int downKey);
    				

    Exemplo: Movendo o Sprite no eixo Y com velocidade 5 e usando as setas para direita e para esquerda.

     
    					package Sprite008;
    
    					import JPlay.GameImage;
    					import JPlay.Keyboard;
    					import JPlay.Sprite;
    					import JPlay.Window;
    
    					/**
    					 * @author Gefersom Cardoso Lima
    					 * Federal Fluminense University
    					 * Computer Science
    					 */
    					public class Sprite008
    					{  
    						//Moves the sprite by y-axis using direction buttons left and right.
    						public static void main(String[] args)
    						{
    							Window janela = new Window(800,600);
    							GameImage backGround = new GameImage("mar.png");
    
    							Sprite sprite = new Sprite("boia.png");
    							sprite.y = 400;
    							sprite.x = 300;
    
    							while(true)
    							{
    									backGround.draw();
    									sprite.draw();
    									janela.display();
    
    									//Keyboard.LEFT_KEY moves up
    									//Keyboard.RIGHT_KEY moves down
    									sprite.moveY(Keyboard.LEFT_KEY, Keyboard.RIGHT_KEY, 1);//velocity = 1
    							}
    						}
    					}
    			
    				

    Obs.: Todos os métodos apresentados não permitem que o sprite se locomova para fora da janela.


    4 - Fazendo o Sprite pular

    Antes de fazer o sprite pular, devemos informar o valor da coordenada Y que servirá como chão, para isso use o método abaixo:

    					public void setFloor(int floor);
    				

    Para fazer com que o sprite pule use o seguinte método:

    					//Esse método usa a tecla SPACE para fazer o sprite pular.
    					public void jump();
    				

    Exemplo:
    sprite.setFloor(500);
    sprite.jump(); o sprite irá pular e ao cair não irá ultrapassar a coordenada y = 500;


    Para controlar a velocidade e a altura do pulo use o método:

    					//Onde o parâmetro a ser passado é a velocidade inicial com que o sprite irá se deslocar do chão.
    					public void setJumpVelocity(double velocity);
    				

    Para saber se o sprite ainda está executando o pulo use o método:

    					//Retorna true se o sprite não retornou ao chão, caso contrário, retorna false.
    					public boolean isJumping();
    				

    Exemplo: Faz um sprite pular e seta o seu chão.

    					package Sprite009;
    
    					import JPlay.GameImage;
    					import JPlay.Keyboard;
    					import JPlay.Sprite;
    					import JPlay.Window;
    					import java.awt.event.KeyEvent;
    
    					/**
    					 * @author Gefersom Cardoso Lima
    					 * Federal Fluminense University
    					 * Computer Science
    					 */
    					 
    					public class Sprite009
    					{
    						//Makes the sprite to jump.
    						public static void main(String[] args)
    						{
    							Window janela = new Window(800,600);
    							GameImage backGround = new GameImage("cena.png");
    
    							Sprite sprite = new Sprite("mario.png");
    							sprite.y = 440 - sprite.height;
    							sprite.x = 250;
    							sprite.setFloor(440);
    
    							while(true)
    							{
    									backGround.draw();
    									sprite.draw();
    									janela.display();
    
    									sprite.jump();
    									janela.delay(10);
    							}
    						}
    					}
    
    				


    5 - Mudando a tecla usada no pulo

    Por padrão a tecla a ser usada para fazer o boneco pular é a barra de espaço, caso você queira mudar essa tecla use o seguinte método:

    				
    					//KeyCode é o código da tecla que servirá para acionar o pulo.
    					public void jump(int keyCode);
    				

    Exemplo: Faz um sprite pular com a seta para cima e determina qual o seu chão

    				package Sprite010;
    
    
    				import JPlay.GameImage;
    				import JPlay.Keyboard;
    				import JPlay.Sprite;
    				import JPlay.Window;
    
    				/**
    				 * @author Gefersom Cardoso Lima
    				 * Federal Fluminense University
    				 * Computer Science
    				 */
    				 
    				public class Sprite010
    				{
    					//Make the sprite jump with the directional arrow up and set up its floor.
    					public static void main(String[] args)
    					{
    						Window janela = new Window(800,600);
    						GameImage backGround = new GameImage("cena.png");
    
    						Sprite sprite = new Sprite("mario.png");
    						sprite.y = 440 - sprite.height;
    						sprite.x = 250;
    						sprite.setFloor(440);
    
    						while(true)
    						{
    								backGround.draw();
    								sprite.draw();
    								janela.display();
    
    								sprite.jump(Keyboard.UP_KEY);
    								janela.delay(10);
    						}
    					}
    				}
    
    				


    9.6 - Simulando gravidade

    Para simular o efeito de gravidade use o método:

    					public void fall();
    				

    Para saber se o sprite tocou o chão use o seguinte método:

    					//Retorna true se o chão já foi atingido pelo sprite, ao contrário, retorna false.
    					public boolean isOnFloor();
    				

    Assim como no pulo, o valor da coordenada Y que servirá como chão deve ser setada antes de usar o método fall();

    Para mudar o valor da gravidade use o método:

    					public void setGravity(double gravity).
    				

    Exemplo: Simulando o efeito de gravidade.

    										/*
    					 * To change this template, choose Tools | Templates
    					 * and open the template in the editor.
    					 */
    
    					package Sprite011;
    
    
    					import JPlay.GameImage;
    					import JPlay.Sprite;
    					import JPlay.Window;
    
    					/**
    					 * @author Gefersom Cardoso Lima
    					 * Federal Fluminense University
    					 * Computer Science
    					 */
    					 
    					public class Sprite011
    					{
    						//Simulates the effect of gravity.
    						public static void main(String[] args)
    						{
    							Window janela = new Window(800,600);
    							GameImage backGround = new GameImage("cena.png");
    
    							Sprite sprite = new Sprite("mario.png");
    							sprite.y = 0;
    							sprite.x = 250;
    							sprite.setGravity(1);
    							sprite.setFloor(568);
    
    							while(true)
    							{
    									backGround.draw();
    									sprite.draw();
    									janela.display();
    
    									sprite.fall();
    									janela.delay(10);
    							}
    						}
    					}
    
    				

    9.7 - Movendo o sprite de um ponto a outro.

    Para mover o sprite de um ponto da tela até outro sem a intervenção do usuário use o método:

    					//Os valores passados como parâmetros são as coordenadas para onde se deseja que o sprite se desloque.
    					public void moveTo(double x, double y);
    				


    Exemplo: Movendo um sprite de um ponto a outro.

    					package Sprite012;
    
    					import JPlay.GameImage;
    					import JPlay.Sprite;
    					import JPlay.Window;
    
    					/**
    					 * @author Gefersom Cardoso Lima
    					 * Federal Fluminense University
    					 * Computer Science
    					 */
    					public class Sprite012
    					{
    						//Moves the sprite from one point to another.
    						public static void main(String[] args)
    						{
    							Window janela = new Window(800,565);
    							GameImage backGround = new GameImage("estrada.jpg");
    
    							Sprite sprite = new Sprite("bola.png");
    							sprite.y = 280;
    							sprite.x = 100;
    
    							backGround.draw();
    							sprite.draw();
    							janela.display();
    							janela.delay(2000);
    
    							while(true)
    							{
    									backGround.draw();
    									sprite.draw();
    									janela.display();
    									sprite.moveTo(490, sprite.y , 2);
    
    									if (sprite.x == 490)
    										sprite.moveTo(sprite.x, 35, 1);
    
    									janela.delay(4);
    							}
    						}
    					}
    				

    UFF - Universidade Federal Fluminense - Institudo de Computação - Ciência da Computação