【问题标题】:Cocos2d doubts on CCDirector pause methodCocos2d对CCDirector暂停方法的疑惑
【发布时间】:2012-07-25 15:25:20
【问题描述】:

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

如果我调用 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"];
}

【问题讨论】:

    标签: iphone ios cocos2d-iphone game-engine


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。我有一个疑问。我确实暂停了导演,在那一刻,我制作了一个带有按钮的菜单,允许用户恢复游戏。当我按下它们时,它们会触发我提供的“选择器”方法。你提到 taht CCTouchDispatcher 已暂停,它应该处理所有触摸事件。但是为什么 CCMenu 按钮项可以检测到触摸并触发“选择器”方法呢?不好意思问这个。如果您不介意,我会在澄清后立即接受答案。
    猜你喜欢
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多