所以我的想法是有一个特殊的子弹冻结敌人,一段时间后,敌人解冻自己并继续他们的动作/动画。这是我所做的简单版本:
-(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已停止更新其调度程序,因此下次调用update方法时,暂停的enemySprite将无法更新!我希望我知道一个更好的解释方法,但我认为任何专家程序员都会立即看到这个代码有什么问题。 请帮助我提出改进代码的建议,甚至只是一个想法将不胜感激,谢谢你的时间。
答案 0 :(得分:3)
是的,pauseSchedulerAndActions以及Director的暂停方法都是实现暂停的糟糕方法,因为你无法控制暂停的内容和可以继续运行的内容(例如暂停菜单层)。
在您的情况下,您至少可以更具体,例如只是暂停操作,而不是预定更新:
[enemySprite.actionManager pauseTarget:enemySprite];
对于更细粒度的控制,建议不要过分依赖每个对象中的预定方法,而是让中心对象(场景或图层)将所有更新发送给其子对象 - 这样您以后可以更轻松地决定哪些孩子在暂停期间应继续接收更新。