Hmja, der Klassiker: Man sollte NIE auf einer Component ‘getGraphics’ aufrufen (wenn man nicht ganz genau weiß, was man da tut).
Dazu kommen noch einige … Schwierigkeiten was Threads angeht. (Swing-Components sollten NUR auf dem Event-Dispatch-Thread verändert werden). Und wenn eine Methode wie
private void delay(int pDelay) //Erzeugt eine Verz?gerung.
{
long time = System.currentTimeMillis(); //Gibt die vergange Zeit seit 1970 in ms zur?ck.
long timeDelta = System.currentTimeMillis();
while(timeDelta != (time + pDelay)) //Solange das Zeit-Delta ungleich pDelay ist-
{
timeDelta = System.currentTimeMillis(); //wird das Zeit-Delta neu bestimmt.
}
}
funktioniert, dann ist das Glück. Das setzt nämlich voraus, dass genau die richtige Millisekunde getroffen wird. Wenn im gleichen Moment eine E-Mail ankommt, und der Computer meint, dieses kleine Info-Fenster da unten rechts einzublenden wäre wichtiger, als
timeDelta = System.currentTimeMillis();
auszuführen, läuft die Schleife in ewig weiter. (Oder zumindest sehr lange ;))
ETWAS abschwächen könnte man dieses Problem zwar durch
while(timeDelta < (time + pDelay)) statt
while(timeDelta != (time + pDelay))
aber diese delay-Methode sollte wohl ohnehin bestenfalls aus einem
private void delay(int pDelay) //Erzeugt eine Verz?gerung.
{
try
{
Thread.sleep(pDelay);
}
catch (InterrupedException e)
{
System.err.println("Thread was interrupted");
Thread.currentThread().interrupt();
}
}
bestehen.
Das taucht noch an anderes Stellen auf. Auch so eine Schleife wie
private void itemFall_X() //Bestimmt die neue x-Position des Items auf bestimmter Bahn.
{
while( (item_X != 50) && //Solange xItem nicht eine dieser Zahlen ist-
(item_X != 150) &&
(item_X != 250) &&
(item_X != 350) &&
(item_X != 450))
{
item_X = r.nextInt(450); //wird xItem erneut per Random bestimmt.
}
}
kann potentiell ewig laufen. Besser wäre ein
private void itemFall_X() //Bestimmt die neue x-Position des Items auf bestimmter Bahn.
{
itemX = 50 + r.nextInt(5) * 100;
}
Aber das ist auch eher eine Kleinigkeit.
Wenn das möglichst schnell zum laufen gebracht werden muss, solltest du vermutlich eine Klasse erstellen wie
public class PaintPanel extends JPanel
{
private Data data = ... im Konstruktor übergeben...
public void paintComponent(Graphics g)
{
super.paintComponent(g);
// Male hier ALLES, d.h. das Spielfeld
// wie bei "paintField" aber OHNE die Animation!!!
// und den Catcher und das Item auf Basis
// der Daten, die in "data" stehen
}
}
Erstelle so ein Panel (übergib’ ihm das Data-Objekt) und lege dieses Panel in den JFrame.
Nach jedem Spielschritt kann man dann (auf diesem Panel oder dem Frame) “repaint()” aufrufen, um den neuen Zustand zu zeichnen.
Die hübsche Animation beim Malen des Spielfeldes da jetzt einzubauen wäre etwas frickelig, und in Anbetracht der knappen Zeit wenig ratsam.
Vielleicht gibt’s noch ein paar Stolpersteine, ich schau’ heut abend vielleicht nochmal hier rein.