【问题标题】:Diagonal movement of a sprite精灵的对角线运动
【发布时间】:2014-03-22 17:19:34
【问题描述】:

如何实现精灵的对角线移动?我创建了一个可移动的精灵(一个矩形),它在四个方向上移动。

要为矩形设置动画,使用了计时器对象和执行的操作方法。我在 keyPressed 和 keyReleased 方法中实现了以下代码,将其向四个方向移动。

public void keyPressed(KeyEvent arg0){
    int c=arg0.getKeyCode();
    if(c==KeyEvent.VK_LEFT){
        velx=-4;
        vely=0;
    }
    else if(c==KeyEvent.VK_RIGHT){
        velx=4;
        vely=0;
    }
    else if(c==KeyEvent.VK_UP){
        velx=0;
        vely=-4;
    }
    else if(c==KeyEvent.VK_DOWN){
        velx=0;
        vely=4;
    }
}

public void keyReleased(KeyEvent arg0){
    velx=0;
    vely=0;
}

【问题讨论】:

  • 那么你的问题是什么?如何检测是否同时按下了两个键?
  • 我会使用布尔标志,指示已按下和未按下的内容

标签: java keylistener


【解决方案1】:

不要使用 KeyListener。 Swing 旨在与Key Bindings 一起使用。

查看Motion Using the Keyboard 了解更多信息以及使用Key Bindings 的完整解决方案。

【讨论】:

    【解决方案2】:

    这是基于你最后一个 cmets 的代码:

    // Set of currently pressed keys
    private final Set<Integer> pressed = new TreeSet<Integer>();
    
    @Override
    public void keyPressed(KeyEvent arg0) {
        int c = arg0.getKeyCode();
        pressed.add(c);
        if (pressed.size() > 1) {
            Integer[] array = pressed.toArray(new Integer[] {});
            if (array[0] == KeyEvent.VK_LEFT && array[1] == KeyEvent.VK_UP) {
                velx = -4;
                vely = -4;
            } else if (array[0] == KeyEvent.VK_UP && array[1] == KeyEvent.VK_RIGHT) {
                velx = 4;
                vely = 4;
            } else if (array[0] == KeyEvent.VK_RIGHT && array[1] == KeyEvent.VK_DOWN) {
                velx = 4;
                vely = -4;
            } else if (array[0] == KeyEvent.VK_LEFT && array[1] == KeyEvent.VK_DOWN) {
                velx = -4;
                vely = 4;
            }
        } else {
            if (c == KeyEvent.VK_LEFT) {
                velx = -4;
                vely = 0;
            } else if (c == KeyEvent.VK_RIGHT) {
                velx = 4;
                vely = 0;
            } else if (c == KeyEvent.VK_UP) {
                velx = 0;
                vely = -4;
            } else if (c == KeyEvent.VK_DOWN) {
                velx = 0;
                vely = 4;
            }
        }
    
    }
    
    @Override
    public void keyReleased(KeyEvent arg0) {
        velx = 0;
        vely = 0;
    
        pressed.remove(Integer.valueOf(arg0.getKeyCode()));
    }
    

    【讨论】:

    • keyPressed()方法中添加这些行而不是在actionPerformed()
    • 我明白了……我是否必须将我所有的其他条件放在你留下的不完整的 else 块中?
    • 是的,你也必须把它们放进去。我应该发布完整的代码。我刚刚提到了这些变化。
    • 在两条对角线上移动的任何方式
    • @OOPer,用户不知道 Alt+LEFT 是什么意思。它可以向上/向左或向下/向左。通常,您只需将 UP 和 LEFT 键组合起来即可沿对角线向上和向左移动。
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多