2016-04-19 20 views
0

今日の質問は私の心を揺さぶるものです。私はプログラムを作成しています。ユーザーがジャンプして左または右に移動できるようにしています。問題はプログラムをフリーズしようとするたびにです...私のコードの背後にあるアイデアは、ユーザーがスペース(ジャンプ)矩形が「ジャンプ」し、矩形のyが障害物の上の特定の高さにある場合(この場合は、レンダリングがレンダリングされた矩形、レンガ、レンガ、レンガが障害です)、アニメーションは停止し、障害物の上にある間、次のコマンドを待つことになっています。これを行うには、whileループとチェックの繰り返しごとにstayOnBrickメソッドが呼び出されます。ジャンプ中にyが必要な範囲内にあれば、yが真であればboolean jump = trueを設定し、次の反復でループを解除し、yを必要な値に設定する必要があります。しかし、スペースが押されても、何も起こらない、または私はプログラムがフリーズすると言うべきですか?思考?特定のバリアに達するとアニメーションを停止するにはどうすればよいですか?

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;} 
    } 
} 

答えて

2

私はプログラムは、私が問題の原因についてConcurrency in Swingを見て持つことから始めたい

をフリーズジャンプしようとしたときに。

可能な解決策はHow to use Swing Timersです。

私もKeyListener

にフォーカス関連の問題を解決するためにHow to Use Key Bindingsを見たお勧めしますそして、あなたはHow to make sprite jump in java?JApplet creates a ball that bounces and gets progressively less high in Java役立つ

を見つけるかもしれません
関連する問題