# Jump n Run Keylistener und Schleifen



## kivver (19. Nov 2007)

Hallo Leute,
ich habe ein Problem mit dem Keylistener und zwar arbeitet der Schleife erst komplett ab und übt sie dann aus anstatt jeden einzelnen schritt anzuzeigen:


```
//Implementierung des KeyListeners zum Anziegen
        KeyListener l = new KeyListener(){
            public void keyPressed(KeyEvent event){
               
                if (event.getKeyCode() == KeyEvent.VK_RIGHT){
                    m.horizontalBewegen(mariosKmh);
                    abfrage();
                }
                if (event.getKeyCode() == KeyEvent.VK_LEFT){
                    m.horizontalBewegen(-mariosKmh);
                    abfrage();
                }
                if (event.getKeyCode() == KeyEvent.VK_UP){
                    m.vertikalBewegen(-mariosKmh);
                    abfrage();
                }
                if (event.getKeyCode() == KeyEvent.VK_DOWN){
                    m.vertikalBewegen(mariosKmh);
                    abfrage();
                }
                if (event.getKeyCode() == KeyEvent.VK_SPACE){
                    m.jump();
                    abfrage();
                }  
            }  
            public void keyReleased(KeyEvent event){
            }
            public void keyTyped(KeyEvent event){
            }        
        };
        //Hinzufügen des KeyListeners zur Leinwand
        Leinwand leinwand = Leinwand.gibLeinwand();
        leinwand.addKeyListener(l);
```

Und jetzt das "jump":



```
public void horizontalBewegen(int geschwindigkeitB){
            geschwindigkeit = geschwindigkeitB;
            mario.horizontalBewegen(geschwindigkeit);
            xposUL = xposUL + geschwindigkeit;
            xposUR = xposUL + geschwindigkeit;  
        }
        
        
        public void vertikalBewegen(int geschwindigkeitB){
            geschwindigkeit = geschwindigkeitB;
            mario.vertikalBewegen(geschwindigkeit);
            yposOL = yposOL - geschwindigkeit;
            yposUL = yposUL - geschwindigkeit;  
        }
	public void jump(){
	    for (int i = 11; i>0; i--){
		mario.vartikalBewegen(-geschwindigkeit * i);
	    }
	    for (int j = 0; i<11; i++){
		mario.vertikalBewegen(geschwindigkeit *j);
	    }
	}
```


----------



## SlaterB (19. Nov 2007)

lasse das ganze in einem externen Thread ablaufen,
mache Thread.sleep(10) zwischen jeden Schritt und vielleicht noch einen repaint()-Aufruf

kennst du überhaupt Grundlagen des Zeichnens in Swing?
ohne ausführliche Beispiele ist das ja schwer selber nachzuvollziehen..


----------



## Lulumann6 (19. Nov 2007)

so kann man das doch nicht machen.
die x und y koordinaten musst du in deinem thread erneuern lassen, dann brauchst du noch eine schwerkraft für den fall, dass dein mario in der luft ist. und dort wo du mario springen lässt gibst du ihm einfach eine bestimmte geschwindigkeit nach oben und die schwerkraft zieht ihn wieder nach unten.


----------



## kivver (19. Nov 2007)

dass ich ein slepp eingefügt habe, hat leider auch nicht funktioniert (hatte ich schon ausprobiert)
und repaint auch nicht

@Lulumann: das is nur jetzt schnell zusammengelegt, eigentlich will ich das mit den normalen Formel (v=v0+g*t) ausrechnen dass war jetzt nur ein bsp.


----------



## Lulumann6 (19. Nov 2007)

ohne sleep und repaint wirst du ganz bestimmt kein spiel programmieren können.


hier hat sich jemand schon die mühe gemacht ein kleines deutsches tuorial für die anfänge in der spieleprogrammierung zu machen. und hier der link direkt zum tutorial. dort wird alles sehr gut erklärt finde ich.


----------



## kivver (19. Nov 2007)

Lulumann6 hat gesagt.:
			
		

> ohne sleep und repaint wirst du ganz bestimmt kein spiel programmieren können.



das hab ich ja auch nicht vor aber in diesem Fall hat es nix gebracht

Aber ich hatte eigentlich nur eine Frage gestellt:

Warum funktionieren Schleifen nicht, wenn man sie durch den Keylistener aufruft und wie kann man das beheben!???


----------



## EgonOlsen (19. Nov 2007)

Das klappt so nicht, weil der KeyListener und das Zeichnen (sofern du kein aktives Rendering zu verwendest, was nicht der Fall zu sein scheint) im gleichen Thread, dem AWT-Event-Thread, ablaufen. Dadurch wird erst die komplette Schleife durchlaufen, dann siehst du den Endzustand beim nächsten Zeichnen.


----------



## kivver (19. Nov 2007)

Also muss ich das alles in einen anderen Thread packen?

oder was kann ich sonst noch mach: aktives Rendering?? könntest du mir das mal erklären??

Aber erstmal Danke


----------



## SlaterB (20. Nov 2007)

nebenbei eine Meinung:
Lulumann6 hat doch zwei Links gepostet, hast du die bereits eine Woche lang durchgearbeitet?
kaum zu glauben in der kurzen Zeit gestern 

warum hier alles wiederholen wenn du es doch im Tutorial korrekt nachlesen kannst?
ohne diese Grundlagen wirst du noch zig Nachfragen haben


----------

