为上课制作游戏,我无法让角色按对角线移动。我认为我在检测多个按键时出错了,因为我用一个键测试了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;
}
答案 0 :(得分:1)
只是扩展MadProgrammer的评论。 Java中有三种类型的关键事件,keyPressed
,keyReleased
和keyTyped。
keyPressed
和keyReleased
永远不会检测到多个字符。即使你按下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语句可以进行优化,但为了便于阅读,我将它们保留下来。