Java: Spielfigur spingen lassen :)

headaxX

Cadet 3rd Year
Registriert
März 2007
Beiträge
34
Hi,

Wir sollen als Hausarbeit in "Strukturiertes Problemlösen" mit Java ein kleines Spiel programmieren.
Ich habe vor ein trashiges "Jump'n'Run"-Game zu machen. Nun bin ich bei dessen Visualisierung
auf ein kleines Problem gestoßen. Ich möchte nach der Betätigung der "W"-Taste einen Sprung darstellen lassen. Mit dem KeyListener funktioniert soweit alles. Es dreht sich wie gesagt nur um die Visualisierung. In Echtzeit wird der Sprung logischerweiße viel zu schnell berechnet und gezeichnet. Somit sieht man nur eine Verschiebung des Bildes auf der X-Achse.
Nun habe ich folgendermaßen versucht das ganze etwas zu verlangsamen, um die Sprungparabel sichtbar zu machen:

public void keyTyped(KeyEvent k)
{
//Variablen
char cKEY = k.getKeyChar();
int i = 0;
int in = 0;
long lTime = 0;

//Delay-Timer
Date timer = new Date();

switch(cKEY)
{
case 'W':
case 'w': if(this.iY != 0)
{
while(i < 50)
{
lTime = timer.getTime();
if( i < 25)
{
this.iY = this.iY + 1;
}
else
{
this.iY = this.iY - 1;
}
this.iX = this.iX + 1;

Bild.setBounds(iX,iY,401,600);

while(true)
{
long lTime2 = timer.getTime();
if(lTime2 == (lTime+50))
{
i++;
break;
}
}
}
i = 0;
}
break;
}
}


Nur ist danach die Applikation nicht mehr ansprechbar und ich muss sie terminieren.
Kann mir jemand diesen "Freeze" und die Umgehung dieses erklären und/oder mir einen anderen Lösungsvorschlag geben?.

Vielen Dank im Vorraus!

MfG headaxX
 
Spontan würd ich mal vermuten, dass der Vergleich if(lTime2 == (lTime+50)) nie exakt zutrifft, daher wär es vielleicht besser, das so zu formulieren:

if(lTime2 >= (lTime+50))
 
Ja, das wäre eine logische Fehlerquelle gewesen.
Aber leider hat es nichts gebracht :(. Es freezed immer noch.
 
Ich kann zwar kein Java aber ich schätze, dass die while schleife nicht verlassen wird, da (jedenfalls in C# afaik) mit dem "break;" nur der aktuelle Schleifendurchlauf, jedoch nicht die Schleife verlassen wird. Du müsstest ein Variable definieren, die dann statt diesem "break;" auf false gesetzt wird, also:
Code:
bool inschleife = true;
while(inschleife == true)
{
long lTime2 = timer.getTime();
if(lTime2 >= (lTime+50))
{
i++;
inschleife = false;
}
}

(wäre jedenfalls mit C# so, ich kann wie gesagt kein Java, wobei die sich ja sehr ähnlich sind.)

mfg Backslash
 
In Java wird die ganze Schleife beendet, daher geht das leider auch nicht.
 
Schau Dir mal in der API den MediaTracker an. Mit dieser Klasse kannst Du zum Beispiel vorgefrertige Animationen so cachen, dass sie erst angezeigt werden, wenn sie fertig geladen ist.
Ansonsten gibt es in Java ja auch noch das Attribut Wait.
Zum Nachschlagen von solchen sachen kann ich Dir auch noch das online-Buch von Guido krüger empfehlen:
Javabuch
 
Zuletzt bearbeitet:
Deine while( true )-Schleife ist nicht unbedingt der eleganteste Stil. Definiere eine Schleife mit der Abbruchbedingung aus der if-Abfrage und verzichte auf das break.

Code:
public void keyTyped(KeyEvent k)
{
	//Variablen
	char cKEY = k.getKeyChar();
	int i = 0;
	int in = 0;
	long lTime = 0;
	long lTime2 = 0;
	//Delay-Timer
	Date timer = new Date();
	
	switch(cKEY)
	{
		case 'W':
		case 'w': if(this.iY != 0)
		{
			while(i < 50)
			{
				lTime = timer.getTime();
				if( i < 25)
				{
					this.iY = this.iY + 1;
				}
				else
				{
					this.iY = this.iY - 1;
				}
				this.iX = this.iX + 1;
				
				Bild.setBounds(iX,iY,401,600);
				
				do
				{
					lTime2 = timer.getTime();
				} while( lTime2 < (lTime+50) );
				
				i++;
			}
			i = 0;
		}
		break;
	}
}

Ich würde es so umsetzen, ob's funktioniert kann ich dir aber leider nicht sagen. Ich denke aber, dein Problem ist damit noch nicht gelöst. Ich würde mir an deiner Stelle nochmal ansehen was bei

k.getKeyChar();
timer.getTime();
und
Bild.setBounds(iX,iY,401,600);

genau passiert. Kannst du das Programm mit Breakpoints debuggen oder schrittweise ausführen lassen? Wenn ja tu das und schau wo es hängenbleibt.

j o e
 
Zurück
Oben