我正在开发一个相当基本的2D Java游戏。我想知道是否有任何方法可以在一段时间内更改变量(例如布尔值或整数)?我想避免使用for循环,因为它们会在一段时间内完全冻结我的游戏。代码将是这样的:
if(certainAbilityIsActivatedThatTakes5Seconds){
// for 5 seconds{
player1.isBeingAffectedByTheAbilityThatTakes5Seconds = true; }
希望我所说的是有道理的,也是可行的。任何帮助都会很棒。现在我已经设法找到了这样做的方法,但它依赖于每秒至少获得60帧。我不得不想象这是一种伪劣的做法。任何帮助都会很棒。
答案 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);
我个人喜欢这样,因为它提供了更具可读性和更明显的代码,尽管其他两种解决方案都是解决此问题的有效且智能的方法。