Problem bei Sprunganimation

Hallo zusammen,

ich programmiere gerade ein Jump and Run in Java. Dazu gehört natürlich auch logischerweise der Sprung. Den habe ich auch schon soweit programmiert, allerdings gibt es noch einen Fehler, dass wenn ich die Leertaste gedrückt halte, die Figur aus dem Bildschirm fliegt. Wenn ich sie nur einmal drücke, dann funktioniert der Sprung reibungslos. Das Problem möchte ich aber gerne umgehen, weil es ja schon die Spielbarkeit stark mindert. Deswegen bitte ich euch, mal meinen Java Code für meine Sprungklasse durchzuschauen, um zu schauen, ob ihr da meinen Fehler findet bzw. was ich als „Begrenzer“ ergänzen muss, um mein Problem zu lösen.

Ich bin leider erst seit einem Vierteljahr dabei, also kompletter Programmierneuling, für mein Studium ist das allerdings unabdingbar und bin auch jetzt immer fleißig dabei :stuck_out_tongue:

Hier also meine Klasse Jump (erbt von Thread)

public class Jump extends Thread{

	boolean finished = true;
	boolean highpoint = false;
	int sprunghöhe = 95;
	
	int firstY;
	
	Figur f;
	
	public Jump(Figur f) {
		this.f = f;
		firstY = f.figurY;
	}
	
	public void run(){
		finished = false;
		int delay = 3;
		
		while(!finished){
			jump();
			
			try{
				Thread.sleep(delay);
			}
			catch(Exception e){
				
			}
			
			f.getParent().repaint();
		}
		
		highpoint = false;
		
	}
	
	public void jump(){
		
		
		if(highpoint == false){
			
			f.figurY--;
			
			
		}
		if(f.figurY == (firstY - sprunghöhe)) {
			highpoint = true;
		}
		if(highpoint == true && f.figurY <= firstY){
			f.figurY++;

			if(f.figurY == firstY){
				finished = true;

			}
		}
		

	}
}```

Vielen Dank schon einmal im Voraus für eure Hilfe :)

Ob von Thread erben hier soviel Sinn macht? Evtl. ists besser, Runnable zu implementieren.
So wie es ausieht, liegt das Problem gar nicht an der Jumpklasse, sondern an dem Programmabschnitt, wo die Spacetaste abgefragt und der Jump-Thread instanziert und gestartet wird. An dieser Stelle müsstest du entweder abfragen, ob die Spacetaste zwischendurch losgelassen wurde oder ob grade ein Sprung abläuft.

BTW.: GANZ WICHTIG! Vermeide Umlaute, ß und andere Sonderzeichen im Quelltext!

Ja, man müßte sehen, wo und wie diese Klasse verwendet wird. Wenn du irgendwo sowas hast wie

SomeClass implements KeyListener
{
    public void keyPressed(...) {
        new Jump(f).start();
    }
}

werden da tausende von Threads gestartet, und alle zählen hoch…

Insgesamt ist die Implementierung eines Sprunges natürlich deutlich schwieriger, und man würde das ganz anders angehen, als im bisher geposteten code, aber … das würde jetzt (erstmal) zu weit führen…

und denglisch

Naja eigentlich hat man ja einen enzigen thread, in dem dann der gesamte spielablauf gesteuert wird…
hier vielleicht ein interessanter thread: http://www.java-gaming.org/index.php?topic=24220.0

Ansonsten siehts es vom prinzip „richtig“ aus. (Auch wenn das ein etwas… „harter“ sprung sein düfte…
@Marco13 : Hat man nicht normalerweise einfach soetwas wie int getJumpY(int jumpTicks){//physik formel für zB wurf} ?

[QUOTE=mymaksimus]und denglisch[/QUOTE][OT]Hmm…
grmpftblgl ist ein gültiger Methoden- oder Membername. Weder deutsch, englisch, denglisch oder sonst irgendwas. Ob die Bezeichnung irgendwann, irgendwo sinnvoll ist, sei mal dahingestellt. Aber bei Non-Ascii-Codes (32-127) sieht die Sache schon ganz anders aus. Da kann es zu unerwarteten Laufzeit- und/oder Kompilerfehlern kommen.[/OT]

[QUOTE=mymaksimus]
@Marco13 : Hat man nicht normalerweise einfach soetwas wie int getJumpY(int jumpTicks){//physik formel für zB wurf} ?[/QUOTE]

„Normalerweise“ ist so eine Sache. Das hängt eben davon ab, was man will :smiley: So ein „physikalisch basierter“ Sprung sieht eben ggf. cool aus. Bei vielen Spielen ist es aber (unrealistischerweise, aber als Zugeständnis ans Gameplay) möglich, „in der Luft“ noch nach links oder rechts zu steuern (ansonsten ist die Frage, wie bestimmt wird, die weit man nach links oder rechts springt… gar nicht so einfach und offensichtlich). In bezug auf die aktuelle Lösung (abgesehen von der Threadsache) ist das mit dem „sleep(delay)“ für ein delay=3 natürlich unsinnig, er schläft da vielleicht 0 oder vielleicht 10 ms… das ist viel zu ungenau. Und selbst wenn es genau wäre: Er würde sich nur hoch- und runter bewegen. Solange man nicht die Fallentschleunigung auf dem Weg nach oben und die Fallbeschleunigung auf dem Weg nach unten hat, wird es nie wie ein echter „Sprung“ aussehen…