Duplicar Sprite

Bom dia inestimáveis colegas de profissão!

Gostaria de saber se é possível duplicar um sprite fazendo com que esse assuma estados diferentes do original.
No jogo que estou fazendo por exemplo, terá alguns inimigos que serão iguais…
Para não criar outros Sprites contendo a mesma animação e imagem e pesar meu jogo pensei em duplicar um já criado, assim como se faz no Flash por exemplo, onde você consegue duplicar um objeto transformando ele mas sem isso se aplicar ao original.

Será que dá pra fazer isso, ou preciso criar outro sprite?

Obrigado e bom feriado!

Realmente em Flash é outra história! Porém, você pode fazer algo parecido em J2me. Voce pode ficar redesenhado um Sprite chamando o metodo paint dele. Se precisar te mando um exemplo. Sem dúvida essa é uma boa prática de programação para j2me! :lol: Pois dessa forma você economiza bastante memória.

Obrigado pela resposta…
Gostaria de ver um exemplo sim…
Mas mesmo se eu der um repaint() nele, isso não afetaria o 1º?

Pronto, na real a idéia é essa, veja:

	public void run() {  	
                personagemSprite.setPosition(50, 50);
                personagemSprite.paint(g); 
                //2 sprite que na real é o mesmo
	personagemSprite.setPosition(0, 0);
                personagemSprite.paint(g);
                flushGraphics();
	}

Se tiver fazendo herança com o Canvas, coloca esse código dentro do paint(Graphics g){}.
Entenda, se queres manipular cada um dos sprites então esse código não é legal, serve só para te dar um norte. Fiz assim em um jogo de cartas para faculdade que desenvolvi. O jogo comporta 4 jogadores, cada qual, pode ter até 14 cartas. Como cada carta tem um naipe, ao invéz de criar 14 naipes para cada jogador pela instanciação das imagens eu usei somente um e com o método setFrame() passavo o indíce do array das sequências.
Se ainda tiver dúvidas só perguntar! :wink:

Obrigado cara…

Hun… testei aqui a sua sugestão mas só o último sprite foi exibido:

[code] plantaCarnivora.setPosition(80, 80);
plantaCarnivora.setVisible(true);
plantaCarnivora.paint(g);

    plantaCarnivora.setPosition(80, 20);
    plantaCarnivora.setVisible(true);
    plantaCarnivora.paint(g);

flushGraphics();[/code]

Ok olha esse código que fiz:

public class Personagem{
	  private Sprite personagemSprite;
	  private int x;
	  private int y;
	  private int w;
	  private int h;
	  public Personagem(int w,int h){
		  this.w=w;
		  this.h=h;		  
	  }
	  public void setY(int i) {
		y=i;
		
	}
	  public void setX(int i) {
		x=i;
		
	}
	public void draw(Graphics g){
		  personagemSprite.setPosition(x, y);
		  personagemSprite.paint(g);	  
	  }
	  public void setSprite(final Sprite sprite){
		     this.personagemSprite = sprite;
	  }
}

classe canvas

public class RPGCanvas extends GameCanvas implements Runnable{  
	Graphics g = getGraphics(); 
	Sprite personagem;
	private Personagem[] personagemsArray;
	int posX = getWidth()/2;  
	int posY = getHeight()/2;  

	public RPGCanvas() {  
		super(true);
		init();
		Thread t = new Thread(this);  
		t.start();  
	}
	private void init(){
		try {  
			personagem = new Sprite(Image.createImage("/personagem.PNG"),24,28);  				
		}catch (IOException e){  
		  e.printStackTrace();
		}
		personagemsArray = new Personagem[10]; 
		Random r = new Random();
	    for (int i = 0; i < personagemsArray.length; i++) {		    
	    	personagemsArray[i] = new Personagem(getWidth(),getHeight());
	    	personagemsArray[i].setSprite(personagem);	
	    }
	    personagemsArray[0].setX(10);
	    personagemsArray[0].setY(15);
	    //
	    personagemsArray[1].setX(20);
	    personagemsArray[1].setY(25);
	    //
	    personagemsArray[2].setX(50);
	    personagemsArray[2].setY(15);
	    //
	    personagemsArray[3].setX(20);
	    personagemsArray[3].setY(75);
	    //
	    personagemsArray[4].setX(20);
	    personagemsArray[4].setY(90);
	    //
	    //
	    personagemsArray[5].setX(100);
	    personagemsArray[5].setY(70);
	    //
	    personagemsArray[6].setX(70);
	    personagemsArray[6].setY(100);
	    //
	    personagemsArray[7].setX(50);
	    personagemsArray[7].setY(50);
	    //
	    personagemsArray[8].setX(150);
	    personagemsArray[8].setY(150);
	    //
	    personagemsArray[9].setX(150);
	    personagemsArray[9].setY(110);
	}


	public void run() {

    	       while(true){	
    	    		    	    	   
		    	    for (int i = 0; i < personagemsArray.length; i++) {
		    		     personagemsArray[i].draw(g);
		    		     try {
							Thread.sleep(500);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
			    	    
		   	        }
		    	    flushGraphics();
		       }           
	}
} 

Pronto mesmo sprite desenhado em vários lugares diferente :lol:

Agora entendi!!!
Obrigado mesmo amigo!

Pronto agora para vê-los em movimento de forma aleatória:

	public void run() {
                                while(true){	
    	                 g.setColor(255, 255, 255);
	    	 g.fillRect(0, 0, getWidth(), getHeight());
		 for (int i = 0; i < personagemsArray.length; i++) {		    	 
		    	          personagemsArray[i].draw(g);
	                            try {
		            Thread.sleep(10);
		            } catch (InterruptedException e){
			 e.printStackTrace();
		            }			    	    
		  }
		   flushGraphics();
	          }           
	}

Para pegar as coordenadas aleatórias tem o “Random r”, porém você o coloca no construtor, assim só o instancia uma vez. Pronto, agora vc tem tudo para aperfeicoar e estudar o GameCanvas do j2me e nós mostrar o que sabes fazer :wink:

	public void draw(Graphics g){
		  Random r= new Random();
		  if(x > w){
			     x-=r.nextInt(5); 
		  }else if(x < 0){
			     x+=r.nextInt(5); 
		  }else if(y > h){
				 y-=r.nextInt(5); 		
		  }else if(y < 0){
				 y +=r.nextInt(5); 
		  }else{
			  int indexMove = r.nextInt(2);
			  if(indexMove == 1){
			  int index = r.nextInt(4);
			  if(index == 1){
			     y-=r.nextInt(5); 
			     x-=r.nextInt(5); 
			  }else   if(index == 2){
				 y+=r.nextInt(5); 
				 x+=r.nextInt(5);  
			  }else   if(index == 3){
				 y-=r.nextInt(5); 
				 x+=r.nextInt(5);  
			  }else   if(index == 4){
				 y+=r.nextInt(5); 
				 x-=r.nextInt(5);  
			  }
			  }
		  }
		  personagemSprite.setPosition(x, y);
		  personagemSprite.paint(g);	  
	  }