2016-12-17 7 views
1

タイトルが示唆しているように、私のJavaゲームでは、スペースバーと他のキーを同時に押しても検出できません。Java KeyPressed - 他のキーがあまりにも多い場合にスペースバーが押されていると検出できない

たとえば、スペースバーはシュートキーで、矢印キーはプレーヤーを移動させます。上向き矢印キーと左向き矢印キーとスペースバーを押している場合は、弾丸を上にして左に撃たなければなりません。

しかし、デバッグに複数のSystem.out.println();を使用した後、私は2つのキーを押していると、押した場合にスペースバーを検出していないことがわかりました。

keyReleasedで次に
public void keyPressed(KeyEvent e) { 


if(e.getKeyCode() == 32){ 
    pressingSpacebar = true; 
    System.out.println("Spacebar pressed true"); 
} 


    // Up arrow key 
    if(e.getKeyCode() == 38){ 
     up = true; 
     System.out.println("Up = true"); 
    } 
    // Down arrow key 
    if(e.getKeyCode() == 40){ 
     down = true; 
     System.out.println("Down = true"); 

    } 
    // Right arrow key 
    if(e.getKeyCode() == 39){ 
     right = true; 
     System.out.println("Right = true"); 
    } 
    // Left arrow key 
    if(e.getKeyCode() == 37){ 
     left = true; 
     System.out.println("Left = true"); 
    } 
} 

if(pressingSpacebar){ 
     if(right == true && down == true && up == false && left == false){ 
      // Shoot bullet 
     } 
} 

スペースバーが検出されていない理由:

public void keyReleased(KeyEvent e) { 
    if(e.getKeyCode() == 38){ 
     up = false; 
     repaint(); 
    } 
    if(e.getKeyCode() == 40){ 
     down = false; 
     repaint(); 
    } 
    if(e.getKeyCode() == 39){ 
     right = false; 
     repaint(); 
    } 
    if(e.getKeyCode() == 37){ 
     left = false; 
     repaint(); 
    } 
    if(e.getKeyCode() == 32){ 
     pressingSpacebar = false; 
    } 
} 

これはあなたがスペースバーと複数のキーを押している場合、私はチェックしていますどのように?スペースバーが押されているかどうかをチェックしなければ、弾丸は正常に発射されますが、スペースバーをチェックするとそれは検出されません。

注:私はこの質問に類似した他の投稿を読んだが、回答はあまり役に立たなかった。私はそれがこのようなものになると、まったくの初心者ですので、簡単な答えを与えるか、少し説明してみてください。前もって感謝します!

+1

は、あなたがチェックする必要があります: http://stackoverflow.com/questions/2623995/swings-keylistener-and-multiple-keys-pressed-at-the-same-time – GoldenBolt

+0

GoldenBoltは右である、これは重複しています。 KeyReleasedイベントがない2つのKeyPressedイベントがある場合、2つのキーが同時に押されます。 – Sentry

+0

[この問題に対するMadProgrammerの回答](http://stackoverflow.com/a)に従って、[Key Bindings](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)を使用する方がよい/ 19823986/522444) –

答えて

1

最後に押されたキーに対してのみKeyEventが生成されるため、キーが押されたとき(たとえば、HashMapに追加した後)にキーを追跡し、その後にキーを削除する必要がありますHashMap。

ActionKeyStrokeをバインドするには、Key Bindings(KeyListenerではない)を使用することをお勧めします。

KeyboardAnimationの例はMotion Using the Keyboardです。これは、キーバインディングの詳細を説明し、上/下/右/左キーを操作する完全な実例を提供します。一般に、任意の2つのキーを同時に押し下げて斜めの動きを与えることができます。

ロジックは3つのキーでも機能しますが、すでに言及したように、キーボード自体は一度に押された多くのキーをサポートしていない可能性があります。

+0

私は家にいるときにそれをチェックしますが、まったく同じ問題を抱えた別のウェブサイトで最近投稿を見ました。彼らは左とスペースバーを押し上げることができました。それはうまくいっていましたが、右上のものとスペースバーは機能しませんでした。明らかに、彼はキーボードで何か問題があることを発見した。これが事実だろうか? – joey942

-1

すべての条件を1つのコンストラクト自体で試してください。

それを試してみてください -

if(pressingSpacebar && right && down && !up && !left){ 
      // Shoot bullet 
} 
+0

残念ながら私は同じ結果を持っています。しかし、私はそれが多くのクリーナーのように見えるので、この方法でそれを行います。 – joey942

0

私は同様の問題が発生しました。私は、同時にキーを押して、それを保持することが、各キーに対してキーを押されたイベントを2回以上引き起こすという保証はないことを知りました。あなたがそれに頼っているなら、あなたはそれを念頭に置いておく必要があります。

関連する問題