我们正在使用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
这个问题让我困惑了几天,我没有解决这个问题。谁能给我一些帮助?
答案 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将暂时显示之前的游戏场景。在新场景准备就绪时,做一个会显示空白屏幕的工作。
希望这会对你有所帮助。