1

私は Java ゲームの開発に取り組んでいます。私が直面している問題は、キー ストロークの実装です。私が持っているコードは KeyListeners を適切に実装していますが、ゲーム ウィンドウまたはその外側をクリックするとすぐに KeyListener が機能しなくなります。

ウィンドウを最小化して元に戻すことができ、KeyListener が再び機能するため、これは重要な問題であると確信しています。

私のセットアップは、描画用の Canvas オブジェクトを含む JFrame です。JFrame に追加する通常の KeyListener があります。

ゲームをクリックすると、Canvas がフォーカスされるのではないでしょうか? ただし、isFocasable() を false に設定しているため、そうすべきではありません。

混乱がないように、私が使用しているコードの一部を次に示します。

ここでは、画面とキャンバスを作成します

public final void initScreen(DisplayMode dm, boolean fs, boolean vs)
{
    screen = new EScreen (dm, fs, vs); 
    canvas = new EGameCanvas (screen);
    canvas.setFocusable (false);
    screen.add(canvas);

    keyMapManager = KeyMapManager.getInstance (this);

    if (fs) {
        screen.setFullScreen ();
    }
    else {
        screen.setWindowed ();
    }
}

ここに KeyListener を追加します (KeyMap は KeyListener のみを実装することに注意してください)。

public boolean setActiveKeyMap(String newKeyMap)
{
    if (keyMaps.containsKey(newKeyMap)) {
        screen.removeKeyListener (activeKeyMap);
        activeKeyMap = keyMaps.get (newKeyMap);
        screen.addKeyListener (keyMaps.get (newKeyMap));

        return true;
    }
    return false;
}

そして、これが単に変数を変更した私のkeyPressedイベントです

public void keyPressed(KeyEvent ev) {
    if (ev.getKeyCode() == KeyEvent.VK_ESCAPE)
        game.setIsRunning (false);
}

このコードはすべて正常に機能することに注意してください。つまり、ゲーム ウィンドウをクリックするまでは。どこにも MouseListeners を実装していません。また、私はこのコードを実装します:

screen.setFocusTraversalKeysEnabled (false);

最後に、ご覧のとおり、私のゲームはフルスクリーン モードとウィンドウ モードの両方を処理します。この問題は両方で発生します。

4

1 に答える 1

2

私のゲームにも同じ構成があります。JFrame の代わりに keyListener をキャンバスに追加します。

JFrame にイベントを送信させたい場合は、JFrame とキャンバス (同じ keyListener) の両方に追加することもできます。

canvas.addKeyListener(this);

*this: オブジェクトが KeyListener インターフェイスを実装していると仮定します

于 2012-11-17T21:03:24.340 に答える