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).
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.
(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