Animando Sprites apartir de Eventos do Teclado

Ola pessoal esta é minha primeira postagem no forum, e espero a juda de voces.

Estou tentando movimentar o personagem(pulo, correr, andar, atirar, etc) sendo que a cada movimento possui uma animação de cerca de 4 a 6 SPRITES pintar.

Minha duvida no momento é a seguinte, como faço para pintar na tela todas as imagem da respectiva animação, apenas com um pressionamento no teclado?

eis minhas classes:

GAME.java

[code]import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
public class Game extends JFrame {

BufferedImage backBuffer;	
int FPS = 25;
int janelaW = 500;
int janelaH = 500;
    Graphics bbg, g;
   	//ISSO JÁ ESTAVA AQUI

Manipulador listener = new Manipulador();
//ESSA É A NOSSA SPRITE!
//VERIFIQUE AGORA O MÉTODO inicializar()
//LÁ VAMOS INICIAR AS IMAGENS QUE VAMOS USAR NESSA SPRITE!
//DEPOIS VERIFIQUE O MÉTODO desenharGraficos()
//VEJA QUE ESSA SPRITE TEM 3 CENAS!!!
public Sprite vilao = new Sprite(3, 200, 330);

ImageIcon fundo = new ImageIcon("src/tutorial08/fundo.png");

public void atualizar() {

}

public void desenharGraficos() {
	//ISSO TAMBÉM JÁ ESTAVA AQUI...
	//AQUI VAMOS MANDAR DESENHAR ALGUNS IMAGENS NA TELA
            g = getGraphics();
            bbg = backBuffer.getGraphics();
	bbg.drawImage(fundo.getImage(),0,0,this);//QUI DESENHAMOS O FUNDO
	//AS DIMENSÕES ORIGINAIS DO FUNDO SÃO: 500X500 QUE É O TAMANHO DA NOSSA TELA!
	
	//AQUI TO DESENHANDO A O NOSSO PERSONAGEM
	//VEJA QUE NOSSO vilão tem tudo que agente precisa!
	//SUAS COORDENADAS, LARGURA, ALTURA, E AS IMAGENS!!!
           
	bbg.drawImage(vilao.cenas[vilao.cena].getImage(), vilao.x, vilao.y, this);
            
	
	//==================================================================================	
	g.drawImage(backBuffer, 0, 0, this);//OBS: ISSO DEVE FICAR SEMPRE NO FINAL!
}

public void inicializar() {
	setTitle("Titulo do Jogo!");
	setSize(janelaW, janelaH);
	setResizable(false);
	setDefaultCloseOperation(EXIT_ON_CLOSE);
	setLayout(null);
	setVisible(true);
	backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);
            
            
	addKeyListener(listener);
           
	//QUI CARREGAMOS AS IMAGENS DE NOSSA SPIRTE!!!!!!!
	//PARA O VETOR DE ImageIcon[] !!!
	vilao.cenas[0] = new ImageIcon("src/imagem1.gif");
            vilao.cenas[1] = new ImageIcon("src/imagem2.gif");
	vilao.cenas[2] = new ImageIcon("src/imagem3.gif");
           
	vilao.largura = 100;	//LARGURA DO VILÃO
	vilao.altura =  200;	//ALTURA DO VILÃO , mas não vou usar isso agora..
	
}

public void run() {
	inicializar();
	while (true) {
		atualizar();
		
			try {
				Thread.sleep(1000/FPS);
			} catch (Exception e) {
				System.out.println("Thread interrompida!");
			}
	}
}
public static void main(String[] args) {
	Game game = new Game();
	game.run();
}

class Manipulador implements KeyListener{

@Override
public void keyTyped(KeyEvent e) {
    
}

@Override
public void keyPressed(KeyEvent e) {
     if(e.getKeyCode() == KeyEvent.VK_0) {
        for(int i =0; i<3;++i){
         vilao.animar();
         desenharGraficos();
   }}
}

@Override
public void keyReleased(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_0){
        vilao.cena = 0;
    }
}

}

}

[/code]

SPRITE.java

[code]import javax.swing.ImageIcon;

public class Sprite{

ImageIcon cenas[];	//VETOR DE IMAGENS,
int x;					//AQUI É A COORDENADA X
int y;					//AQUI É A COORDENADA Y
int largura;			//LARGURA DA IMAGEM, CASO QUEIRA DEFINIR UMA
int altura;				//ALTURA DA IMAGEM, CASO QUEIRA DEFINIR UMA
int cena = 0;			//O INDICE DA CENA DA NOSSA SPRITE ANIMADA
int controlaVelocidade = 0;
int velocidade = 5;

//ISSO AQUI EM BAIXO PRA QUEM NÃO SABE É UM CONSTRUTOR
//QUANDO FORMOS CRIAR UM OBJETO A PARTIR DESSA CLASSE
//TEREMOS QUE: INFORMAR O NÚMERO DE CENAS, E A SUA COORDENADA INICIAL
//+ OU - ASSIM: new Sprite(3, 200, 300);

public Sprite(int numeroDeCenas, int x, int y){
	cenas = new ImageIcon[numeroDeCenas];
	this.x = x;
	this.y = y;
          
          
}

//ESSE MÉTODO VAI ALTERNAR AS IMAGENS QUE COMPÕES NOSSA SPRITE
//DEPENDENDO DO QUE VC PRETENDER FAZER, ESSE MÉTODO PODERIA
//SER MAIS COMPLEXO!
//TIPO: animarCorrer() animarChutar() animarPular()
//E ESSES MÉTODOS SERIAM CHAMADOS AO CLICAR EM ALGUMA TECLA!!!
//ESSA ANIMAÇÃO VAI FICAR MUITO RÁPIDA, PQ ELE MUDAR A IMAGEM DA CENA
//A CADA 1/30 milissegundos
public void animar(){
           
	cena += 1;
	if(cena == cenas.length){ cena = 0; }
}

}

[/code]

mt obrigado

Acho que antes de pensar em criar um personagem animado, você deveria compreender melhor como funciona o GameLoop e o objeto Graphics. Há vários e vários erros conceituais no seu código.

Dá uma lida nesse artigo:
http://www.pontov.com.br/site/java/47-javageral/92-conhecendo-o-jframe
E nos dessa série:
http://www.pontov.com.br/site/java/48-java2d

obrigado vou dar uma lida, mas voce tem como me indicar alguns tutoriais que falam sobre esta minha duvida?

Tem alguns em XNA, são bem similares ao que você vai fazer em Java:
http://kleberandrade.wordpress.com/2010/11/29/xna-animacao-de-sprites-parte-1/
http://kleberandrade.wordpress.com/2010/12/14/xna-animacao-de-sprites-parte-2/
http://kleberandrade.wordpress.com/2010/12/15/xna-animacao-de-sprites-parte-3/

Você vai gostar de ver esse também:
http://www.cokeandcode.com/info/tut2d.html

vou dar uma estudada nesses tutoriais, e trarei as duvidas para o forum.

Existe algum metodo em java que pegue uma imagem e divida-a em diversas partes iguais e coloque-as em array

Não. Mas você pode criar um usando a classe BufferedImage.

Veja um exemplo:

[code]

public BufferedImage createCompatibleImage(int w, int h, int transparency) {
	return GraphicsEnvironment.getLocalGraphicsEnvironment()
		.getDefaultScreenDevice().getDefaultConfiguration()
		.createCompatibleImage(w, h, transparency);
}

/**
 * Split the given image into several smaller equally sized parts. The parts
 * are numbered sequentially from left to right and top to down.
 * 
 * @param img The image to be splited.
 * @param columns Number of columns to split the original image.
 * @param lines Number of lines to split the original image
 * @return An array, containing the splited result.
 * @throws IllegalArgumentException If the image is null or if columns or
 *             lines are equal or less than zero.
 */
public BufferedImage[] splitImage(BufferedImage img, int columns, int lines)
{
	if (img == null)
		throw new IllegalArgumentException(
				&quot;You must provide an image to split!&quot;);

	if (columns &lt; 0 || lines &lt; 0)
		throw new IllegalArgumentException(
				&quot;Columns or lines must be greater than zero!&quot;);

	if (columns == 1 && lines == 1)
		return new BufferedImage[]
		{ img };

	BufferedImage[] result = new BufferedImage[columns * lines];

	int width = img.getWidth() / columns;
	int height = img.getHeight() / lines;

	int count = 0;
	for (int col = 0; col &lt; columns; col++)
		for (int lin = 0; lin &lt; lines; lin++)
		{
			BufferedImage copy = createCompatibleImage(
					width, height, img.getTransparency());
			Graphics2D surface = copy.createGraphics();
			surface.drawImage(img, 0, 0, width, height, width * col, height
					* lin, (width * col) + width, (height * lin) + height,
					null);
			surface.dispose();
			result[count++] = copy;
		}

	return result;
}[/code]

vlw!!

VinyGodoy Nesses ultimos dias andei estudando a material que voce me indicou, sendo que aprendi alguns conceitos importantes para jogos e animações, porem ainda não consegui achar uma maneira de pintar uma sequencia desprites com apenas um evento de teclado?

Poderia me dar uma sugestão logica de como fazer isso?

Bem, no seu KeyListener você deverá informar ao ator em questão que ele deve tocar determinada sequencia. Então, basta trocar o estado do ator e reproduzir a animação desejada.

Por exemplo, o jogador pressiona a seta da direita, para informar ao ator que ele deve andar.

Isso irá gerar um evento no listener, que encaminha isso para o personagem do jogador. O personagem passa para o estado “andando” e aí você reproduz a animação e faz com que o x dele mude.

Agora, não existe no java um comando do tipo “toque tal animação”. Você deve passar quadro-a-quadro do seu BufferedImage. Isso pode ser feito com um List de imagens. Controle o tempo que um quadro está na tela e, quando for maior do que o tempo entre quadros desejado, passe para a próxima imagem.

Ou, se quiser ter menos trabalho para fazer um game, use uma linguagem/biblioteca mais apropriada para isso, como a Cocos-X, a Flixel ou o XNA.

VinyGodoy se tiver tempo, poderia me dar um exemplo de codigo em que se aplica esta metodologia, iria me ajudar muito…desde ja obrigado

Cara esqueça java para isto… Você ta querendo cortar uma arvore com um canivete. C# com XNA 4 é bem mais apropriado para isto… Isto de fazer sprites animados com XNA é baba.

cara o problema, eu que tenho que fazer um jogo 2d em java, como trabalho da faculdade, é claro que poderei usar tecnologias mais adequadas, mas foi exigido o java, então é com java que vou fazer, entende?

Nesse caso, comece a estudar:
http://fivedots.coe.psu.ac.th/~ad/jg/
http://www.brackeen.com/javagamebook/

Recomendo em especial o segundo livro.

É que não é trivial montar um exemplo disso. Eu teria que praticamente implementar um bom pedaço de um game, só para te mostrar como faz. Se você ainda está escorregando em conceitos muito simples, como o de desenhar parte de um BufferedImage, ainda precisa estudar muito para tentar fazer algo mais avançado.

Se você ainda quiser usar Java e simplificar um bocado o processo, pode tentar usar uma API como a Slick2D ou, no caso do Android, a AndEngine.