【问题标题】:Java-KeyListener: How to fire Events?Java-KeyListener:如何触发事件?
【发布时间】:2013-06-04 19:47:05
【问题描述】:

我在 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,所以如果 我按下左键 然后 向上,但 没有释放 left放开,物体不会移动(仍然按下左键)。

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

有什么想法吗?

提前致谢

【问题讨论】:

标签: java keylistener


【解决方案1】:

不要在 keypress 方法中调用移动方法,而是每当您在游戏循环中调用更新时,也会在输入侦听器中调用更新方法来检查已按下哪些键,这将允许您在同时,一旦按键被释放,按键将被设置为 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;

【讨论】:

    【解决方案2】:

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

    public void run() {
      while(!endOfGame) {
        //calculate new position based on flags and move.
      Thread.sleep(50); //or something more precise based on timers.
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-23
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      相关资源
      最近更新 更多