2013-03-11 101 views
2

我和我正在研究一种游戏,基本上,我们有一个击中格设立在那里,如果我们的性格撞击它(蜘蛛),字符失去健康的朋友。游戏计时器延迟损害

因为我们使用一个for循环中,不可避免的发生了,玩家通过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语句来检查相交。我试图睡觉剧本,(我意识到10速度非常快,但是1000落后于可怕,所以Thread#sleep不是我想象的方式)。然后我们有一个运行100次的声明(作为球员的健康状况)。然后我们有一个如果看到健康是否低于0,回到0,所以玩家不能得到负面的健康。如果它不低于0,我们做其他的并且减去1生命值。但正如我所说,这跑得太快,看不到。

任何帮助?

+0

您的代码是一种方法。尝试睡眠100L到200L毫秒。 – 2013-03-11 15:41:48

+1

如果你想在'Java'游戏中设置'Timer',我建议你使用'javax.swing.Timer'而不是'Thread'。 – Rob 2013-03-11 15:45:31

回答

1

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

2

传统的方式 - 在我看来最好的方法 - 做到这一点,是让受伤的角色无懈可击,直到特定的时间点:当角色受伤时,检查游戏时间线(或者如果你没有然后是当前的毫秒数),然后添加特定的时间,例如1秒(或依赖于角色的恢复时间)并记住角色对象中的时间戳。想要首先伤害角色的gametick会检查角色是否仍然隐藏在无敌之中。这是特别好的,因为通常情况下不需要多线程更新游戏状态。

1

这个问题还不清楚,但你问你如何能阻止健康如此快速下降?如果是这样,这是我会做的:

你应该有一个int值invincibilityTime并设置为100,一旦玩家被击中,然后每次你的游戏通过gameloop时,它减少1。在(ResetEntities.spiderObj.intersects(ResetEntities.blueCharacterObj))前面加上if(invincibilityTime <= 0),检查是否过期。