Bom, nem sei se isso e ‘java básico’ ou não , mas so por eu ter a duvida resolvi postar aqui mesmo…
e o seguinte gosto bastante de programar em java porem não trabalho com isto , então pra praticar bem a linguagem resolvi brincar de fazer joguinhos, que eu acho que da pra treinar bem porque engloba muita coisa , esta semana resvoli tentar fazer minha propria engine, e comecei pelas classes de recuperação de imagem e desenho .
estava tudo indo certo até que aconteceu algo que nao previ…
so e desenhado na tela a ultima instancia da classe Fighter , quando eu
esperava que todas fossem desenhadas ( ja que são instancias da mesma clase ) , pensei por um momento
que uma estava desenhando em cima da outro mas não e isso ,
derrepente alguem pode ter uma expliacação simples, as duas
instancias chegam a ser criadas e rodam em background, mas so uma
e desenhada =(
public static void main (String[] args)
{
JFrame janela = new JFrame();
Fighter goku = new Fighter();
Fighter goku2 = new Fighter();
goku.setPos(100,100);
goku2.setPos(200,200);
janela.add(goku2 );
janela.add(goku );
janela.setSize(800 , 600 );
janela.setVisible(true);
}
classe fighter
public class Fighter extends Sprite {
private Imagem imLoader;
Fighter()
{
imLoader = new Imagem();
setActive(true);
setBehavior(true); // tem loop de animacao
setNextAnim(true); // animacao foi carregada
setBehaviorImage(imLoader.loadImageArray("goku.gif", 4));
resetCurrentPosImage(); //aponta para 1 imagem do buffer
}
}
classe sprite
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class Sprite extends JPanel implements Runnable {
private Graphics gw;
private Image dbImage;
private final int INITIAL_STATE = 0;
//boolean setters
private boolean active = false;
private boolean behavior = false;
private boolean looping;
private boolean isNext;
//image setters
private BufferedImage image;
private BufferedImage imageAnim;
private int currentAnim;
private int animLenght;
private BufferedImage[] imagesAnim;
private Imagem imLoader;
private int locX , locY;
private int currentImage;
public void setPos(int x , int y )
{
locX = x ;
locY = y;
}
private Thread threadimage;
public void init()
{
System.out.println("SPRITE CRIADO");
if (threadimage == null )
{
threadimage = new Thread(this);
threadimage.start();
}
}
public void addNotify( )
/* Wait for the JPanel to be added to the
JFrame/JApplet before starting. */
{
super.addNotify( ); // creates the peer
init();
}
public void paintComponent(Graphics g)
{
drawSprite(g);
}
public void run()
{
while (true)
{
try
{
if ( currentAnim < animLenght ){
System.out.println("run currentAnim " +currentAnim );
System.out.println("run nimLenght "+animLenght );
updateAnim();
repaint();
currentAnim++;
threadimage.sleep(100);
}
else {
setNextAnim(false);
resetCurrentPosImage();
System.out.println("image counter reseted" );
threadimage.sleep(20);
}
} // try thread
catch (InterruptedException e) {
} // thread morta
}
}
public Image getCurrentImage()
{
return image;
}
public Image getCurrentAnimImage()
{
return imageAnim;
}
public void setImage(String name)
{
image = imLoader.loadImage(name);
//setCurrentImage( imLoader.loadImage(name) );
}
/** configura a imagem de animação comportamental
* */
public void setBehaviorImage(BufferedImage[] anim)
{
animLenght = anim.length;
imagesAnim = anim;
}
/** atualiza para o proximo movimento da animação
* comportamental
*/
public void updateAnim()
{
if( isNextAnim() ) // se ainda existir proxima animção
{
System.out.println("current image: "+currentAnim);
imageAnim = imagesAnim[currentAnim];
//currentImage++;
}
else{
resetCurrentPosImage();
System.out.println("image image reseted: updateAnim" );
}
//setNextAnim(false);
}
public boolean isNextAnim()
{
return isNext;
}
public void resetCurrentPosImage ()
{
currentAnim = INITIAL_STATE;
setNextAnim(true);
}
public void setNextAnim(boolean value)
{
isNext = value;
}
public void setCurrentImage(BufferedImage image)
{
this.image = image;
}
public void setActive(boolean active)
{
this.active = active;
}
public void loopImage(String name){}
public boolean isBehaved()
{
return behavior;
}
public void setBehavior(boolean value)
{
behavior = value;
}
public void getPWidth(){}
public void getPHeight(){}
public void getXPos(){}
public void getYPos(){}
public void updateSprite(){}
public void drawSprite(Graphics g)
{
if ( isBehaved() ) // tem loop constante
{
if ( isActive() ) // sprite ativo
{
//image = getCurrentImage();
dbImage = createImage(this.getWidth(),this.getHeight());
gw = dbImage.getGraphics( );
gw.setColor (getBackground ());
gw.drawImage(imageAnim,locX,locY,null);
g.drawImage(dbImage,locX,locY,null);
System.out.println("image painted");
}
}
if (isActive())
{
if (imageAnim==null)
{
System.out.println("the sprite has no image");
//draw a cirle instead of the image
//code here
}
else
{
if ( isNext )
{
//image = getCurrentImage();
g.drawImage(image,locX,locY,null);
}
} // end of else statement
}// out of isActive()
} // end of drawnsprite()
public boolean isActive()
{
return active;
}
public void getMyRectangle(){}
} // end of Sprite() class
tem muita coisa no codigo que ainda nao configurei nem se atentem a isso, como comportamento das janelas e tal…
desculpem pelo flood de codigos …vlw