我正在用Java创建一个基于文本的游戏作为我自己的第一个官方程序。 这是饥饿,口渴和体温变量的生存游戏。
让我们说,我希望饥饿和口渴每5秒左右减少一次。 我现在唯一可以上班的是这个。 这肯定会减少数字,但是它会在2秒内从100变为0。
public void run(){
while(running){
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
while(delta >= 1){
tick();
delta--;
}
}
private void tick(){
Health.playerHealth.tick();
}
///////////////////////////////////////////////
public static Health playerHealth = new Health();
private static int hunger = 100;
private static int thirst = 100;
private static double bodyTemperature = 98.6;
public void tick(){
depleteHunger();
depleteThirst();
depleteBodyTemperature();
}
public void depleteHunger(){
hunger--;
}
public void depleteThirst(){
thirst--;
}
我也尝试了这个计时器,但它只等了5秒我放入 THEN 从100减少到0
private void tick(){
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
depleteHunger();
depleteThirst();
depleteBodyTemperature();
}
}, 0, 5000);
}
答案 0 :(得分:0)
您可以查看计时器的scheduleAtFixedRate
:
示例示例:
Timer timerObj = new Timer(true);
timerObj.scheduleAtFixedRate(timerTask, 0, interval));
此方法基本上可以实现您希望实现的目标:以特定间隔执行任务。
您需要通过覆盖TimerTask
方法初始化run()
对象并将逻辑置于其中(如您在代码中所提到的那样)。
答案 1 :(得分:0)
final int TICKS_PER_SECOND = 20;
final int TICK_TIME = 1000 / TICKS_PER_SECOND;
while (running) {
final long startTime = System.currentTimeMillis();
// some actions
final long endTime = System.currentTimeMillis();
final long diff = endTime - startTime;
if (diff < TICK_TIME) {
try {
Thread.sleep(TICK_TIME - diff);
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 2 :(得分:0)
找到了解决方案。
public class HealthStatsTimer extends TimerTask {
public void run() {
Health.playerHealth.depleteHunger();
Health.playerHealth.depleteThirst();
Health.playerHealth.depleteBodyTemperature();
}
}
//////////////////////
public static void main(String[] args){
new Stranded();
Timer timer = new Timer();
timer.schedule(new HealthStatsTimer(), 5000, 5000);
}