P
peebles
Gast
Hallo,
ich wollte mir eine Sprite-Klasse schreiben, zum "flüssigen" (ist relativ) Darstellen von Animationen,
durch widerholtes zeichnen verschiedener Bilder (hier: BufferedImage).
Habe mir auch schnell eine Klasse geschrieben, wahrscheinlich noch uneffizient aber das tut erst einmal nichts zur Sache.
In meiner Main-Loop ("Spielschleife") wird dann wie gehabt it repaint() eine Anfrage gestellt, wobei dann paintComponent aufgerufen wird:
Bei
kriege ich eine NullPointerException, obwohl (!) das Programm ordnungsgemäß startet und auch sogar zeichnet, so wie es sein soll.
Das Bild ist also garantiert nicht null und wird richtig geladen, sowie in kleine Einzelteile zerschnitten.
Jemand eine Idee?
Danke
ich wollte mir eine Sprite-Klasse schreiben, zum "flüssigen" (ist relativ) Darstellen von Animationen,
durch widerholtes zeichnen verschiedener Bilder (hier: BufferedImage).
Habe mir auch schnell eine Klasse geschrieben, wahrscheinlich noch uneffizient aber das tut erst einmal nichts zur Sache.
Java:
public class Sprite {
long delay;
long animation = 0;
int currentPic = 0;
BufferedImage[] pics;
BufferedImage[] aa;
private int x,y, vx, vy;
public Sprite(String path, int x, int y, long delay, int count) {
this.setX(x);
this.setY(y);
this.delay = delay;
currentPic = 0;
aa = loadPics("pics/Sprite1.png", 4);
this.setPics(aa);
}
public void setPics(BufferedImage[] pics) {
this.pics = pics;
}
public BufferedImage[] getPics() {
return pics;
}
public void draw(Graphics g) {
g.drawImage(pics[currentPic], this.x, this.y, null);
}
//getter & setter weggelassen
public void forceAnimation() {
currentPic++;
if (currentPic > pics.length-1) {
currentPic = 0;
}
}
public void checkNextPic(long delta) {
animation += (delta/1000000);
if (animation > delay)
{
animation = 0;
forceAnimation();
}
}
private BufferedImage[] loadPics(String path, int pics) {
BufferedImage[] anim = new BufferedImage[pics];
BufferedImage source = null;
URL url = getClass().getClassLoader().getResource(path);
try {
source = ImageIO.read(url);
} catch (IOException e) { }
for (int x = 0; x < pics; x++) {
anim[x] = source.getSubimage(x*source.getWidth()/pics, 0, //x1, y1
source.getWidth()/pics, source.getHeight()); //x2, y2
}
return anim;
}
}
In meiner Main-Loop ("Spielschleife") wird dann wie gehabt it repaint() eine Anfrage gestellt, wobei dann paintComponent aufgerufen wird:
Java:
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("FPS " + Long.toString(fps), 10, 20);
if (!input.getRunningState()) {
return;
}
block.draw(g);
sprite.draw(g);
}
Bei
Java:
sprite.draw(g);
Das Bild ist also garantiert nicht null und wird richtig geladen, sowie in kleine Einzelteile zerschnitten.
Jemand eine Idee?
Danke