// // WowGameCocosManager.m // Runner // // Created by xiaoyu on 2024/4/16. // #import "WowGameCocosManager.h" #import "cocos2d.h" #import "CocosAppDelegate.h" @interface WowGameCocosManager () { cocos2d::Application *_app; } @end @implementation WowGameCocosManager static CocosAppDelegate cocosAppDelegate; + (instancetype)sharedManager { static dispatch_once_t onceToken; static WowGameCocosManager *_manager = nil; dispatch_once(&onceToken, ^{ _manager = [[WowGameCocosManager alloc] init]; [_manager setupCocosEnvironment]; }); return _manager; } - (void)setupCocosEnvironment { //Launching the app with the arguments -NSAllowsDefaultLineBreakStrategy NO to force back to the old behavior. if ( [[UIDevice currentDevice].systemVersion floatValue] >= 13.0f) { [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"NSAllowsDefaultLineBreakStrategy"]; } cocos2d::Application *app = cocos2d::Application::getInstance(); app->initGLContextAttrs(); cocos2d::GLViewImpl::convertAttrs(); _app = app; } - (void)runGame { UIWindow *window = UIApplication.sharedApplication.delegate.window; UIViewController *rootvc = window.rootViewController; if ([rootvc isKindOfClass:WowGameViewController.class]) { return; } if (!self.gameViewController) { WowGameViewController *cocosvc = [[WowGameViewController alloc] init]; cocosvc.wantsFullScreenLayout = YES; // self.gameViewController = cocosvc; cocos2d::GLView *glview = cocos2d::GLViewImpl::createWithEAGLView((__bridge void *)cocosvc.view); cocos2d::Director::getInstance()->setOpenGLView(glview); _app->run(); [rootvc presentViewController:cocosvc animated:YES completion:nil]; // return; } else { [self cocosWillEnterForeground]; } // [rootvc presentViewController:self.gameViewController animated:YES completion:nil]; // debug exit game dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self popGame]; // [self cocosDidEnterBackground]; // [rootvc dismissViewControllerAnimated:YES completion:nil]; // [self cocosDidEnterBackground]; }); } - (void)popGame { [self.gameViewController dismissViewControllerAnimated:YES completion:nil]; [self cocosDidEnterBackground]; // cocos2d::Director::getInstance()->end(); } - (void)detoryCocosEnvironment { } - (void)cocosDidEnterBackground { cocos2d::Application::getInstance()->applicationDidEnterBackground(); } - (void)cocosWillEnterForeground { cocos2d::Application::getInstance()->applicationWillEnterForeground(); } @end