2

很抱歉打扰,但我有点麻烦,我想知道这里是否有人可以帮我一把。

我目前正在设计一个游戏,其中敌人出现在屏幕的左侧(超出边界)并向右移动。我使用了许多代码(这是使用 Sparrow 框架),并且当你击败它们时,敌人的数量几乎会增加。即 lvl 1-> 1 个敌人,lvl 2-> 2 个敌人,lvl3-> 3 个敌人,等等...

我在制造敌人方面遇到了一些麻烦。我让它们出现在由随机数生成器选择的 5 个设置路径(NSMutableArray 中的路径号)中的 1 个上,但是它们经常出现在同一路径上,1 在另一个之上。

为了产生敌人,我运行了许多方法: addEnemy -> 产生然后从左到右移动的敌人(动画)。onTouchEnemy -> 如果我碰到敌人,他们就会死。激活 drawEnemies drawEnemies -> 调用 addEnemy 的次数等于你的 lvl。编码为:

for(int i = 0; i < level; i++){
  [self performSelector:@selector(addEnemy) withObject:nil afterDelay:3.0];
}

有没有办法进行编程,以便在激活产生敌人方法之间存在延迟?我试过这个 afterDelay,但由于某种原因,程序只是忽略了 3 秒的延迟,并且只在 1 中产生了敌人。这很烦人,因为我希望它们以更有序的方式出现。

我感谢任何愿意帮助我的人。西卡托。

4

3 回答 3

2

你的意思是这样做,最后有一个额外的“* i”吗?像这样:

for(int i = 0; i < level; i++){
    [self performSelector:@selector(addEnemy) withObject:nil afterDelay:3.0 * i];
}
于 2010-09-23T13:49:14.907 回答
2

performSelector:withObject:afterDelay:由于代码的执行方式,似乎忽略了它的延迟。该 for 循环将几乎立即迭代,排队 3 次调用该addEnemy方法。3 秒后,addEnemy 方法几乎同时执行。

为了获得更好的结果,您应该查看NSTimer. 您可以设置 3 秒的间隔并让它重复(您可以在产生所需数量的敌人后使计时器无效)。

就像是:

// creates and returns a new timer
// the timer is retained by the run loop for as long as it is valid
// invalidating the timer will cause the runloop to release it.
myTimer = [NSTimer scheduledTimerWithTimeInterval:3.0
                                 target:self
                               selector:@selector(addEnemy)
                               userInfo:nil
                                repeats:YES];

这将导致 addEnemy 方法每 3 秒触发一次。你应该记录你已经制造了多少敌人,在制造最后一个敌人后,停止计时器,以免它再次开火。

if (numberOfDesiredEnemies == numberOfEnemiesProduced)
{
    [myTimer invalidate], timer = nil;
}
于 2010-09-23T13:56:35.247 回答
0

尝试查看 NSTimer 类。
有一些方法提供了执行具有预定义延迟和循环条件的选择器的能力。

于 2010-09-23T13:48:49.153 回答