需要帮助移动角色对角线

时间:2015-11-25 01:35:56

标签: java

为上课制作游戏,我无法让角色按对角线移动。我认为我在检测多个按键时出错了,因为我用一个键测试了walkDownLeft但是当我尝试用左右键触发它时它就向左移动了。我错过了某些东西,还是我正在使用的方式,而不仅仅是去做我想做的事情?

public boolean AkeyDown(Event e, int key) {
      if (key == 1004) {
        Player.walkUp = true;
    }
    if (key == 1005 && key != 1006) {
        Player.walkDown = true;
    }
    if (key == 1005 && key == 1006) {
        Player.walkDownLeft = true;
    }
    if (key == 1006 && key != 1005) {
        Player.walkLeft = true;
    }
    if (key == 1007) {
        Player.walkRight = true;
    }
    return true;
}

public boolean AkeyUp(Event e, int key) {   
    if (key == 1004) {
        Player.walkUp = false;
    }
    if (key == 1005 && key != 1006) {
        Player.walkDown = false;
    }
    if (key == 1005 && key == 1006) {
        Player.walkDownLeft = false;
    }
    if (key == 1006 && key != 1005) {
        Player.walkLeft = false;
    }
    if (key == 1007) {
        Player.walkRight = false;
    }
    return true;
}

1 个答案:

答案 0 :(得分:1)

只是扩展MadProgrammer的评论。 Java中有三种类型的关键事件,keyPressedkeyReleased和keyTyped。

keyPressedkeyReleased永远不会检测到多个字符。即使你按下Ctrl然后也按下了c(好像要复制),你会得到两个keyPressed个事件,一个用于Ctrl,一个用于c。

keyTyped会将多个按键组合的一些组合合并为一个,并为Ctrl + c序列生成一个keyTyped事件(按下修改键Ctrl的C)。但是,keyTyped只会组合修改键(Ctrl,Alt,Super等)。它不会组合两个箭头键。这意味着如果用户按下向上箭头然后很快按下右箭头,您将获得两个keyPressed事件,每个箭头一个。如果他们随后发布了密钥,您将获得两个keyReleased个事件和两个keyTyped个事件。

因此,这就是您永远不会进入walkDownLeft场景的原因。触发两个键都不会发生任何事件。我建议只有walkLeft,walkRight,walkUp和walkDown。然后在你的另一个读取这些状态的线程中有类似的东西:

if(player.walkUp && !player.walkRight && !player.walkLeft) {
    //Move up
} else if (player.walkUp && player.walkRight) {
    //Move upRight
} else if (player.walkUp && player.walkLeft) {
    //Move upLeft
} //...

那些if语句可以进行优化,但为了便于阅读,我将它们保留下来。