1

LWJGLのキーボードクラスを使用しており、現在使用しています

if(Keyboard.isKeyDown(Keyboard.KEY_A))
{
   //move left
}
else if(Keyboard.isKeyDown(Keyboard.KEY_D))
{
   //move right
}

「a」キーを下にすると「d」キーは右に移動しますが、「d」キーを下にすると「a」キーは「else」部分のために右に移動し続けます。

私は他の人なしでそれを試し、両方を実行させましたが、両方のキーが押された場合、動きはありません

最後に押されたキーからの入力のみを取得できるコードを探しています。

また、ソリューションが他のキーの動作を停止できないように(「w」と「s」を使用して)上下に移動できる必要があります。「a」または「d」のみです。

ありがとう。アレックス。

4

2 に答える 2

1

現在のイベントを判別するために使用Keyboard.getEventKeyStateし、続いてKeyboard.getEventKeyこれがどのキーであるかを判別します。次に、を介して繰り返しイベントを無効にする必要がありますKeyboard.enableRepeatEvents。現在の動きの状態を維持し、これらのイベントに基づいて変化し、すべてのティックがそれに応じて動きます。簡単なスケッチとして、次のようなもの:

Keyboard.enableRepeatEvents(false);
...
/* in your game update routine */
final int key = Keyboard.getEventKey();
final boolean pressed = Keyboard.getEventKeyState();
final Direction dir = Direction.of(key);
if (pressed) {
  movement = dir;
} else if (movement != Direction.NONE && movement == dir) {
  movement = Direction.NONE;
}
...
/* later on, use movement to determine which direction to move */

上記の例でDirection.ofは、押されたキーの適切な方向を返します。

enum Direction {
  NONE, LEFT, RIGHT, DOWN, UP;

  static Direction of(final int key) {
    switch (key) {
      case Keyboard.KEY_A:
        return Direction.LEFT;
      case Keyboard.KEY_D:
        return Direction.RIGHT;
      case Keyboard.KEY_W:
        return Direction.UP;
      case Keyboard.KEY_S:
        return Direction.DOWN;
      default:
        return Direction.NONE;
    }
  }
}
于 2012-08-08T22:11:38.300 に答える
0

これでも問題が解決する場合はIdkを使用しますが、最初に押されたキーを放すまでロックすることができます。この変数をメソッドの外に置くことをお勧めします(正しく覚えていれば、フィールドと呼ばれます)。これにより、どのクラスからでもアクセスでき、updateが呼び出されるたびにインスタンス化されなくなります。これは次のようになります。

boolean isHorizontalLocked = false;
String lockedKey = null;

その後、updateメソッドで次のように記述します。

if (!isHorizontalLocked) {
   if (input.isKeyDown("KEY_A")) {
       isHorizontalLocked = true;
       lockedKey = "A";
   }
   else if (input.isKeyDown("KEY_D")) {
       isHorizontalLocked = true;
       lockedKey = "D";
   }
   else {
       isHorizontalLocked = false;
   }
}
else if (isHorizontalLocked) {
   if (lockedKey == "A") {
       if (input.isKeyDown("KEY_A")) {
          //move left
       }
       if (!input.isKeyDown("KEY_A")) {
          lockedKey = null;
          isHorizontalLocked = false;
       }
   }
   else if (lockedKey == "D") {
       if (input.isKeyDown("KEY_D")) {
          //move right
       }
       if (!input.isKeyDown("KEY_D")) {
          lockedKey = null;
          isHorizontalLocked = false;
       }
   }
}

これでうまくいくと思いますが、誰かがエラーを見つけたら、私に知らせてください。修正します。

于 2016-10-18T06:11:01.570 に答える