我正在尝试使用libgdx制作一个简单的游戏。我坚持的一件事是让敌人在特定时间产卵。如果我做了像
这样的事情if (t == 10)
new Enemy();
我可能会错过这个特定的时间,或者可能两次产生同一个敌人。我现在拥有的是像
float t = 0
float timeElapsed = 0;
update (float delta) {
timeElapsed += getDeltaTime();
if (timeElapsed > 0.1) {
t++;
timeElapsed = 0;
}
}
这给了我t的大约十分之几秒的经过时间,但它实际上并不像我应该这样做。
答案 0 :(得分:1)
另外,如果你的帧速度很慢,例如。 getDeltaTime()= 0.2,敌人的产卵将会延迟。
想到的最简单的方法是摆脱t - 直接与timeElapsed进行比较,并跟踪对象引用以了解你是否已经催生了每个敌人。即
if (enemy1 == NULL && elapsedTime > 10) {
enemy1 = new Enemy();
}
if (enemy2 == NULL && elapsedTime > 30) {
enemy2 = new Enemy();
}
对于更具伸缩性的方法,您可以创建一个生成时间的链接列表,并在您生成敌人时推进列表指针。这样你只需要每帧比较一次(当前列表节点上的生成时间)。
附录:在浮点数的上下文中使用==很少是个好主意。有关血腥的详细信息,请参阅http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html。
答案 1 :(得分:1)
我在游戏中使用的解决方案可能很有用。我实际创建了一个Timer类:
public class Timer
{
protected float remaining;
protected float interval;
public Timer(float interval)
{
this.interval = interval;
this.remaining = interval;
}
public boolean hasTimeElapsed() { return (remaining < 0.0F); }
public void reset() { remaining = interval; }
public void reset(float interval) {
this.interval = interval;
this.remaining = interval;
}
public void update(float delta) { remaining -= delta; }
}
将Timer初始化为某个时间段,然后在更新(delta)方法中调用所有Timers上的Timer.update(delta),然后通过调用Timer.hasTimeElapsed()检查是否已经过了任何定时器。
在你的情况下,你只需要一个Timer对象,因为敌人是按顺序产生的。一旦你产生一个敌人,你重置计时器(如果你想改变生成期)并等待它再次出现。
您还可以修改Timer对象以使用subject-observer模式,以便在计时器关闭时触发回调。如果您有逻辑需要知道何时发生定时事件,但逻辑无法直接访问增量时间,则此功能非常有用。
答案 2 :(得分:0)
为什么你增加t
然后你根据t
值产生敌人。你为什么不这样做?
final float step = 0.1f;
float timeElapsed = 0f;
update (float delta) {
timeElapsed += delta;
while (timeElapsed > step){
timeElapsed-=step;
createEnemy();
}
}
通过这种方法,当你的游戏滞后并且你得到delta时我们说0.5f并且你的步数为0.1,你将创造5个敌人。我不知道你是否想要这个行为