1

ユーザーが 4 つの矢印キー (または wasd) を押したときに、単純なフレーム上でキャラクターを動かそうとしています。キャラクターは、矢印キーを押している間は動き続け、ユーザーがキーを離すと動きを止めます。

ほとんどの場合、これは動いています。ただし、方向をすばやく切り替えると、奇妙な遅延が発生します。キーボードボタンを押すと、Javaのキーリスナーはこれをキーの「クリック」、つまりボタンが実際に押されていると判断する前に素早く押して離すと解釈するようです。

そのため、プレーヤー モデルの動きが少しカクカクします。

これを正しく解釈していますか?誰かがこれを理解できるなら、これが私のコードです。

キー リリースを処理するコード

    @Override
public void keyReleased(KeyEvent e) 
{

    switch(e.getKeyCode())
    {

    case KeyEvent.VK_W:
    case KeyEvent.VK_UP:
    case KeyEvent.VK_A:
    case KeyEvent.VK_LEFT:
    case KeyEvent.VK_S:
    case KeyEvent.VK_DOWN:
    case KeyEvent.VK_D:
    case KeyEvent.VK_RIGHT:

        GameController.hero.stopMoving();
        break;

    case KeyEvent.VK_SPACE:
        break;
    case KeyEvent.VK_ESCAPE:
        break;

    }

    keyPress = false;
} 

キープレスを処理する私のコード

@Override
public void keyPressed(KeyEvent e) 
{

    keyPress = true;
    keyCode = e.getKeyCode();


    switch(e.getKeyCode())
    {


    case KeyEvent.VK_W:
    case KeyEvent.VK_UP:
        GameController.hero.setSpeedBase(new Point(0,-1));
        break;
    case KeyEvent.VK_A:
    case KeyEvent.VK_LEFT:
        GameController.hero.setSpeedBase(new Point(-1,0));
        break;
    case KeyEvent.VK_S:
    case KeyEvent.VK_DOWN:
        GameController.hero.setSpeedBase(new Point(0,1));
        break;
    case KeyEvent.VK_D:
    case KeyEvent.VK_RIGHT:
        GameController.hero.setSpeedBase(new Point(1,0));
        break;
        }

}

これで十分な情報だと思います。どんな助けでも大歓迎です!私ができる説明があれば教えてください。これを行う簡単な方法はありますか?

4

1 に答える 1

1

これは古い投稿ですが、このページにアクセスする可能性のある将来の人々のために、ここに私の答えがあります

KeyListener は、キーの押下をテキスト エディターとして処理します。キーを押したままにすると、エディターがキーを繰り返し始めるまでに遅延があることがわかります。

Java でゲームを作成するには、通常、入力を処理する別のスレッドを作成します。KeyListener は、ゲーム ループでチェックされるいくつかのフラグを変更するだけです。

しばらく前にこれに関するビデオを作成しました。キャプションはポルトガル語ですが、コードは目に見えるフォント サイズで表示されています。

https://www.youtube.com/watch?v=f7M9eAkNS8s

よろしくお願いします。

于 2016-01-11T10:36:47.497 に答える