animaçao de sprite em j2me

9 respostas
mizael_souza

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?

9 Respostas

erictorti

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?

AntonioDiego
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.

ViniMunhoz

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

mizael_souza
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”.

AntonioDiego

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.

mizael_souza
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.
AntonioDiego
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;

}

}

<b>else</b> if ((keyState & LEFT_PRESSED) != 0){

if(flag!=1){ naruto.setFrameSequence (correndo); naruto.nextFrame();

if(posicao > 0){ naruto.move(-1, 0); }

flag=1;

}

}

}.

<a href="http://4.Eu">4.Eu</a> ja fiz um jogo simples usando sprite e tiledlayer e tive o mesmo problema q voce.

Se quiser da uma olhada ta <a href="http://projava.wapka.mobi">aqui</a> 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.

Hildebrando_Pedroni

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
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();
} 

}

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.

mizael_souza

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();
}
}

}
}

Criado 14 de janeiro de 2011
Ultima resposta 2 de mai. de 2011
Respostas 9
Participantes 5