F
Frost_
Gast
Hallöchen,
ich habe mal ein kleines Snake Spiel geschrieben und wollte nun noch einen Punktezähler einbauen.
Dazu will ich mein JFrame so aufteilen, dass oben die Punkte in einem JLabel angezeigt werden und darunter in einem JPanel das Spiel abläuft.
Problem:
Kurz nach Programmstart verrutscht alles etwas nach unten und ist doppelt da. Dazu auch zwei Bilder:
So sieht es einen kurzen Moment nach Programmstart aus ( so sollte es auch sein )
So sieht es danach aus ( ist ein neues Spiel mit anderen Koordinaten für den grünen Punkt, daher ist der so weit unten )
Und zwar passiert das im zweiten Durchlauf der while Schleife in 48 - 59.
Das erste repaint() in 50 funktioniert also noch. ( habe das mit einer längeren Sleep Zeit getestet )
Sobald man die Schlange über die verrutschten Sachen bewegt verschwinden diese.
Auch tritt das Problem nicht mehr auf, nachdem man einmal vor die Wand gefahren und die Zeichenfläche mit meiner clear() Methode geleert wird.
Erläuterungen zum Quellcode:
drawSnake ist die Zeichenfläche auf der das Spiel ablaufen soll. Sie erbt von JPanel
In der paint Methode davon zeichne ich jeweils nur das Futter (grün), das erste Segement der Schlange (schwarz) und übermale das letzte Segement mit der Hintergrundfarbe.
Rufe ich clear() auf, so übermalt er mir vorher alles mit der Hintergrundfarbe.
Wäre schön wenn mir da jemand helfen könnte.
ich habe mal ein kleines Snake Spiel geschrieben und wollte nun noch einen Punktezähler einbauen.
Dazu will ich mein JFrame so aufteilen, dass oben die Punkte in einem JLabel angezeigt werden und darunter in einem JPanel das Spiel abläuft.
Problem:
Kurz nach Programmstart verrutscht alles etwas nach unten und ist doppelt da. Dazu auch zwei Bilder:
So sieht es einen kurzen Moment nach Programmstart aus ( so sollte es auch sein )

So sieht es danach aus ( ist ein neues Spiel mit anderen Koordinaten für den grünen Punkt, daher ist der so weit unten )

Und zwar passiert das im zweiten Durchlauf der while Schleife in 48 - 59.
Das erste repaint() in 50 funktioniert also noch. ( habe das mit einer längeren Sleep Zeit getestet )
Sobald man die Schlange über die verrutschten Sachen bewegt verschwinden diese.
Auch tritt das Problem nicht mehr auf, nachdem man einmal vor die Wand gefahren und die Zeichenfläche mit meiner clear() Methode geleert wird.
Erläuterungen zum Quellcode:
drawSnake ist die Zeichenfläche auf der das Spiel ablaufen soll. Sie erbt von JPanel
In der paint Methode davon zeichne ich jeweils nur das Futter (grün), das erste Segement der Schlange (schwarz) und übermale das letzte Segement mit der Hintergrundfarbe.
Rufe ich clear() auf, so übermalt er mir vorher alles mit der Hintergrundfarbe.
Wäre schön wenn mir da jemand helfen könnte.
Java:
public class SnakeGame extends Thread {
SnakeField field;
Snakelist snake;
int foodX;
int foodY;
JFrame snakeFrame;
Zeichenflaeche drawSnake;
final int dimX = 24;
final int dimY = 19;
MyKeyListener steuerung;
public static void main(String[]args) {
SnakeGame game = new SnakeGame();
game.start();
}
SnakeGame() {
field = new SnakeField (dimX, dimY);
foodX = field.foodX;
foodY = field.foodY;
JPanel top = new JPanel();
drawSnake = new Zeichenflaeche(dimX,dimY,field);
snakeFrame = new JFrame();
snakeFrame.setLayout(new BorderLayout());
top.add(new JLabel("Punkte: "+0));
snakeFrame.setSize(800, 600);
snakeFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
steuerung = new MyKeyListener();
snakeFrame.addKeyListener(steuerung);
snakeFrame.getContentPane().add(top,BorderLayout.NORTH);
snakeFrame.getContentPane().add(drawSnake,BorderLayout.CENTER);
snakeFrame.setResizable(false);
snakeFrame.setVisible(true);
}
public void run() {
while ( true ) {
boolean collision = false;
while ( !collision ) {
collision = field.simulateOneStep(steuerung.getAlignment());
drawSnake.repaint();
foodX = field.foodX;
foodY = field.foodY;
try {
sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
sleep(300);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
field.reset(dimX, dimY);
drawSnake.clear();
steuerung.reset();
}
}
}
class Zeichenflaeche extends JPanel {
SnakeField field;
int dimX;
int dimY;
int width;
int height;
boolean clear;
Zeichenflaeche(int dX, int dY, SnakeField f) {
super();
clear = false;
dimX = dX;
dimY = dY;
field = f;
}
public void clear() {
clear = true;
repaint();
}
public void paint(Graphics g) {
Color bg = this.getBackground();
width = getWidth() / dimX;
height = getHeight() / dimY;
if ( clear ) {
g.setColor(bg);
g.fillRect(0, 0, getWidth(), getHeight());
clear = false;
}
g.setColor(Color.green);
g.fillRect(field.foodX*width, field.foodY*height, width, height);
g.setColor(bg);
g.fillRect(field.getSnake().getTail().getX()*width, field.getSnake().getTail().getY()*height, width, height);
g.setColor(Color.black);
g.fillRect(field.getSnake().getHead().getX()*width, field.getSnake().getHead().getY()*height, width, height);
}
}
Zuletzt bearbeitet von einem Moderator: