Java-KeyListener:如何触发事件?

时间:2013-06-08 17:39:07

标签: java keylistener

我为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个键(左,上)你可以移动charachter对角线。问题是监听器适用于上次按下的KeyEvent ,所以如果我按左然后向上,但没有释放 释放,对象不会移动(左按下)。

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

有什么想法吗?

提前致谢

2 个答案:

答案 0 :(得分: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.
  }
}

答案 1 :(得分:0)

不要在按键方法中调用移动方法,相反,每当你在游戏循环中调用更新时,也会在inputlistener中调用一个更新方法来检查已按下哪些键,这样你就可以拥有多个按键。同时,一旦释放密钥将被设置为假的按键,如下所示:

在你的输入处理程序中:

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;