java - 游戏计时器伤害延迟

标签 java multithreading swing timer

我和我的一个 friend 正在开发一款游戏,基本上,我们设置了一个碰撞箱,如果我们的角色击中它(一只蜘蛛),角色就会失去生命值。

因为我们使用的是 for 循环,所以不可避免地会发生,玩家会 1 1 1 地失去生命值,但速度快到人眼无法看到。因此,我们需要一个计时器、暂停或玩家每击中蜘蛛的 x 时间量的东西。这是我们的代码:

        if (ResetEntities.spiderObj.intersects(ResetEntities.blueCharacterObj)) {
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < 100; i++) {
            if (ResetEntities.blueHealth < 0) {
                ResetEntities.blueHealth = 0;
                Frame.blueHealthLabel.setText("Health: "
                        + ResetEntities.blueHealth);
            } else {
                ResetEntities.getBlueHealth(ResetEntities.blueHealth - 1);
                Frame.blueHealthLabel.setText("Health: "
                        + ResetEntities.blueHealth);
            }
        }
    }

在这段代码中,我们有一个 if 语句来检查交集。我试着让脚本 hibernate (我意识到 10 非常快,但是 1000 非常滞后,所以 Thread#sleep 不是我想象的方式)。然后我们有一个 for 语句运行 100 次(即玩家的健康)。然后我们有一个 if 看看健康是否低于 0,设置回 0,这样玩家就不会得到负健康。如果它不低于 0,我们执行 else 并减去 1 生命值。但是正如我所说,这运行得太快以至于看不到。

有什么帮助吗?

最佳答案

传统的方法——在我看来最好的方法——是让受伤的角色在特定时间点之前无敌:当角色受伤时,检查游戏时间线(或者如果你没有然后是当前的毫秒数)然后添加一个特定的时间,例如 1 秒(或字符相关的恢复时间)并记住字符对象中的时间戳。想要伤害角色的 gametick 首先检查角色是否仍处于隐藏的刀枪不入状态。这特别好,因为通常人们并不真的希望多个线程更新游戏状态。

关于java - 游戏计时器伤害延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15342630/

相关文章:

java - 在 JScrollPane 中包含两个 JLabel(一个在另一个之上)

java - 通过按下 ANDROID 按钮加载 Xml

java - 固定线程池的理想大小是多少?

c - 为线程分配堆栈内存

python - 处理两个传入数据流并将它们组合在 python 中?

java - 相互影响 JComboBox

java - 为单个连接禁用 SSLHandshakeException

java - 无法运行 tomcat java : Permission denied

java - 在 LocationOverlay 对象的 .runOnFirstFix() 方法中取消 Runnable

java - 如何在 EDT (Java Swing) 上运行“另存为”菜单