2017-05-23 3 views
0

私は別のスレッドで入力操作をしたい、私はどのようなメソッドを実行する必要がありますか?それともこれを行うより良い方法かもしれませんか?別のスレッドでkeylistenerを使用するには?

public class Player implements Runnable, KeyListener{ 

    int speed; 

    public Player() 
    { 
     speed = 0; 
    } 

    @Override 
    public void run() 
    {  
     //what should i write here? 
    } 

    @Override 
    public void keyTyped(KeyEvent e) {} 

    @Override 
    public void keyPressed(KeyEvent e) 
    { 
     startMove(e); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) 
    { 
     endMove(e); 
    } 


     public void startMove(KeyEvent e) 
    {   
     int key = e.getKeyCode(); 

     switch (key) { 
      case KeyEvent.VK_W: 
       speed = 2; 
       break; 
      case KeyEvent.VK_S: 
       speed = -2; 
       break; 
      default: 
       break; 
     } 
    } 

    public void endMove(KeyEvent e) 
    { 
     int key = e.getKeyCode(); 

     if(key == KeyEvent.VK_W) 
      speed = 0; 
     if(key == KeyEvent.VK_S) 
      speed = 0; 

    } 
} 

このコードは、キーイベントを検出し、キーコードコールstartMove()またはendMove()関数に依存しなければなりません。そして、それはすべて同じスレッドになければなりません。実行中にループを使用し、何らかの形で関数を置く必要がありますか?

+0

何か理由がない限り、スレッドの代わりに 'Timer'を使うべきです。 https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html – Radiodef

+0

@Radiodefですが、メインスレッドにはありますか? – AnorLondo

答えて

0

あなたのデザインは「上向き」であると思います。

まず、UIイベント常にAWT event dispatcher threadに届きます。

あなたのコードが何をしているのですか?いくつかのPlayerオブジェクトの速度を変更します。 別のスレッドが必要なのはどこですか?

意味:すでに他の「ゲームコントローラスレッド」を使用しているはずです。そのスレッドで実行されるコードは、の値をチェックします。その値はspeedです。それを利用しています。

あなたの開始/終了方法はフィールドを変更するだけです。それは大丈夫です。そして、あなたはそれをそのままにしておくべきです。そして、そのクラス外の他のコードを、それらのマウスイベントによって変更された速度に基づいて「そのことを行う」ようにしてください。

関連する問題