1

我已经看过几篇关于这个的帖子(例如这个),但我仍然不明白。

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

因此,我决定也调用 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"];
}
4

1 回答 1

2

暂停 CCDirector 会将帧速率降低到 4 fps,以节省电池和 CPU 周期。如果您使用 UIKit 视图,则后者是必要的,在某些情况下,需要暂停 director 以使 UIKit 动画流畅地动画。

暂停指挥器的作用还在于它停止更新所有节点。具体来说,CCScheduler 不会触发任何计划的选择器或更新方法。它还可以防止触摸被传递到节点,因为它们是通过 CCTouchDispatcher 中继的,当 Director 暂停时,CCTouchDispatcher 也会暂停。

但正如您所注意到的,加速度计并未暂停。这是因为 cocos2d 没有为 UIAccelerometer 提供包装器,因此您可以直接从 iOS 获得这些通知,而忽略了 director 的暂停状态。如果您随后更改 didAccelerate 方法或直接从该方法调用的其他方法中的节点位置,则该节点将更改其位置,尽管 Director 已暂停。

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

那么 startAnimation 和 stopAnimation 只是极端的措施,阻止 cocos2d 完全更新屏幕。这通常仅用于 cocos2d 视图从视图层次结构中临时移除、隐藏或某些 UIKit 视图进入全屏状态的情况。从这个意义上说,stopAnimation 就像一个暂停功能。

于 2012-07-26T14:06:05.593 回答