[英]Libgdx Timer every 5 seconds if a condition is true until a condition is true
我正在制作我的第一个LibGdx游戏,我的能源系统需要帮助。 所以基本上在我的玩家班上,我有一个:
int curEnergy = 100;
int maxEnergy = 100;
boolean allowRegen = false;
然后我有我的移动代码:
if (Gdx.input.isKeyPressed(Keys.W)) {
if (curEnergy > 0) {
if (Gdx.input.isKeyPressed(Keys.SHIFT_LEFT)) {
position.y += 2.5f;
curEnergy--;
}
} else {
allowRegen = true;
checkIfEnergyIsZero();
}
position.y += 2f;
}
if (Gdx.input.isKeyPressed(Keys.A)) {
if (curEnergy > 0) {
if (Gdx.input.isKeyPressed(Keys.SHIFT_LEFT)) {
position.x -= 2.5f;
curEnergy--;
}
} else {
allowRegen = true;
checkIfEnergyIsZero();
}
position.x -= 2f;
}
if (Gdx.input.isKeyPressed(Keys.D)) {
if (curEnergy > 0) {
if (Gdx.input.isKeyPressed(Keys.SHIFT_LEFT)) {
position.x += 2.5f;
curEnergy--;
}
} else {
allowRegen = true;
checkIfEnergyIsZero();
}
position.x += 2f;
}
if (Gdx.input.isKeyPressed(Keys.S)) {
if (curEnergy > 0) {
if (Gdx.input.isKeyPressed(Keys.SHIFT_LEFT)) {
position.y -= 2.5f;
curEnergy--;
}
} else {
allowRegen = true;
checkIfEnergyIsZero();
}
position.y -= 2f;
}
}
因此,当我的curEnergy为0时,我调用checkIfEnergyIsZero函数,这是我需要帮助的内容:
public void checkIfEnergyIsZero() {
if (allowRegen) {
float delay = 10; // seconds
Timer.schedule(new Task() {
@Override
public void run() {
if (curEnergy == 0) {
for (int i = 0; i < maxEnergy; i++) {
curEnergy += 1;
allowRegen = false;
}
}
}
}, delay);
}
}
因此,这段代码基本上是当我按住shift进行冲刺时,将curEnergy减小1,然后如果curEnergy为0,它将使一个计时器在10秒后运行,但是我要做的是:当energy为0时,等待5秒并添加10能量,然后再次等待5秒并添加10能量,然后等待5秒并添加10能量,依此类推,直到curEnergy整数等于当前设置为100的maxEnergy整数;
如果我忘记添加一些代码,请告诉我。
非常感谢你!
另一种方法是设置截止日期,然后每次通过渲染循环检查该截止日期,而不是在N秒后触发计时器。 因此,在循环的顶部执行以下操作:
long now = com.badlogic.gdx.utils.TimeUtils.millis();
获取当前时间。 然后检查是否需要增加能量:
if (energyBumpTime != 0 && energyBumpTime <= now) {
curEnergy += 5; // perhaps check for hitting the max limit.
energyBumpTime = 0; // to disable
// OR
energyBumpTime = now + (5 * 1000); // schedule another bump in 5 seconds.
}
这样,您可以轻松更改时间表。 因此,例如,如果玩家使用了一些能量,则可能要从现在开始将凹凸重新安排5秒:
curEnergy -= 1; // use a bit
energyBumpTime = now + (5 * 1000); // and delay the regeneration
我认为这比触发计时器,取消计时器并更改其超时时间要容易得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.