游戏计时器损坏延迟

时间:2013-03-11 15:37:57

标签: java multithreading swing timer

我和我的一个朋友正在制作一款游戏,基本上,我们设置了一个击球盒,如果我们的角色击中它(蜘蛛),角色会失去健康。

因为我们正在使用for循环,所以不可避免地会发生,玩家逐渐失去健康,但人眼看不到它。因此,我们需要一个计时器,暂停或其他东西,每个玩家正在击中蜘蛛的时间。这是我们的代码:

        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 if看健康是否低于0,设置回0,所以玩家不能得到负面的健康状况。如果它不低于0,我们做其他并减去1健康。但正如我所说的那样,跑得太快了。

任何帮助?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

使用Timer作为后台流程的时间安排。并使用javax.swing.SwingUtilities.invokeLater(Runnable)更新您的GUI。

答案 2 :(得分:1)

问题尚不清楚,但你是否在问如何能够如此迅速地阻止健康?如果是这样,我就会这样做:

你应该有一个int值invincibilityTime并在玩家被击中后将其设置为100,然后每当你的游戏通过游戏循环时它会减少一个。将if(invincibilityTime <= 0)放在(ResetEntities.spiderObj.intersects(ResetEntities.blueCharacterObj))之前,检查可见期是否已过期。