G
Guest
Gast
Hallo!
Ich habe folgendes Problem: Ich habe gerade angefangen, einen Sokoban-Klon zu programmieren, und will jetzt eine Art Animation einfügen, also dass der Spieler sich nicht gleich um ein ganzes Feld bewegt, sondern das schrittweise tut. Das Programm wartet zwar die angegebene Zeit, aber das Bild wird erst ganz am Ende wieder neu gezeichnet, und ich habe keine Ahnung, woran das liegen könnte. Wäre echt nett, wenn ihr mir helfen könntet!
Hier der für mein Problem wichtige Quellcode:
Klasse Level:
Klasse FeldInhalt:
Klasse SokobanGUI:
Ich habe folgendes Problem: Ich habe gerade angefangen, einen Sokoban-Klon zu programmieren, und will jetzt eine Art Animation einfügen, also dass der Spieler sich nicht gleich um ein ganzes Feld bewegt, sondern das schrittweise tut. Das Programm wartet zwar die angegebene Zeit, aber das Bild wird erst ganz am Ende wieder neu gezeichnet, und ich habe keine Ahnung, woran das liegen könnte. Wäre echt nett, wenn ihr mir helfen könntet!
Hier der für mein Problem wichtige Quellcode:
Klasse Level:
Code:
import java.awt.*;
import java.awt.image.*;
public class Level {
...
public void zeichneLevel(Graphics g) {
...
// zeichne den Spieler
int xPos=spieler.gibX()*20+(40-width)*10+spieler.gibOffsetX();
int yPos=spieler.gibY()*20+(30-height)*10+spieler.gibOffsetY();
g.drawImage(Hilfsklasse.gibBild("Spieler"),xPos+10,yPos,null);
}
public void bewegeSpieler(int x,int y) {
int zielX=spieler.gibX()+x;
int zielY=spieler.gibY()+y;
if(!levelKarte[zielY][zielX].gibUntereSchicht().equals("Wand")) {
FeldInhalt kiste=Hilfsklasse.gibKiste(zielX,zielY);
if(kiste==null) {
spieler.bewege(x,y);
Sokoban.gibSokobanGUI().zeichneNeu();
for(int i=0; i<20; i++) {
Sokoban.warte(10);
spieler.reduziereOffset();
Sokoban.gibSokobanGUI().zeichneNeu();
}
}
}
}
}
Klasse FeldInhalt:
Code:
public class FeldInhalt {
...
public int gibX() {
return x;
}
public int gibY() {
return y;
}
public int gibOffsetX() {
return offsetX;
}
public int gibOffsetY() {
return offsetY;
}
public void bewege(int x,int y) {
this.x+=x;
this.y+=y;
offsetX=-x*20;
offsetY=-y*20;
}
public void reduziereOffset() {
if(offsetX>0) { offsetX-=1; }
if(offsetX<0) { offsetX+=1; }
if(offsetY>0) { offsetY-=1; }
if(offsetY<0) { offsetY+=1; }
}
}
Klasse SokobanGUI:
Code:
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
public class SokobanGUI extends JPanel {
private Image buffer=new BufferedImage(800,600,BufferedImage.TYPE_INT_RGB);
Graphics g=buffer.getGraphics();
public void zeichneNeu() {
Sokoban.gibMomentanesLevel().zeichneLevel(g);
repaint();
}
public void paintComponent(Graphics g) {
g.drawImage(buffer,0,0,this);
}
}