Cocos2d对CCDirector暂停方法的质疑

时间:2012-07-25 15:25:20

标签: iphone ios cocos2d-iphone game-engine

我已经看过几篇帖子(例如this one),但我仍然没有得到它。

如果我调用CCDirector暂停方法,它会将动画间隔设置为1/4,值isPaused_设置为YES(参见下面的代码)。在 CCDirector.m 类中, isPaused _ 变量 在暂停和恢复方法中似乎没有被大量使用。

因此我决定也调用stopAnimation方法,但在某些帖子中没有提及:

   [[CCDirector sharedDirector] stopAnimation]

它显然没有停止加速度计数据和输入数据发送到主场景。这对我有意义,因为游戏的开发者可能希望通过摇动iPhone或点击恢复按钮来允许用户恢复。 这是选择背后的原因吗?

另外,为什么动画间隔设置为1/4,为什么即使使用此值也不会移动(使用加速计输入移动的播放器实体除外)?

非常感谢!

-(void) pause
{
    if( isPaused_ )
        return;

    oldAnimationInterval_ = animationInterval_;

    // when paused, don't consume CPU
    [self setAnimationInterval:1/4.0];

    [self willChangeValueForKey:@"isPaused"];
    isPaused_ = YES;
    [self didChangeValueForKey:@"isPaused"];
}

1 个答案:

答案 0 :(得分:2)

暂停CCDirector可将帧速降低至4 fps,以节省电池和CPU周期。如果你使用UIKit视图,后者是必要的,在某些情况下,有必要暂停导演以使UIKit动画能够流畅地制作动画。

导演也暂停了它会停止更新所有节点。特别是CCScheduler不会触发任何计划的选择器或更新方法。它还可以防止触摸被传递到节点,因为它们是通过CCTouchDispatcher中继的,当导演暂停时它也会被暂停。

但是正如您所注意到的那样,加速计没有暂停。那是因为cocos2d没有为UIAccelerometer提供包装器,因此您直接从iOS获得这些通知,忽略了导演的暂停状态。如果然后更改didAccelerate方法中的节点位置或直接从其调用的另一个方法,则该节点将更改其位置,尽管导演暂停。

这只是导演暂停不适合“暂停游戏”功能的一个原因。另一个问题是暂停只会阻止任何使用cocos2d功能构建的暂停菜单也会被暂停,这种目的无法实现。

然后startAnimation和stopAnimation就是阻止cocos2d完全更新屏幕的极端措施。这通常仅用于临时从视图层次结构中删除cocos2d视图或隐藏,或者某些UIKit视图全屏显示的情况。在这种意义上,stopAnimation就像一个暂停功能。