1

Java Swing で簡単なゲームを作成しています。問題があります - のKeyListener反応が少し不安定/遅いようです。キャラクターは次のコードを使用して移動します。

// player control
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        switch(key){
        case(KeyEvent.VK_LEFT): dx = -speed; break;
        case(KeyEvent.VK_RIGHT): dx = speed; break;
        case(KeyEvent.VK_UP): dy = -speed; break;
        case(KeyEvent.VK_DOWN): dy = speed; break;
        }
    }

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();
    switch(key){
    case(KeyEvent.VK_LEFT): dx = 0; break;
    case(KeyEvent.VK_RIGHT): dx = 0; break;
    case(KeyEvent.VK_UP): dy = 0; break;
    case(KeyEvent.VK_DOWN): dy = 0; break;
    }
}

// this method is performed each time before redrawing the screen
public void step() {
    x += dx;
    y += dy;
}

ほとんどの場合は問題ありませんが、キーボードに反応する前にキャラクターがしばらく停止することがあります。キーボード入力をよりスムーズにする方法は?

4

2 に答える 2

1

みなさん、回答ありがとうございます!彼らは私が正しい軌道に乗るのを助けてくれました。

コメントで述べたように、ここで起こっていることは次のとおりです。たとえば、右のキーを押している場合、キャラクターが右に移動している場合、左のキーを押すと左に移動し始めます。ここで右キーを離すと、xSpeed はゼロにリセットされ、左キーを押したままなので、 が再度起動さKeyListenerれるまで待機する必要がkeyPressed()あります。「キーリピート速度」はデフォルトで設定されており、私が理解している限り、調整することはできません。

したがって、解決策は、現在押されているキーを追跡することです。これにより、左キーを押したまま右キーを離したときに、キャラクターの速度をゼロにする必要がなくなります。

コードを小さく保つために、少しわかりにくい例で申し訳ありません。

// Define keys: up, right, down, left
// 0 - not pressed, 1 - pressed
private int[] keys = {0, 0, 0, 0};

// player control
public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    // we set the corresponding 'key indicator' to 1 when it is pressed
    switch(key){
        case(KeyEvent.VK_LEFT): dx = -speed; keys[3] = 1; break; 
        case(KeyEvent.VK_RIGHT): dx = speed; keys[1] = 1; break;
        case(KeyEvent.VK_UP): dy = -speed; keys[0] = 1; break;
        case(KeyEvent.VK_DOWN): dy = speed; keys[2] = 1; break;
        case(KeyEvent.VK_SPACE): fireOn = true; break;
    }
}

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();
    // now before resetting the speed we check if the opposite key
    // is still pressed
    switch(key){
        case(KeyEvent.VK_LEFT): if(keys[1]==0){dx = 0;} keys[3] = 0; break;
        case(KeyEvent.VK_RIGHT): if(keys[3]==0){dx = 0;} keys[1] = 0; break;
        case(KeyEvent.VK_UP): if(keys[2]==0){dy = 0;} keys[0] = 0; break;
        case(KeyEvent.VK_DOWN): if(keys[0]==0){dy = 0;} keys[2] = 0; break;
        case(KeyEvent.VK_SPACE): fireOn = false; break;
    }
}
于 2012-06-05T19:34:47.283 に答える
1

別の方法が役立つ場合があります。

object.addKeyListener(new KeyAdapter() {
    @Override
    public void keyTyped(KeyEvent e) {
        updateOpreation();
    }

    @Override
    public void keyReleased(KeyEvent e) {
        updateOpreation();
    }

    @Override
    public void keyPressed(KeyEvent e) {
        updateOpreation();
    }

}
于 2013-05-08T23:16:55.283 に答える