在Java中将变量的值更改一定时间

时间:2014-11-10 04:28:52

标签: java time

我正在开发一个相当基本的2D Java游戏。我想知道是否有任何方法可以在一段时间内更改变量(例如布尔值或整数)?我想避免使用for循环,因为它们会在一段时间内完全冻结我的游戏。代码将是这样的:

if(certainAbilityIsActivatedThatTakes5Seconds){

  // for 5 seconds{

  player1.isBeingAffectedByTheAbilityThatTakes5Seconds = true; } 

希望我所说的是有道理的,也是可行的。任何帮助都会很棒。现在我已经设法找到了这样做的方法,但它依赖于每秒至少获得60帧。我不得不想象这是一种伪劣的做法。任何帮助都会很棒。

3 个答案:

答案 0 :(得分:7)

简单的解决方案,无需使用线程或计时器:而不是存储boolean,而是存储包含时间戳的long,该时间戳指示能力何时被激活。

public class Ability {
      private static final int DURATION = 5000;

      private long activatedAt = Long.MAX_VALUE;

      public void activate() {
          activatedAt = System.currentTimeMillis();
      }

      public boolean isActive() {
          long activeFor = System.currentTimeMillis() - activatedAt;

          return activeFor >= 0 && activeFor <= DURATION;
      }
}

答案 1 :(得分:1)

一种方法是启动一个新线程,将变量设置为true,休眠5秒,将变量设置回false

new Thread(new Runnable()
{
    @Override
    public void run()
    {
        isBeingAffectedByTheAbilityThatTakes5Seconds = true;

        Thread.sleep(5000);

        isBeingAffectedByTheAbilityThatTakes5Seconds = false;
    }
}).start();

您可能需要将变量标记为volatile,以便所有其他线程都能看到最近的值,甚至更好,使用原子变量(即AtomicBoolean)。

答案 2 :(得分:1)

您可以这样做的方法是使用java.util.Timer。计时器允许我们安排在特定时间或在我们安排n new TimerTask()之后的相对时间内发生事情。这是一个快速实现:

    Timer timer = new Timer();
    timer.schedule(new TimerTask(){
        @Override
        public void run() {
            //This is where we tell it what to do when it hits 5 seconds
        }
    }, 5000);

我个人喜欢这样,因为它提供了更具可读性和更明显的代码,尽管其他两种解决方案都是解决此问题的有效且智能的方法。

Here is the JavaDoc