2016-04-19 5 views
0

Die heutige Frage rasselt mir in den Sinn. Ich erstelle ein Programm, das dem Benutzer erlaubt, nach links oder rechts zu springen und zu springen. Das Problem ist, dass jedes Mal, wenn ich versuche zu springen, das Programm einfriert ... Die Idee hinter meinem Code ist einfach, wann immer der Benutzer das Leerzeichen drückt (springt) Das Rechteck "springt" nach oben und wenn sich das y des Rechtecks ​​innerhalb einer bestimmten Höhe über dem Hindernis befindet (in diesem Fall ist ein Rechteck mit den Dimensionen brickx, bricky, brickh und brickh das Hindernis), soll die Animation stoppen und das Rechteck soll auf den nächsten Befehl warten, während er oben auf dem Hindernis steht. Dazu wird stayOnBrick während jeder Iteration der while-Schleife aufgerufen und überprüft; während des Sprungs, wenn y innerhalb des benötigten Bereichs ist, und wenn y es ist, dann setzt der boolesche Sprung = true, was die Schleife bei der nächsten Iteration unterbrechen und y auf den benötigten Wert setzen sollte. Aber wenn der Raum gedrückt wird, passiert nichts, oder sollte ich sagen, das Programm friert ein. Gedanken?Wie kann ich eine Animation anhalten, nachdem eine bestimmte Barriere erreicht wurde?

import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class KeyTest extends Core implements KeyListener{ 
    Window w; 
    public int x,y; 
    boolean jump = true; 
    public int brickx, bricky, brickw, brickh; 
    public static void main(String args[]){ 
     new KeyTest().run(); 
    } 

    private String mess = ""; 

    //init also called init from superclass 
    public void init(){ 
     super.init(); 
     Window w = s.getFullScreenWindow(); 
     w.setFocusTraversalKeysEnabled(false); 
     w.addKeyListener(this); 
     y = s.getHeight()-15; 
     mess = "Press esc to exit"; 
    } 


    @Override 
    public void keyTyped(KeyEvent e) { 
     // TODO Auto-generated method stub 
     e.consume(); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 

     // TODO Auto-generated method stub 
     int keyCode = e.getKeyCode(); 
     if(keyCode == KeyEvent.VK_ESCAPE){ 
      stop(); 
     }else if(keyCode == KeyEvent.VK_SPACE){ 
      mess = "Pressed: " + KeyEvent.getKeyText(keyCode); 
      while(y>s.getHeight()-200){ 
       stayOnBrick(); 
       if(jump==false){break;} 
       else{ try{ 
        y-=20; 
        w.repaint(); 
        Thread.sleep(40); 
       }catch(Exception jumpError){ 
        System.out.println("Error in Jumping"); 
        } 
       } 

      while(y<s.getHeight()-15){ 
       stayOnBrick(); 
       if(jump==false){ 
        w.repaint(); 
        break;} 
       else{ 
       try{ 
        y+=20; 
        Thread.sleep(40); 
        w.repaint(); 
       }catch(Exception jumpError){ 
        System.out.println("Error in Jumping"); 
         } 
        } 
       } 
      } 
     } 

     else if(keyCode == e.VK_RIGHT){ 
      if(x>=s.getWidth()-30){x=s.getWidth()-30;} 
       x+=20; 
       w.repaint(); 
      } 
     else if(keyCode == e.VK_LEFT){ 
      if(x<=0){x=0;} 
      x-=20; 
      w.repaint(); 
     } 

     e.consume(); 
    } 


    @Override 
    public void keyReleased(KeyEvent e) { 
     // TODO Auto-generated method stub 
     int keyCode = e.getKeyCode(); 
     mess = "Released: " + KeyEvent.getKeyText(keyCode); 
     jump = true; 
     e.consume(); 
    } 
    @Override 
    public synchronized void draw(Graphics2D g){ 
     brickx=0; bricky=s.getHeight()-100; brickw=300; brickh=20; 
     Window w = s.getFullScreenWindow(); 
     g.setColor(w.getBackground()); 
     g.fillRect(0, 0, s.getWidth(), s.getHeight()); 
     g.setColor(w.getForeground()); 
     g.fillRect(x, y, 30, 15); 
     g.drawString(mess, 30, 30); 
     g.setColor(Color.BLUE); 
     g.fillRect(brickx, bricky, brickw, brickh); 


    } 

    public void stayOnBrick(){ 
     if(y<bricky && y>bricky-30){ 
      y=bricky-15; 
      jump = false; 
     } 
     else{jump = true;} 
    } 
} 

Antwort

2

wenn ich versuche, das Programm zu springen friert

ich mit einem Blick auf Concurrency in Swing für den Grund für das Problem beginnen würde.

Ich würde vorschlagen, einen Blick auf How to use Swing Timers für eine mögliche Lösung.

Ich würde auch empfehlen, einen Blick auf How to Use Key Bindings mit dem Fokus Fragen mit KeyListener

zu lösen Und Sie könnten How to make sprite jump in java? und JApplet creates a ball that bounces and gets progressively less high in Java hilfreich

finden