Cocos2d - 第二次运行场景不安排更新

Posted

技术标签:

【中文标题】Cocos2d - 第二次运行场景不安排更新【英文标题】:Cocos2d - running a scene a second time doesn't schedule updates 【发布时间】:2013-03-14 00:13:06 【问题描述】:

从 UIKit ViewController 我这样做是为了开始游戏:

if (director.runningScene == nil)
    
        [director runWithScene:[MyGameLayer scene]];
    
    [director startAnimation];

MyGameLayer 如下所示:

+(id) scene 
    CCScene *scene = [CCScene node];
    MyGameLayer* layer = [MyGameLayer node];
    [scene addChild:layer z:0 tag:GameSceneLayerTagGame];


    return scene;


-(id) init 
    if ((self=[super init]))
    
        NSLog(@"init!");
        self.isTouchEnabled = YES;

        [self initPhysics];

        [self scheduleUpdate];
    
    return self;

第一次玩游戏,一切正常。 -(void) update: (ccTime) dt 被调用。如果我退出游戏并执行此操作:

CCDirectorios* director = (CCDirectorIOS*)[CCDirector sharedDirector];
    [director stopAnimation];
    [director end];

然后再次玩游戏,-(void) update: (ccTime) dt 不会被调用,即使我知道 -init() 会被调用。游戏出现在屏幕上,但更新计划第二次不起作用。什么会导致 Cocos2d 不安排更新,我该如何解决?

【问题讨论】:

【参考方案1】:

假设您正在做您正在做的事情以防止导演在后台工作时以 4 fps 更新,您可能应该尝试再次启动导演。

话虽如此,在你的 applicationDidBecomeActive 中,添加以下代码

[[CCDirector sharedDirector] stopAnimation]; // call this to make sure you don't start a second display link!
[[CCDirector sharedDirector] resume];
[[CCDirector sharedDirector] startAnimation];

取自:How to implement pause/resume in cocos2d game?

如果我不正确,请告诉我您要如何处理您的主管电话

【讨论】:

我有一个视图控制器,它有多个迷你游戏可供选择。所以我需要能够退出一场比赛并开始另一场比赛。问题是更新调度程序只适用于我玩的第一场比赛。同一游戏或任何其他游戏的任何后续播放都不会出现动画。【参考方案2】:

您是否覆盖(实现)onEnter*/onExit* 方法之一?如果是这样,请确保调用超级实现,否则调度和触摸输入可能不起作用。

更新: 除此之外,尽量不要调用 [director end],因为它会完全关闭 cocos2d,这是已知的问题。

【讨论】:

如果我不调用[director end],我第二次开始游戏时我会得到一个粉红色的屏幕。紧接着是层出不穷的openGL错误:OpenGL error 0x0501 in -[CCSprite draw] 532【参考方案3】:

终于想通了。在游戏中打开带有退出按钮的菜单时,我正在暂停游戏:

[[self gameLayer] pause];

所以当我开始一个新游戏时,Cocos2d 仍然处于暂停状态,即使场景和图层被释放并且我正在创建一个新的 glView。

如果我使用它,它会起作用:

[[self gameLayer] pauseSchedulerAndActions];

【讨论】:

【参考方案4】:

当您使用此代码“暂停”游戏时:

[[CCDirector sharedDirector]pause];

在推送任何场景之前,您还必须在重启或菜单代码块中“恢复”您的导演:

[[CCDirector sharedDirector]resume]; 

【讨论】:

以上是关于Cocos2d - 第二次运行场景不安排更新的主要内容,如果未能解决你的问题,请参考以下文章

cocos2D替换场景未初始化类

当用户第二次打开 cocos2d-iphone 时,如何更改第一个场景?

Sprite Kit:如何在运行场景之上添加场景

如何捕获同时包含 cocs2d 和 UIKit 的视图的屏幕截图

具有 OptimisticResponse 的突变不包括第二次更新中的服务器响应数据

我如何更新此代码以第二次运行但仅在已解压缩的 zip 存档上运行?