1

我正在尝试使用 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 的大约十分之一秒的大致经过时间,但它真的不像我应该这样做的方式。

4

3 回答 3

1

此外,如果您的帧速度较慢,例如。getDeltaTime() = 0.2,敌人的生成会延迟。

想到的最简单的方法是去掉 t - 直接与 timeElapsed 进行比较,并跟踪对象引用以了解您是否生成了每个敌人。IE。

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

于 2013-01-15T07:40:50.390 回答
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 初始化为某个时间段,然后在 update(delta) 方法中对所有 Timer 调用 Timer.update(delta),然后通过调用 Timer.hasTimeElapsed() 检查是否有任何计时器已用完。

在您的情况下,您只需要一个 Timer 对象,因为敌人是按顺序生成的。生成敌人后,重置计时器(如果需要,可以更改生成时间)并等待它再次启动。

您还可以修改 Timer 对象以使用主体观察者模式,以便在计时器关闭时触发回调。如果您的逻辑需要知道定时事件何时发生,但该逻辑无法直接访问增量时间,这将非常有用。

于 2013-02-17T01:04:38.160 回答
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 个敌人。我不知道你是否想要这种行为

于 2013-01-15T08:46:13.730 回答