2013-01-15 63 views
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秒十分之一的大致经过的时间,但它确实不觉得我应该这样做的方式。

回答

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; } 
} 

你初始化定时器到一定的时间段,然后在您的更新(DELTA)方法,你在所有的计时器调用Timer.update(DELTA),然后检查是否有任何的定时器已经通过调用Timer.hasTimeElapsed()。

就你而言,你只需要一个Timer对象,因为敌人是按顺序产生的。一旦你产生了一个敌人,你重置定时器(如果你想改变产卵期)并等待它再次消失。

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

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

+0

谢谢,我以前试过这个解决方案。我认为你谈到的链表会是一个更好的方法,因为我将会使用很多对象。我想我会有一个链接,有一个时间递减,直到它达到零,然后移动到列表中的下一个元素。每个元素也会有一个同时产生的敌人列表,如果我需要延迟,它将是空白的。 – russjohnson09

+0

听起来像一个很好的方法 - 你也可以通过让一个行中的多个敌人与时间== 0保持一个列表。 另外请注意,你可能不得不改变你的实例化语义(例如,通过向敌人类添加.spawn()方法而不是在构造函数中产卵),因为如果你想保留一个敌人列表,你需要在列表创建时实例化敌人(或使用某种工厂模式)。 – sqweek

+0

我实际上最终使用了一个链接列表,其中每个节点都是敌人和延迟。敌人被实例化并添加到链表中,但在到达之前不会变为活动状态。然后将它们存储在一系列活跃的敌人中。这里是[github](https://github.com/russjohnson09/bullethell)给任何可能感兴趣的人。 – russjohnson09

0

为什么你增加t然后你根据t价值产生敌人。你为什么不这样做?使用这种方法,当你的游戏滞后,你得到三角洲可以说0.5f,你的步伐是0.1,你将创造5个敌人。我不知道你是否想要这样的行为