java - 需要帮助对角移动角色

标签 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;
}

最佳答案

只是为了扩展 MadProgrammer 的评论。 Java 中有三种类型的按键事件:keyPressedkeyReleased 和 keyTyped。

keyPressedkeyReleased 永远不会检测到多个字符。即使您按下 Ctrl,然后按下 c(就像复制一样),您也会收到两个 keyPressed 事件,一个用于 Ctrl,一个用于 c。

keyTyped 会将多个按键的某些组合合并为一个,并为 Ctrl+c 序列生成一个 keyTyped 事件(C 并按下修饰符 Ctrl)。但是,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 语句可以优化,但为了便于阅读,我将它们保留原样。

关于java - 需要帮助对角移动角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33907081/

相关文章:

java - 如何从 Google Places API 将 PlacePicker 的 map 类型从简单更改为卫星?

java - java.awt.Menu 的 RadioButtonMenuItem

java - Android Studio 在运行时找不到类

Java 参数化类警告

java - 检测鼠标悬停在 Graphics2D 字符串上

java - 匿名内部类实际上不是子类吗?

java - 将经过验证的用户获取到 mysql 数据库

java - 如何关闭 NetBeans 向导面板中的关键监听器?

java - 创建文本文件 Java 时出错

java - 存储和加载 REST 服务器的配置,避免全局状态(即单例、上下文、依赖注入(inject))