2009-07-15 15 views
1

私はオンラインチュートリアルから、Javaでゲームを書く方法を教えています。私は、Javaアプレットを使ってPongゲームを作成しています。各パドルは1対1の競争のために異なるキーから制御されます。両方のユーザーが異なる時間にキーに当たっている場合、これはうまく動作します。 1つのキーが押されているときに別のキーが押されている(例:矢印キーを押し続けると、ユーザー2は「S」キーを保持します)、2番目のキーが最初のパドルを上書きし、最初のパドルの移動が停止します。私はスレッドを使用する必要があると推測していますが、私はそれらについて多くのことを知らず、使い方や実装方法を理解できません。 2つ(またはそれ以上)のキーが押されているときに、どのように処理するのですか?Java Appletで複数のキーを押さえる方法を教えてください。

ボーナス:私はスレッドについてはあまり知らないと言ったように - 私はボール/パックが他のすべてのことが起こっている間に動き回るためにも必要と思っています。それが正しい場合は、どうすれば入力を必要としないものにスレッドを置くことができますか?あなたは助けるため

おかげで、 DJ

答えて

3

あなたが通常行うことは、すべてのキー押しの状態を覚えておくことです。

アクションの配列(または必要に応じてすべてのキーの配列)を保持します。 keyDownイベントは、例えば、

boolean actions[12];... 
... 

public boolean keyDown(Event e, int key) { 
if (key == 'a') { 
    actions[ACTION_LEFT] = true; 
    } 
.. 
} 

キーを放すと、keyupイベントをキャッチして、アクションをfalseに設定する必要があります。

は移動ロジックでは、ちょうどあなたが定期的にKeyDownイベント/からkeyupイベント間の移動イベントを発射する Swing Timerを使用することができますキー押下

if(actions[ACTION_LEFT] == true) 
    moveLeft(); 
if(actions[ACTION_RIGTH] == true) 
    moveRight(); 
+1

これをLou Flcoのゲームループの解答と組み合わせてください。キー押下の状態をチェックすることは、そのループの中にあるでしょう。 – Ricket

+0

ありがとう!このソリューションは私のために働いた。 – Daniel

3

通常の代わりに、スレッドは、ゲームはゲームループ(それをグーグル)と呼ばれるものを使用します。

http://en.wikipedia.org/wiki/Game_programming

基本的な考え方は、とにかく

Loop 
    Get all inputs 
    Get game clock 
    Update state based on clock and inputs 
    Update Display 
    Limit frame rate if you need to 

ある - 代わりにキーボードイベントを取得する - あなたが特定の時点でキーボードの状態を確認してください。このコードは、それはあなたがあなたのループの中で見変数を設定するイベントを使用するJava

http://www.gamedev.net/reference/articles/article2439.asp

のためにそれを行うようです。

+0

ありがとうございます。私は前に "ゲームループ"について聞いたことはありませんでした。その2番目のリンクは素晴らしいものです。再度、感謝します! – Daniel

+0

この回答は、いいえと結びついて、私に頭痛と時間を救ってくれました。ありがとう! – svarog

0

私が間違っていない場合は、あなたのアプレットでkeyUp()とkeyDown()メソッドを自由に使用できます。 keyDownでフラグを設定しようとしましたが、それをkeyUpで解除しましたか?たとえば、

public boolean keyDown(Event e, int key) 
    { 
     if (key == 'a') { 
     player1.go("left") 
     } 
    } 

    public boolean keyUp(Event e, int key) 
    { 
     if (key == 'a') { 
     player1.stop("left") 
     } 
    } 

ちょっとしたアイデア。私はこれに対処するための標準的な方法があると確信しています。

0

の状態を確認することができます。

+0

あなたのご意見ありがとうございます。 – Daniel

1

誰かがこの質問にどのように答えてしまったかを知りたいと思っていた人のために。次のように私のKeyDown()とkeyUpイベント()メソッドは、次のとおりです。うまくいけば、

public boolean keyDown(Event e, int key) 
{ 
     message = key + "pressed"; 

     //right paddle 
     if(key == 1005) 
     { 
      rpaddle_up = true; 
     } 
     if(key == 1004) 
     { 
      rpaddle_down = true; 
     } 

     //left paddle 
     if(key == 115) 
     { 
      lpaddle_up= true; 
     } 
     if(key == 119) 
     { 
      lpaddle_down=true; 
     } 

     //x key = exit 
     if(key == 'x') 
      System.exit(0); 
     return true;   
    } 

public boolean keyUp(Event e, int key) 
    { 
     //right paddle 
     if(key == 1005) 
     { 
      rpaddle_up = false; 
     } 
     if(key == 1004) 
     { 
      rpaddle_down = false; 
     } 

     //left paddle 
     if(key == 115) 
     { 
      lpaddle_up= false; 
     } 
     if(key == 119) 
     { 
      lpaddle_down=false; 
     } 
     return true; 
    } 

誰かが同じ問題を持っている場合、これは彼らを助けるだろう。あなたのご意見とご協力のおかげで皆様に感謝します。

関連する問題