animaçao de sprite em j2me

Eu sou novo Aqui.
Eu estou tentando fazer um jogo em j2me
o Código Fonte “é”.

import java.io.IOException;
import javax.microedition.lcdui.Display; // Added
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.LayerManager;

public class exemplo2 extends MIDlet {

public exemplo2() {							// Added
	pongCanvas = new PongCanvas();				// Added
}								// Added

public void startApp() {
	Display display = Display.getDisplay(this);		// Added
	pongCanvas.start();					// Added
	display.setCurrent(pongCanvas);				// Added
}

public void pauseApp() {

}

public void destroyApp(boolean unconditional) {

}

private static PongCanvas pongCanvas;				// Added

}

class PongCanvas extends GameCanvas implements Runnable {
private int sleepTime = 30;
private Image imnaruto;
private Image imfundo;
private Sprite naruto;
private LayerManager lmgr;
private Sprite fundo;
private int narutox = getWidth()/2 ;
private int narutoy = getHeight()/2 + 78;
private int correndo [] = {1,0};
private int parado [] = {0};

public PongCanvas() {
	super(false);
}

public void run() {
	
	while(true) {
		
		updateScreen(getGraphics());
		
		try {
			Thread.sleep(sleepTime);
		} catch (Exception e) {
			
		}
	}
	
}

public void start() {
        try{
           imnaruto = Image.createImage("/naruto.PNG");
           imfundo= Image.createImage("/fundo.PNG");
           lmgr = new LayerManager();
        } catch (IOException ioex) {
                System.out.println(ioex);
        }
            arena();
            naruto();
        naruto.setFrameSequence(parado);
        Thread runner = new Thread(this);
	runner.start();
   }
   private void arena(){
    fundo = new Sprite(imfundo,2000,320);
    fundo.defineReferencePixel(120, 160);
    fundo.setRefPixelPosition(120, 160);
   }
  	
    private void naruto(){
        naruto = new Sprite(imnaruto,26,35);
        naruto.defineReferencePixel(13, 35/2);
        naruto.setRefPixelPosition(narutox, narutoy);
   }

private void updateScreen(Graphics g) {
            checkeys();
            lmgr.append(naruto);
            lmgr.append(fundo);
            naruto.nextFrame();
            lmgr.paint(g, 0,0);
	flushGraphics();
	}

private void checkeys(){
        int keyState = getKeyStates();
        if ((keyState & RIGHT_PRESSED) != 0){
              naruto.setFrameSequence(correndo);
        }
       if ((keyState & LEFT_PRESSED) != 0){
              naruto.setFrameSequence(correndo);
       }

    }

}

o fundo e o personagem carrega, ma quando pressiono ESQUERDO ou DIREITO meu pesonagem nao anima, ai quando eu solto a tecla ele anima
Onde eu errei?

Oi, mizael, beleza?

Não manjo muito de ME, então posso estar me confundindo.

Não consegui localizar no código onde estão sendo declaradas ou inicializadas as constantes RIGHT_PRESSED e LEFT_PRESSED. Pelo jeito, elas vêm de GameCanvas.

Você consegue debuggar o valor delas na execução do programa?

Acho que o naruto.nextFrame() tem que acontecer quando apertar DIREITA ou ESQUERDA ,E quando apertar DIREITA diminuir narutox,e ESQUERDA aumentar.
Ex:
se aperta left:
naruto.setFra…(correndo);//para esquerda
naruto.nextFrame();
narutox=Math.max(borda esquerda,narutox-1);

se aperta right:
naruto.setFra…(correndo);//para direita
naruto.nextFrame();
narutox=Math.min(borda direita,narutox+1);

mais ou menos assim.

Se apertar e segurar ele realmente não deve animar pois você está usando o evento pressed.
Ele só dispara o evento quando solta o botão mesmo.

Abraço
Vinícius

me desculpe AntonioDiego, mas nao entendi essas linhas do codigo;
narutox=Math.max(borda esquerda,narutox-1);
narutox=Math.min(borda direita,narutox+1);

o que significa esse "borda direita"e “borda esquerda”.

Se voce qr q seu boneco pare de andar quando colide com uma borda na direita ou na esquerda.
Troque bordaesquerda pelo x da bordaesquerda e bordadireita pelo x da bordadireita assim quando o narutox for igual ao da borda ele vai parar.
Mas se voce quer que ele fique andando pra sempre deixe assim:
se left:
narutox-=1;//o mesmo q narutox=narutox-1
se right:
narutox+=1.

O Math.max e o comparado do maior entre dois numeros ao contrario do Math.min q retorna o menor.
Voce tera q melhorar esse codigo pois acho que o naruto vai parar depois da borda.
E no GameCanvas nao importa se e pressed.
Se ainda tiver problemas e so falar q eu sei mais problemas q pode acontecer.

Vlw.

para mover meu boneco sem passar das bordas funcionou o seguinte codigo:
private void checkeys(){
int keyState = getKeyStates();
int posicao = naruto.getX();
if ((keyState & RIGHT_PRESSED) != 0){
naruto.setFrameSequence(correndo);
naruto.nextFrame();
if(posicao < getWidth()-25){
naruto.move(1, 0);
}
}
if ((keyState & LEFT_PRESSED) != 0){
naruto.setFrameSequence(correndo);
naruto.nextFrame();
if(posicao > 0){
naruto.move(-1, 0);
}
}
}
quando pressiono esquerdo ou direito ,o boneco anda normal sem passar do limite que determinei, muda o frame sequence para “correndo” ,so que nao anima,so anima quando eu solto a tecla.

Quatro coisinhas:
1.A imagem q contem as frames do naruto tem resolucao 52x35 ?.
2.Voce esta adicionando o sprite do naruto ao layermanager num metodo q e executado a cada 30 centisegundos.
3. Tenta usar ums flags assim:
private void checkeys(){
int keyState = getKeyStates ();
int flag=-1;
int posicao = naruto.getX();
if ((keyState & RIGHT_PRESSED) != 0){
if(flag!=0){ naruto.setFrameSequence (correndo); naruto.nextFrame();
if(posicao < getWidth()-25){ naruto.move(1, 0); }
flag=0;
}
}
else if ((keyState & LEFT_PRESSED) != 0){
if(flag!=1){ naruto.setFrameSequence (correndo); naruto.nextFrame();
if(posicao > 0){ naruto.move(-1, 0); }
flag=1;
}
}
}.
4.Eu ja fiz um jogo simples usando sprite e tiledlayer e tive o mesmo problema q voce.
Se quiser da uma olhada ta aqui va em Projetos Projava.

E mais:
Procura “Sprite MID Sun” no Google e vai encontrar um site da sun onde tem dois exemplos de jogo e muita coisa sobre sprite la.

Sei que o post tem um mês, mas pode ser que o amigo não tenha encontrado a resposta, ou que outras pessoas venham busca-la.

Saca só.

Este metodo é chamado dentro do seu loop infinito, ou seja, mesmo quando não houver evento o nextFrame() será chamado, fazendo com que o sprite seja animado.

private void updateScreen(Graphics g) { checkeys(); lmgr.append(naruto); lmgr.append(fundo); naruto.nextFrame(); // Portanto remova essa linha lmgr.paint(g, 0,0); flushGraphics(); }

O nextFrame() deve ser inserido aqui

[code] private void checkeys(){
int keyState = getKeyStates();
if ((keyState & RIGHT_PRESSED) != 0){
naruto.setFrameSequence(correndo);
naruto.nextFrame();
}
if ((keyState & LEFT_PRESSED) != 0){
naruto.setFrameSequence(correndo);
naruto.nextFrame();
}

} [/code]

Assim ele será animado toda vez que vc pressionar direita ou esquerda.

Existem outros problemas:
lmgr.append(naruto);
lmgr.append(fundo);

toda vez que vc faz isso, ele da um apend no layerManager, o que não é bom.

Eu colocaria eles no construtor, assim vc teria o seu fundo em uma layer, e o seu sprite em outra e ai apenas atualize o sprite com o nextFrame, dando um paint a cada loop.

resolvido, obrigado a todos.
o codigo ficou assim:

import java.io.IOException;
import javax.microedition.lcdui.Display; // Added
import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;

public class narutoMIDlet extends MIDlet {

public narutoMIDlet() throws Exception {							// Added
	pongCanvas = new PongCanvas();				
}								// Added

public void startApp() {
	Display display = Display.getDisplay(this);		// Added
	pongCanvas.start();					// Added
	display.setCurrent(pongCanvas);				// Added
}

public void pauseApp() {

}

public void destroyApp(boolean unconditional) {

}

private PongCanvas pongCanvas;				// Added

}

class PongCanvas extends GameCanvas implements Runnable {
private long sleepTime = 50;
private Image imnaruto;
private Image imfundo;
private Sprite naruto;
private Sprite fundo;
private int narutox = getWidth()/2 ;
private int narutoy = getHeight()/2+60;
private int fundox = 120;
private int fundoy = 160;
private int correndo [] = {1,2};
private int parado [] = {0};

public PongCanvas()throws Exception {
	super(false);
            imnaruto = Image.createImage("/naruto.PNG");
            imfundo= Image.createImage("/fundo.PNG");
            arena();
            naruto();
}

public void run() {
	while(true) {
		updateScreen(getGraphics());
		try {
			Thread.sleep(sleepTime);
                        } catch (Exception e) {
		}
            }
}

public void start() {                     
        Thread runner = new Thread(this);
        runner.start();

}
private void arena(){
fundo = new Sprite(imfundo,2000,320);
fundo.defineReferencePixel(120, 160);
fundo.setRefPixelPosition(fundox, fundoy);
}

    private void naruto(){
        naruto = new Sprite(imnaruto,26,35);
        naruto.defineReferencePixel(13, 35/2);
        naruto.setRefPixelPosition(narutox, narutoy);
        naruto.setFrameSequence(correndo);
   }

private void updateScreen(Graphics g) {
            fundo.paint(g);
            naruto.paint(g);
            controles();
	flushGraphics();
	}

public void controles(){
int tecla = getKeyStates();
int posiçao = naruto.getX();
if ((tecla & RIGHT_PRESSED) != 0){
if(posiçao < 215){
naruto.setTransform(naruto.TRANS_NONE);
naruto.move(1, 0);
naruto.nextFrame();
}

}

if ((tecla & LEFT_PRESSED) != 0){
if(posiçao > 0){
naruto.setTransform(naruto.TRANS_MIRROR);
naruto.move(-1, 0);
naruto.nextFrame();
}
}

}
}