3

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

因为我们使用了for循环,所以不可避免的会发生,玩家一个一个地失去生命值,但速度如此之快,人眼看不到。因此,我们需要为玩家每 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 语句来检查交集。我试图让脚本休眠,(我意识到 10 速度非常快,但 1000 延迟非常可怕,所以Thread#sleep我想象中的路不通)。然后我们有一个 for 语句运行 100 次(作为球员的健康)。然后我们有一个 if 查看生命值是否低于 0,设置回 0,这样玩家就不会得到负生命值。如果它不低于 0,我们执行 else 并减去 1 生命值。但正如我所说,这运行得太快了。

有什么帮助吗?

4

3 回答 3

2

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

于 2013-03-11T15:57:53.343 回答
1

问题尚不清楚,但您是在问如何才能阻止健康状况如此迅速地下降?如果是这样,这就是我会做的:

您应该有一个 int 值 invincibilityTime 并在玩家被击中时将其设置为 100,然后每次您的游戏通过 gameloop 时都会将其减一。放在if(invincibilityTime <= 0)之前(ResetEntities.spiderObj.intersects(ResetEntities.blueCharacterObj))以检查无敌期是否已过期。

于 2013-03-11T15:58:51.473 回答
1

使用Timer进行后台进程的计时。并用于javax.swing.SwingUtilities.invokeLater(Runnable)更新您的 GUI。

于 2013-03-11T15:53:13.353 回答