在特定时间实例化类

时间:2013-01-15 07:08:32

标签: libgdx

我正在尝试使用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的大约十分之几秒的经过时间,但它实际上并不像我应该这样做。

3 个答案:

答案 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个敌人。我不知道你是否想要这个行为