Hallo, ich hab folgendes problem, wenn ich mein programm starte, dann geht alles nach plan, doch wenn sich end auf 1 stellt, und ich mit hilfe von einem doppelclick es wieder auf 0 stellen will, sollte es wieder so laufen, wie es anfangs getan hat. doch jetzt öffnet es in der langen while schleiffe bei run() die repaint() methode nicht mehr!
repaint() (zeile 463) und repaint2() werden noch schön auf der konsole ausgegeben, doch die repaint() methode, welche dazwischen liegt, öffnet sich nicht mehr! was ist da los?
die classe Futter, hab ich nicht hoch gestellt, da es zuwenig platz hat, ich hoffe ihr braucht die nicht....
vielen Dank
repaint() (zeile 463) und repaint2() werden noch schön auf der konsole ausgegeben, doch die repaint() methode, welche dazwischen liegt, öffnet sich nicht mehr! was ist da los?
Java:
//Snake
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.MouseListener;
import java.util.*;
import javax.swing.*;
public class Snake extends Applet implements Runnable, KeyListener, MouseListener, MouseMotionListener
{
// Initialisierung der Variablen
int appletsize_x = 600; // Größe des Applets in x - Richtung
int appletsize_y = 600; // Größe des Applets in y - Richtung
//
int x_pos = appletsize_x / 2; // x - Position des Balles
int y_pos = appletsize_y / 2; // y - Position des Balles
int x_speed = 0; // Geschwindigkeit des Balles in x - Richtung
int y_speed = 0; // Geschwindigkeit des Balles in y - Richtung
public int getX_speed()
{
return x_speed;
}
public void setX_speed(int x_speed)
{
this.x_speed = x_speed;
}
public int getY_speed()
{
return y_speed;
}
public void setY_speed(int y_speed)
{
this.y_speed = y_speed;
}
int speed = 2;
int radius = 15; // Radius des Balles
int pause = 10;
int key;
public int getRadius()
{
return radius;
}
public void setRadius(int radius)
{
this.radius = radius;
}
//
int x_beweg;
int y_beweg;
int x_be_speed = 0;
int y_be_speed = 0;
int be_speed = 1;
int b_beweg = 38;
int h_beweg = 32;
int[] x_be;
int[] y_be;
int anzahl_be_punkte = 6;
//
boolean be_tmp = true;
//Zufallszahl
Random zufallspos = new Random();
Punkte punkte = new Punkte();
Futter futter = new Futter();
// Variablen für die Doppelpufferung
private Image dbImage;
private Graphics dbg;
JButton button = new JButton("Mausereignisse");
JLabel l = new JLabel();
// Konstruktor des Applets
/* public Snake()
{
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
//Komponenten hinzufuegen
cp.add(button,BorderLayout.NORTH);
cp.add(l,BorderLayout.SOUTH);
button.addMouseListener(this);
}*/
public void init()
{
setBackground (Color.blue);
addKeyListener(this);
addMouseListener(this);
addMouseMotionListener(this);
}
public void start ()
{
// Schaffen eines neuen Threads, in dem das Spiel läuft
Thread th = new Thread (this);
// Starten des Threads
th.start ();
//System.out.println("start : Start");
}
public void stop()
{
}
public void destroy()
{
}
public void keyPressed(KeyEvent e)
{
//getGraphics().drawString("User pressed key " + e.getKeyChar(), 10);
//currentLine+=20;
// linke Cursortaste
if (e.getKeyChar() == 0141)
{
// Ball bewegt sich dann nach links
x_speed = -speed;
y_speed = 0;
}
// rechte Cursortaste
else if (e.getKeyChar() == 0144)
{
// Ball bewegt sich dann nach rechts
x_speed = speed;
y_speed = 0;
}
// hoch
else if (e.getKeyChar() == 0167)//1004 = hoch
{
// Ball bewegt sich dann nach links
y_speed = -speed;
x_speed = 0;
}
// runter
else if (e.getKeyChar() == 0163)//1005 = runter
{
// Ball bewegt sich dann nach rechts
y_speed = speed;
x_speed = 0;
}
// punkt
else if (key == 0056)
{
x_speed = 0;
y_speed = 0;
}
else
{
// Ausgabe von gedrüktem Key und Zahlenwert an die Standardausgabe
//getGraphics().drawString("User pressed key " + e.getKeyChar(), 10);
}
//System.out.println("nach Cursor : " + x_speed + " , " + y_speed);
//System.out.println("finish : keyDown");
}
public void keyReleased(KeyEvent e)
{
System.out.println("User released key " + e.getKeyChar());
}
public void keyTyped(KeyEvent e)
{
}
public void mouseClicked(MouseEvent e)
{
System.out.println("User clicked mouse " + e.getClickCount() + " times!");
System.out.println("mouseDown start");
//Wenn Spiel noch nicht gestartet ist, oder wieder gestartet wird
if (e.getClickCount () == 2)
{
// Alle wichtigen Werte zurücksetzen
punkte.setEnd(0);
init ();
run();
punkte.setCount(10);
repaint();
}
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public void mousePressed(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
public void mouseMoved(MouseEvent e)
{
}
public void mouseDragged(MouseEvent e)
{
}
public void run ()
{
//System.out.println("start : run");
// Erniedrigen der ThreadPriority um zeichnen zu erleichtern
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
System.out.println("run : " + x_speed + " , " + y_speed);
// Zufallsort des Futters
futter.Zufallspos_X(appletsize_x, appletsize_y);
futter.Zufallspos_Y(appletsize_x, appletsize_y);
// Zufallsort der Punkte
punkte.Zufallspos_X(appletsize_x, appletsize_y, radius);
punkte.Zufallspos_Y(appletsize_x, appletsize_y, radius);
// Zufallsort der beweglichen Punkte
x_be = new int[anzahl_be_punkte];
while(be_tmp == true)
{
for(int i=0; i<=anzahl_be_punkte -1; i++)
{
x_be[i] = zufallspos.nextInt(appletsize_x - punkte.getBreite());
System.out.println("bewegliche Punkte x: " + x_be[i]);
be_tmp = false;
}
y_be = new int[anzahl_be_punkte];
for(int i=0; i<=anzahl_be_punkte -1; i++)
{
y_be[i] = zufallspos.nextInt(appletsize_x - punkte.getHöhe());
System.out.println("bewegliche Punkte y: " + y_be[i]);
be_tmp = false;
}
// überprüfen, das sie nicht übereinander liegen!
for(int i=0; i<=anzahl_be_punkte -1; i++)
{
if(y_be[i] <= (appletsize_y / 2) + 2 * radius + 1 && y_be[i] + h_beweg + 1 >= appletsize_y / 2)
{
be_tmp = true;
}
}
}
// Zufallsrichtung der beweglichen Punkte
final int N = 0;
final int NO = 1;
final int O = 2;
final int SO = 3;
final int S = 4;
final int SW = 5;
final int W = 6;
final int NW = 7;
for(int i=0; i<=anzahl_be_punkte -1; i++)
{
//x_futter = zufallspos.nextInt(7);
}
x_be_speed = be_speed;
int loop =0;
// Solange 0 ist läuft der Thread weiter
while (punkte.getEnd() == 0)
{
loop++;
//System.out.println("while start " + loop);
System.out.println("while start end : " + punkte.getEnd());
// Wenn der Ball den rechten Rand berührt, dann prallt er ab
if (x_pos > appletsize_x - radius)
{
// Ändern der Richtung des Balles
x_speed = -speed;
}
// Ball brührt linken Rand und prallt ab
else if (x_pos < radius)
{
// Ändern der Richtung des Balles
x_speed = +speed;
}
// Verändern der x- Koordinate
x_pos += x_speed;
// Wenn der Ball den unteren Rand berührt, dann prallt er ab
if (y_pos > appletsize_y - radius)
{
// Ändern der Richtung des Balles
y_speed = -speed;
}
// Ball brührt oberen Rand und prallt ab
else if (y_pos < radius)
{
// Ändern der Richtung des Balles
y_speed = +speed;
}
// Verändern der y- Koordinate
y_pos += y_speed;
x_speed = punkte.Punkte_erkennen1(x_pos, y_pos, radius, x_speed, y_speed);
y_speed = punkte.Punkte_erkennen2(x_pos, y_pos, radius, x_speed, y_speed);
// Futter erkennen
futter.Futter_erkennen(x_pos, y_pos, radius, x_speed, y_speed, appletsize_x, appletsize_y);
// Bewegliche Punkte Erkennen
for (int i=0; i<=anzahl_be_punkte -1; i++)
{
x_beweg = x_be[i];
y_beweg = y_be[i];
if ( (x_beweg + b_beweg -(x_pos + radius)) * (x_beweg + b_beweg -(x_pos + radius)) + (y_beweg + h_beweg -(y_pos + radius)) * (y_beweg + h_beweg -(y_pos + radius)) <= radius * radius ||
(x_beweg + b_beweg -(x_pos + radius)) * (x_beweg + b_beweg -(x_pos + radius)) + (y_beweg + h_beweg -(y_pos + radius)) * (y_beweg + h_beweg -(y_pos + radius)) <= radius * radius ||
(x_beweg + b_beweg -(x_pos + radius)) * (x_beweg + b_beweg -(x_pos + radius)) + (y_beweg + h_beweg -(y_pos + radius)) * (y_beweg + h_beweg -(y_pos + radius)) <= radius * radius ||
(x_beweg + b_beweg -(x_pos + radius)) * (x_beweg + b_beweg -(x_pos + radius)) + (y_beweg + h_beweg -(y_pos + radius)) * (y_beweg + h_beweg -(y_pos + radius)) <= radius * radius ||
x_pos + radius >= x_beweg && x_pos + radius <= x_beweg + b_beweg && y_pos >= y_beweg && y_pos <= y_beweg + b_beweg ||
x_pos >= x_beweg && x_pos <= x_beweg + b_beweg && y_pos - radius >= y_beweg && y_pos - radius <= y_beweg + b_beweg ||
x_pos - radius >= x_beweg && x_pos - radius <= x_beweg + b_beweg && y_pos >= y_beweg && y_pos <= y_beweg + b_beweg ||
x_pos >= x_beweg && x_pos <= x_beweg + b_beweg && y_pos + radius >= y_beweg && y_pos + radius <= y_beweg + b_beweg )
{
//System.out.println("start : punkteerkennen1 if anweisung");
//Abprallen von den Punkten
if (x_speed != 0)
{
x_speed = -x_speed;
y_speed = 0;
if (x_speed < 0)
{
x_pos = x_pos -3;
}
if (x_speed > 0)
{
x_pos = x_pos +3;
}
}
if (y_speed != 0)
{
y_speed = -y_speed;
x_speed = 0;
if (y_speed < 0)
{
y_pos = y_pos -3;
}
if (y_speed > 0)
{
y_pos = y_pos +3;
}
}
System.out.println("Dead! beweg");
punkte.police();
}
}
// x_be_speed = be_speed;
for(int i=0;i <= anzahl_be_punkte -1; i++)
{
// Wenn der bewegliche Punkt den rechten Rand berührt, dann prallt er ab
if (x_be[i] > appletsize_x - b_beweg)
{
// Ändern der Richtung des Balles
x_be_speed = -be_speed;
}
// bewegliche Punkt brührt linken Rand und prallt ab
else if (x_be[i] < 0)
{
// Ändern der Richtung des Balles
x_be_speed = +be_speed;
}
// Verändern der x- Koordinate
//for(int i=0;i <= anzahl_be_punkte -1; i++)
//{
x_be[i] += x_be_speed;
//}
// Wenn der Ball den unteren Rand berührt, dann prallt er ab
if (y_be[i] > appletsize_y - h_beweg)
{
// Ändern der Richtung des Balles
y_be_speed = -be_speed;
}
// Ball brührt oberen Rand und prallt ab
else if (y_be[i] < 0)
{
// Ändern der Richtung des Balles
y_be_speed = +be_speed;
}
// Verändern der y- Koordinate
//for(int i=0;i <= anzahl_be_punkte -1; i++)
//{
y_beweg += y_be_speed;
//}
}
// Neuzeichnen des Applets
System.out.println("repaint()");
repaint();
System.out.println("repaint2()");
try
{
// Stoppen des Threads für in Klammern angegebene Millisekunden
Thread.sleep (pause);
}
catch (InterruptedException ex)
{
// do nothing
}
//System.out.println("while end " + loop);
// Zurücksetzen der ThreadPriority auf Maximalwert
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}
}
/** Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des Bildschirmflackerns */
public void update (Graphics g)
{
//System.out.println("start : update");
// Initialisierung des DoubleBuffers
if (dbImage == null)
{
dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics ();
}
// Bildschirm im Hintergrund löschen
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
// Auf gelöschten Hintergrund Vordergrund zeichnen
dbg.setColor (getForeground());
paint (dbg);
// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
g.drawImage (dbImage, 0, 0, this);
//System.out.println("finish : update");
}
public void paint (Graphics g)
{
System.out.println("end : " + punkte.getEnd());
if (punkte.getEnd() == 0)
{
//System.out.println("start : paint");
System.out.println("futter : " + futter.getFressen());
System.out.println("punkte : " + punkte.getCount());
// Kugel
g.setColor (Color.red);
g.fillOval (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);
// Punkte
for(int i=0; i<= punkte.getAnzahl_punkte() -1; i++)
{
g.setColor (Color.black);
g.fillRect (punkte.getX_p(i),punkte.getY_p(i),punkte.getBreite(),punkte.getHöhe());
}
// Beweglichen Punkte
for(int i=0; i<=anzahl_be_punkte -1; i++)
{
g.setColor (Color.pink);
g.fillRect (x_be[i], y_be[i],b_beweg,h_beweg);
}
//Futter
g.setColor (Color.yellow);
g.fillRect (futter.getX_futter(), futter.getY_futter(),futter.getB_futter(),futter.getH_futter());
g.setColor (Color.yellow);
g.drawString ("Score: " + futter.getFressen(), 10, 40);
g.drawString ("Lives: " + punkte.getCount(), 300, 40);
}
else
{
setBackground (Color.black);
g.setColor (Color.yellow);
// Erreichte Punkte und game over
g.drawString ("Game over!", 130, 100);
g.drawString ("You scored " + futter.getFressen() + " Points!", 90, 140);
// Bewertung der Punkte
if (futter.getFressen() < 3) g.drawString ("Well, it could be better!", 100, 190);
else if (futter.getFressen() < 6 && futter.getFressen() >= 3) g.drawString ("That was not so bad", 100, 190);
else if (futter.getFressen() < 9 && futter.getFressen() >= 6) g.drawString ("That was really good", 100, 190);
else if (futter.getFressen() < 12 && futter.getFressen() >= 9) g.drawString ("You seem to be very good!", 90, 190);
else if (futter.getFressen() < 15 && futter.getFressen() >= 12) g.drawString ("That was nearly perfect!", 90, 190);
else if (futter.getFressen() >= 15) g.drawString ("You are the Champingon!",100, 190);
//g.drawString ("Doubleclick on the Applet, to play again!", 20, 220);
//isStoped = true; // Zurücksetzen der isStoped Variablen, um wieder neu beginnen zu können
}
}
}
class Punkte
{
private int x_punkt; // Punkte
private int y_punkt;
private int breite; // breite der Punkte
private int höhe; // Höhe der Punkte
private int[] x_p;
private int[] y_p;
private int anzahl_punkte = 20;
private int count;
private int end;
private boolean p_tmp;
//Zufallszahl
Random zufallsort = new Random();
//Konstruktor
public Punkte()
{
//System.out.println("start : Punkte.konstruktor");
x_punkt = 0; // Punkte
y_punkt = 0;
breite = 48; // breite der Punkte
höhe = 48; // Höhe der Punkte
anzahl_punkte = 10;
count = 10;
end = 0;
p_tmp = true;
//System.out.println("finish : Punkte.konstruktor");
}
//get_set methoden
public int getX_punkt()
{
return x_punkt;
}
public void setX_punkt(int x_punkt)
{
this.x_punkt = x_punkt;
}
public int getY_punkt()
{
return y_punkt;
}
public void setY_punkt(int y_punkt)
{
this.y_punkt = y_punkt;
}
public int getBreite()
{
return breite;
}
public void setBreite(int breite)
{
this.breite = breite;
}
public int getHöhe()
{
return höhe;
}
public void setHöhe(int höhe)
{
this.höhe = höhe;
}
public int getX_p(int i)
{
return x_p[i];
}
public void setX_p(int[] x_p)
{
this.x_p = x_p;
}
public int getY_p(int i)
{
return y_p[i];
}
public void setY_p(int[] y_p)
{
this.y_p = y_p;
}
public int getAnzahl_punkte()
{
return anzahl_punkte;
}
public void setAnzahl_punkte(int anzahl_punkte)
{
this.anzahl_punkte= anzahl_punkte;
}
public int getCount()
{
return count;
}
public void setCount(int count)
{
this.count = count;
}
public int getEnd()
{
return end;
}
public void setEnd(int end)
{
this.end = end;
}
public boolean getP_tmp()
{
return p_tmp;
}
public void setP_tmp(boolean p_tmp)
{
this.p_tmp = p_tmp;
}
public int[] Zufallspos_X(int appletsize_x, int appletsize_y, int radius)
{
//System.out.println("start : zufallspos_X");
x_p = new int[anzahl_punkte];
for(int i=0; i<=anzahl_punkte -1; i++)
{
x_p[i] = zufallsort.nextInt(appletsize_x - breite);
System.out.println("Punkte x: " + x_p[i]);
}
//System.out.println("finish : Zufallspos_X");
return x_p;
}
public int[] Zufallspos_Y(int appletsize_x, int appletsize_y, int radius)
{
//System.out.println("start : zufallspos_Y");
while(p_tmp == true)
{
y_p = new int[anzahl_punkte];
for(int i=0; i<=anzahl_punkte -1; i++)
{
y_p[i] = zufallsort.nextInt(appletsize_x - höhe);
System.out.println("Punkte y: " + y_p[i]);
p_tmp = false;
}
//System.out.println("finish : Zufallspos_Y");
//return y_p;
for(int i=0; i<=anzahl_punkte -1; i++)
{
if(x_p[i] + breite + 1 >= appletsize_x / 2 && x_p[i] <= appletsize_x / 2 + 2 * radius + 1 &&
y_p[i] + höhe + 1 >= appletsize_y / 2 && y_p[i] <= appletsize_y / 2 + 2 * radius + 1 )
//(appletsize_y / 2) + radius <=y_be[i]<= (appletsize_y / 2) - h_beweg && (appletsize_x / 2) - b_beweg<= x_be[i]<= (appletsize_x / 2) + radius)
{
p_tmp = true;
}
}
}
return y_p;
}
public int Punkte_erkennen1(int x_pos, int y_pos, int radius, int x_speed, int y_speed)
{
System.out.println("start : punkteerkennen1");
// Punkte erkennen
for (int i=0; i<=anzahl_punkte -1; i++)
{
x_punkt = getX_p(i);
y_punkt = getY_p(i);
if ( (x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
(x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
(x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
(x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
x_pos + radius >= x_punkt && x_pos + radius <= x_punkt + breite && y_pos >= y_punkt && y_pos <= y_punkt + breite ||
x_pos >= x_punkt && x_pos <= x_punkt + breite && y_pos - radius >= y_punkt && y_pos - radius <= y_punkt + breite ||
x_pos - radius >= x_punkt && x_pos - radius <= x_punkt + breite && y_pos >= y_punkt && y_pos <= y_punkt + breite ||
x_pos >= x_punkt && x_pos <= x_punkt + breite && y_pos + radius >= y_punkt && y_pos + radius <= y_punkt + breite )
{
//System.out.println("start : punkteerkennen1 if anweisung");
//Abprallen von den Punkten
if (x_speed != 0)
{
x_speed = -x_speed;
y_speed = 0;
if (x_speed < 0)
{
x_pos = x_pos -2;
}
if (x_speed > 0)
{
x_pos = x_pos +2;
}
}
if (y_speed != 0)
{
y_speed = -y_speed;
x_speed = 0;
if (y_speed < 0)
{
y_pos = y_pos -2;
}
if (y_speed > 0)
{
y_pos = y_pos +2;
}
}
//System.out.println("Dead!");
police();
}
}
//System.out.println("finish : punkteerkennen1");
return x_speed;
}
public int Punkte_erkennen2(int x_pos, int y_pos, int radius, int x_speed, int y_speed)
{
System.out.println("start : punkteerkennen2");
// Punkte erkennen
for (int i=0; i<=anzahl_punkte -1; i++)
{
x_punkt = x_p[i];
y_punkt = y_p[i];
if ( (x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
(x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
(x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
(x_punkt + breite -(x_pos + radius)) * (x_punkt + breite -(x_pos + radius)) + (y_punkt + höhe -(y_pos + radius)) * (y_punkt + höhe -(y_pos + radius)) <= radius * radius ||
x_pos + radius >= x_punkt && x_pos + radius <= x_punkt + breite && y_pos >= y_punkt && y_pos <= y_punkt + breite ||
x_pos >= x_punkt && x_pos <= x_punkt + breite && y_pos - radius >= y_punkt && y_pos - radius <= y_punkt + breite ||
x_pos - radius >= x_punkt && x_pos - radius <= x_punkt + breite && y_pos >= y_punkt && y_pos <= y_punkt + breite ||
x_pos >= x_punkt && x_pos <= x_punkt + breite && y_pos + radius >= y_punkt && y_pos + radius <= y_punkt + breite )
{
//Abprallen von den Punkten
if (x_speed != 0)
{
x_speed = -x_speed;
y_speed = 0;
if (x_speed < 0)
{
x_pos = x_pos -2;
}
if (x_speed > 0)
{
x_pos = x_pos +2;
}
}
if (y_speed != 0)
{
y_speed = -y_speed;
x_speed = 0;
if (y_speed < 0)
{
y_pos = y_pos -2;
}
if (y_speed > 0)
{
y_pos = y_pos +2;
}
}
//System.out.println("Dead!");
}
}
//System.out.println("finish : punkteerkennen21");
return y_speed;
}
public void police()
{
count--;
System.out.println("Police");
if(count == 0)
{
end();
}
setCount(count);
}
public void end()
{
System.out.println("end");
end = 1;
setEnd(end);
}
}
die classe Futter, hab ich nicht hoch gestellt, da es zuwenig platz hat, ich hoffe ihr braucht die nicht....
vielen Dank