Hallo Community,
ich bin seit kurzem dabei ein Snakespiel zu programmieren. Nun bin ich auf ein Problem gestoßen...
Es geht um die repaint() Funktion, welche ich verwenden möchte, um mein Bild neu zu laden.
Immer wirklich immer, wenn ich das Spiel starte fängt es an zu flackern und es ist schwer möglich zu spielen.
Am besten poste ich einfach meinen Code.
[JAVA=134]
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Snake extends JFrame implements KeyListener, Runnable{
private static final long serialVersionUID = 1L;
private Dot dot = new Dot(3, this);
private boolean up, down, right, left;
private Apple apple = new Apple(this);
public Snake (String title) {
super(title);
this.setFocusable(true);
this.addKeyListener(this);
apple.createLocation();
}
public void paint(Graphics gr) {
super.paint(gr);
this.setFocusable(true);
this.addKeyListener(this);
//Malen Start
//Hintergrund
gr.drawImage(Toolkit.getDefaultToolkit().getImage("images/bg.png"), 0, 0, this);
//Dot malen
dot.paint(gr);
//Apfel erstellen
apple.paint(gr);
//Check für GameEnd
if (dot.getGameEnd()) {
gr.setFont(new Font("Arial", Font.BOLD, 25));
gr.drawString("Game Over!", 190, 220);
gr.setColor(Color.white);
gr.drawString("Punkte: " + dot.points, 200, 260);
}
}
public static void main(String[] args) {
//Main Logik
Snake snake = new Snake("Snake");
snake.setSize(500, 500);
new Thread(snake).start();
snake.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
snake.setUndecorated(true);
snake.setVisible(true);
snake.setLocation(700, 300);
}
@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent arg0) {
if (arg0.getKeyCode() == 37 && !right) {
left = true;
up = false;
right = false;
down = false;
}
else if (arg0.getKeyCode() == 38 && !down) {
up = true;
left = false;
right = false;
down = false;
}
else if (arg0.getKeyCode() == 39 && !left) {
right = true;
left = false;
up = false;
down = false;
}
else if (arg0.getKeyCode() == 40 && !up) {
down = true;
left = false;
up = false;
right = false;
}
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void run() {
while(true) {
//Check, für GameEnd
if (!dot.getGameEnd()) {
//Dot
if (up) {
dot.move("up");
}
else if (down) {
dot.move("down");
}
else if (left) {
dot.move("left");
}
else if (right) {
dot.move("right");
}
dot.checkApple(apple);
dot.checkCollision();
//Try, Catch
repaint(); {
}
}
try {
Thread.sleep(140);
} catch (InterruptedException ex) {
Logger.getLogger(Snake.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
[/code]
Es gibt noch 2 auslagerungs Dateien, bei Bedarf, kann ich diese auch gern posten. Ich denke aber, dass die nicht nötig sein sollte!
ich bin seit kurzem dabei ein Snakespiel zu programmieren. Nun bin ich auf ein Problem gestoßen...
Es geht um die repaint() Funktion, welche ich verwenden möchte, um mein Bild neu zu laden.
Immer wirklich immer, wenn ich das Spiel starte fängt es an zu flackern und es ist schwer möglich zu spielen.
Am besten poste ich einfach meinen Code.
[JAVA=134]
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Snake extends JFrame implements KeyListener, Runnable{
private static final long serialVersionUID = 1L;
private Dot dot = new Dot(3, this);
private boolean up, down, right, left;
private Apple apple = new Apple(this);
public Snake (String title) {
super(title);
this.setFocusable(true);
this.addKeyListener(this);
apple.createLocation();
}
public void paint(Graphics gr) {
super.paint(gr);
this.setFocusable(true);
this.addKeyListener(this);
//Malen Start
//Hintergrund
gr.drawImage(Toolkit.getDefaultToolkit().getImage("images/bg.png"), 0, 0, this);
//Dot malen
dot.paint(gr);
//Apfel erstellen
apple.paint(gr);
//Check für GameEnd
if (dot.getGameEnd()) {
gr.setFont(new Font("Arial", Font.BOLD, 25));
gr.drawString("Game Over!", 190, 220);
gr.setColor(Color.white);
gr.drawString("Punkte: " + dot.points, 200, 260);
}
}
public static void main(String[] args) {
//Main Logik
Snake snake = new Snake("Snake");
snake.setSize(500, 500);
new Thread(snake).start();
snake.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
snake.setUndecorated(true);
snake.setVisible(true);
snake.setLocation(700, 300);
}
@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent arg0) {
if (arg0.getKeyCode() == 37 && !right) {
left = true;
up = false;
right = false;
down = false;
}
else if (arg0.getKeyCode() == 38 && !down) {
up = true;
left = false;
right = false;
down = false;
}
else if (arg0.getKeyCode() == 39 && !left) {
right = true;
left = false;
up = false;
down = false;
}
else if (arg0.getKeyCode() == 40 && !up) {
down = true;
left = false;
up = false;
right = false;
}
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void run() {
while(true) {
//Check, für GameEnd
if (!dot.getGameEnd()) {
//Dot
if (up) {
dot.move("up");
}
else if (down) {
dot.move("down");
}
else if (left) {
dot.move("left");
}
else if (right) {
dot.move("right");
}
dot.checkApple(apple);
dot.checkCollision();
//Try, Catch
repaint(); {
}
}
try {
Thread.sleep(140);
} catch (InterruptedException ex) {
Logger.getLogger(Snake.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
[/code]
Es gibt noch 2 auslagerungs Dateien, bei Bedarf, kann ich diese auch gern posten. Ich denke aber, dass die nicht nötig sein sollte!