cocos2d-js游戏iOS Crash第二次进入游戏时

时间:2017-02-24 12:42:12

标签: ios objective-c crash cocos2d-x cocos2d-js

我们正在使用cocos2d-js开发可以启动不同游戏的iOS应用程序。所以我在原生应用程序视图控制器中添加一个按钮,然后单击按钮启动游戏,如下所示:

-(void)didClickGame2Btn:(id)sender
{
    //加载游戏
    cocos2d::Application *app = cocos2d::Application::getInstance();
    // Initialize the GLView attributes
    app->initGLContextAttrs();
    cocos2d::GLViewImpl::convertAttrs();

    // Use RootViewController to manage CCEAGLView
    RootViewController *rootViewController = [[RootViewController alloc] init];
    rootViewController.wantsFullScreenLayout = YES;
    [self.navigationController presentViewController:rootViewController animated:YES completion:^{
    // IMPORTANT: Setting the GLView should be done after creating the RootViewController
    cocos2d::GLView *glview = cocos2d::GLViewImpl::createWithEAGLView((__bridge void *)rootViewController.view);
    cocos2d::Director::getInstance()->setOpenGLView(glview);
    NSString *documentDir = [SEGetDirectories dirDoc];
    NSString *wPath = [NSString stringWithFormat:@"%@/GameData/Game2",documentDir];
    NSLog(@"document------:%@",documentDir);

    std::vector<std::string> searchPathList;
    searchPathList.push_back([wPath UTF8String]);        
    cocos2d::FileUtils::getInstance()->setSearchPaths(searchPathList);

    //run the cocos2d-x game scene
    app->run();
}];
    [[UIApplication sharedApplication] setStatusBarHidden:true];
}

rootViewController包含游戏视图。然后我们在游戏中添加一个按钮,用于退出游戏。退出游戏按钮的点击事件代码如下:

//exit the game and close the view controller
gameEndCallBack:function(sender){
    cc.log("director end............");
    cc.director.end();
    var ojb = jsb.reflection.callStaticMethod("ViewControllerUtils", "dismissCurrentVC");
}

我们使用反射来关闭rootViewController:

+(void)dismissCurrentVC
{
    UIViewController *currentVC = [ViewControllerUtils getCurrentVC]; //这里获取最顶层的viewcontroller
    [currentVC dismissViewControllerAnimated:YES completion:^{
        NSLog(@"xxx");
    }];
}

第一次进入游戏时一切正常,但在解除rootViewController后,我们再次尝试进入游戏,它崩溃了。

崩溃行位于ScriptingCore :: runScript metod中并执行代码:

evaluatedOK = JS_ExecuteScript(cx, global, *script, &rval);

崩溃信息是&#34; exc_bad_access&#34;。

这与本主题大致相同,但其中的方法并未解决问题。 http://discuss.cocos2d-x.org/t/how-to-destroy-a-cocos-game-on-ios-completely/23805

这个问题让我困惑了几天,我没有解决这个问题。谁能给我一些帮助?

1 个答案:

答案 0 :(得分:0)

您可以让应用在应用中支持多个游戏。 您所做的一切都是必需的,但除此之外,请遵循以下说明。

首先,cocos提供了cocos2d::Application的单例实例,无法再次重新启动,尤其是在iOS中。因此,结束导演cc.director.end();的方法不会对您有所帮助。

您应该只使用函数调用cocos2d::Application::getInstance()->run();启动应用程序一次,如果您想要启动游戏层,下一次不应该再次调用此方法。

相反,当你想要停止游戏时,只需暂停cocos2d::Director::getInstance()->pause();并恢复导演cocos2d::Director::getInstance()->resume();

在这种方法中,如果你解除/取消分配视图控制器实例,那么你应该再次创建glview cocos2d::GLView实例而不调用run方法。

还有一个问题是,要注意加载新场景的延迟。 GLView将暂时显示之前的游戏场景。在新场景准备就绪时,做一个会显示空白屏幕的工作。

希望这会对你有所帮助。