Der Titel ist vielleicht etwas ungünstig gewählt, mir fiel allerdings kein besserer ein.
Als kleines Nebenprojekt wollte ich gerne Snake programmieren, auch um mir einen Einstieg in AWT und Swing zu verschaffen. Ich bin noch lange nicht fertig, allerdings stoße ich schon jetzt auf ein unschönes Problem. Ich zeichne in meinem JFrame mit der paint() Methode meine Schlange und nach einer gewissen Zeit rufe ich die repaint() Methode auf, doch das läuft alles andere als flüssig. Im Anhang hab ich das Spiel mal exportiert, um das "Problem" zu sehen.
Die Spielfeld Klasse sieht wie folgt aus:
[JAVA=42]package snake;
import java.awt.Checkbox;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Panel;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Feld extends JFrame implements Runnable{
private static final long serialVersionUID = 385109452983858304L;
private JButton start, pause;
private MyWindowListener windowlistener = new MyWindowListener();
private Snake snake;
private Events events;
public Thread thread;
public boolean isPaused;
public Feld(){
init();
}
public void init(){
snake = new Snake();
events = new Events(this);
isPaused = true;
drawWindow();
thread = new Thread(this);
thread.start();
}
public void paint(Graphics g){
// super.paint(g);
g.setColor(Color.LIGHT_GRAY);
g.fillRect(0, 0, 300, 400);
for (int i = 0; i < snake.getLength(); i++) {
for (int j = 0; j < 10; j++){
g.setColor(new Color((150 + j * 10) * i / snake.getLength(), (150 + j * 10) * i / snake.getLength(), (150 + j * 10) * i / snake.getLength()));
g.fillOval(snake.getPosition(i).getX() * 10 - 1 + j/2, snake.getPosition(i).getY() * 10 + 20 + j/2, 10 - j, 10 - j);
}
}
}
public void run() {
int time = 100;
while (!thread.isInterrupted()){
if (!isPaused){
try {Thread.sleep(time);} catch (InterruptedException e) {}
if (Math.random() < 0.75){
snake.update();
} else {
snake.addElement();
}
events.checkGameOver(snake);
repaint();
} else {
try {
Thread.sleep(time);
} catch (InterruptedException e) { }
}
}
System.out.println("Game Over");
System.out.println(snake.getPosition(0));
events.restart();
}
private void drawWindow(){
this.setTitle("Snake by v Ralle v");
this.getContentPane().setLayout(null);
this.getContentPane().setBackground(Color.LIGHT_GRAY);
this.addWindowListener(windowlistener);
start = new JButton("Start");
pause = new JButton("Pause");
start.addKeyListener(new MyKeyAdapter(this, events));
Checkbox check1 = new Checkbox("Leicht", false);
Checkbox check2 = new Checkbox("Mittel", true);
Checkbox check3 = new Checkbox("Schwer", false);
Panel panel3 = new Panel();
panel3.setBounds(200, 0, 100, 100);
panel3.add(check1);
panel3.add(check2);
panel3.add(check3);
Panel panel2 = new Panel();
panel2.setBounds(0, 285, 300, 100);
panel2.add(start);
panel2.add(pause);
panel2.add(panel3);
panel2.setBackground(Color.red);
this.getContentPane().add(panel2);
start.addFocusListener(new MyFocusAdapter());
}
public Snake getSnake(){
return snake;
}
public void newSnake(){
snake = new Snake();
}
}
[/code]
Zur Info: das Spiel beginnt mit der Leertaste. Wenn halt der Spielfeldrand erreicht wird, breche ich den Thread ab.
Ich hoffe mir kann jemand helfen, damit das Spiel flüssig läuft.
Viel Grüße, Ralle
Als kleines Nebenprojekt wollte ich gerne Snake programmieren, auch um mir einen Einstieg in AWT und Swing zu verschaffen. Ich bin noch lange nicht fertig, allerdings stoße ich schon jetzt auf ein unschönes Problem. Ich zeichne in meinem JFrame mit der paint() Methode meine Schlange und nach einer gewissen Zeit rufe ich die repaint() Methode auf, doch das läuft alles andere als flüssig. Im Anhang hab ich das Spiel mal exportiert, um das "Problem" zu sehen.
Die Spielfeld Klasse sieht wie folgt aus:
[JAVA=42]package snake;
import java.awt.Checkbox;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Panel;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Feld extends JFrame implements Runnable{
private static final long serialVersionUID = 385109452983858304L;
private JButton start, pause;
private MyWindowListener windowlistener = new MyWindowListener();
private Snake snake;
private Events events;
public Thread thread;
public boolean isPaused;
public Feld(){
init();
}
public void init(){
snake = new Snake();
events = new Events(this);
isPaused = true;
drawWindow();
thread = new Thread(this);
thread.start();
}
public void paint(Graphics g){
// super.paint(g);
g.setColor(Color.LIGHT_GRAY);
g.fillRect(0, 0, 300, 400);
for (int i = 0; i < snake.getLength(); i++) {
for (int j = 0; j < 10; j++){
g.setColor(new Color((150 + j * 10) * i / snake.getLength(), (150 + j * 10) * i / snake.getLength(), (150 + j * 10) * i / snake.getLength()));
g.fillOval(snake.getPosition(i).getX() * 10 - 1 + j/2, snake.getPosition(i).getY() * 10 + 20 + j/2, 10 - j, 10 - j);
}
}
}
public void run() {
int time = 100;
while (!thread.isInterrupted()){
if (!isPaused){
try {Thread.sleep(time);} catch (InterruptedException e) {}
if (Math.random() < 0.75){
snake.update();
} else {
snake.addElement();
}
events.checkGameOver(snake);
repaint();
} else {
try {
Thread.sleep(time);
} catch (InterruptedException e) { }
}
}
System.out.println("Game Over");
System.out.println(snake.getPosition(0));
events.restart();
}
private void drawWindow(){
this.setTitle("Snake by v Ralle v");
this.getContentPane().setLayout(null);
this.getContentPane().setBackground(Color.LIGHT_GRAY);
this.addWindowListener(windowlistener);
start = new JButton("Start");
pause = new JButton("Pause");
start.addKeyListener(new MyKeyAdapter(this, events));
Checkbox check1 = new Checkbox("Leicht", false);
Checkbox check2 = new Checkbox("Mittel", true);
Checkbox check3 = new Checkbox("Schwer", false);
Panel panel3 = new Panel();
panel3.setBounds(200, 0, 100, 100);
panel3.add(check1);
panel3.add(check2);
panel3.add(check3);
Panel panel2 = new Panel();
panel2.setBounds(0, 285, 300, 100);
panel2.add(start);
panel2.add(pause);
panel2.add(panel3);
panel2.setBackground(Color.red);
this.getContentPane().add(panel2);
start.addFocusListener(new MyFocusAdapter());
}
public Snake getSnake(){
return snake;
}
public void newSnake(){
snake = new Snake();
}
}
[/code]
Zur Info: das Spiel beginnt mit der Leertaste. Wenn halt der Spielfeldrand erreicht wird, breche ich den Thread ab.
Ich hoffe mir kann jemand helfen, damit das Spiel flüssig läuft.
Viel Grüße, Ralle