1

所以我的想法是有一个特殊的子弹冻结敌人,一段时间后敌人解冻并继续他们的动作/动画。这是我所做的一个简单版本:

-(void)update:(ccTime)dt
{
     CCSprite *enemySprite;
     CCARRAY_FOREACH(enemies, enemySprite)
     {
         if (CGRectIntersectsRect(_bullet.boundingBox, enemySprite.boundingBox))
         {
               _bullet.visible = NO;
               [enemySprite pauseSchedulerAndActions];
               enemySprite.pausingDuration = CACurrentMediaTime() +5;
         }
         if (CACurrentMediaTime() > enemySprite.pausingDuration)
              [enemySprite resumeSchedulerAndActions];
     }
}

现在,我想我遇到的问题是enemySprite已经停止更新它的调度程序,所以下次调用更新方法时,已经暂停的enemySprite不会得到更新!我希望我知道一种更好的解释方式,但我认为任何专业的程序员都会立即看到这段代码有什么问题。请帮助我提出改进代码的建议,或者甚至只是一个想法将不胜感激,谢谢您的时间。

4

1 回答 1

3

你打过电话了?:)

是的,pauseSchedulerAndActions 以及 Director 的 pause 方法都是实现暂停的糟糕方法,因为您无法控制暂停的内容以及可以继续运行的内容(例如暂停菜单层)。

在您的情况下,您至少可以更具体,例如只暂停操作,而不是计划更新:

[enemySprite.actionManager pauseTarget:enemySprite];

对于更细粒度的控制,建议不要过于依赖每个对象中的预定方法,而是让一个中心对象(场景或图层)将所有更新发送给它的子对象 - 这样您以后可以更轻松地决定哪些子对象应该继续在暂停期间接收更新。

于 2013-02-07T21:59:44.217 回答