2

我在 KeyListener 中为一个非常简单的游戏编写控件。我有以下问题。

我做了这样的事情(只是一个简单的例子不是我实现的代码):

public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            leftPressed = true;
            Methodxyz(leftpressed,rightpressed,uppressed)
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            rightPressed = true;
            Methodxyz(leftpressed,rightpressed,uppressed)
        }
        if (e.getKeyCode() == KeyEvent.VK_UP) {
            upPressed = true;
            Methodxyz(leftpressed,rightpressed,uppressed)
        }
    } 

public void keyReleased(KeyEvent e) {           
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            leftPressed = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            rightPressed = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_UP) {
            upPressed = false;
        }
    }

如果我同时按 2 个键(左、上),您可以移动字符对角线。问题是侦听器与最后按下的 KeyEvent 一起工作,所以如果我按左然后向上,但没有释放并向上释放,则对象不会移动(仍然按下左)。

我该如何处理?是否可以在我的 keylistener 的 keypressed 方法中触发 keypressed 事件,直到 leftpressed 为假?

有任何想法吗?

提前致谢

4

2 回答 2

1

不要在 keypress 方法中调用移动方法,而是每当你在游戏循环中调用更新时,也会在你的 inputlistener 中调用一个更新方法来检查哪些键被按下,这将允许你同时有多个按键,释放键后将设置为 false 的按键,如下所示:

在您的输入处理程序中:

public void update() {

        if (up == true) {
            SomeMethod(Key.UP);
        }
        if (down == true) {
            SomeMethod(Key.DOWN);
        }
        if (left == true) {
            someMethod(Key.LEFT);
        }
        if (right == true) {
            someMethod(Key.RIGHT);
        }


}
    public void keyReleased(KeyEvent e) {
    switch (e.getKeyCode()) {
    case KeyEvent.VK_S:
        down = false;
        break;
    case KeyEvent.VK_W:
        up = false;
        break;
    case KeyEvent.VK_A:
        left = false;
        break;
    case KeyEvent.VK_D:
        right = false;
        break;
    }
}

public void keyPressed(KeyEvent e) {
    switch (e.getKeyCode()) {
    case KeyEvent.VK_S:
        down = true;
        break;
    case KeyEvent.VK_W:
        up = true;
        break;
    case KeyEvent.VK_A:
        left = true;
        break;
    case KeyEvent.VK_D:
        right = true;
        break;
于 2013-06-08T18:47:02.240 回答
0

我不太清楚你的问题。我想您使用 Methodxyz() 方法通过切换键中的事件更改某物的位置。可能您应该像现在一样设置和重置标志,但是在单独的线程中完成移动(在这种情况下,移动速度不会取决于事件生成速度,这可能会有所不同)。你会有类似的东西:

public void run() {
  while(!endOfGame) {
    //calculate new position based on flags and move.
  Thread.sleep(50); //or something more precise based on timers.
  }
}
于 2013-06-08T18:39:58.340 回答