WowGameCocosManager.mm
3.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//
// WowGameCocosManager.m
// Runner
//
// Created by xiaoyu on 2024/4/16.
//
#import "WowGameCocosManager.h"
#include "cocos2d.h"
#import "CocosAppDelegate.h"
#import <DMProgressHUD.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;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitGame) name:@"_kwowgamecocosexitgame" object:nil];
}
- (void)exitGame {
[self.gameViewController dismissViewControllerAnimated:YES completion:nil];
}
static DMProgressHUD *hud;
- (void)runGame:(NSInteger)gameid {
UIWindow *window = UIApplication.sharedApplication.delegate.window;
UIViewController *rootvc = window.rootViewController;
hud = [DMProgressHUD showHUDAddedTo:window maskType:DMProgressHUDMaskTypeClear];
hud.loadingType = DMProgressHUDLoadingTypeIndicator;//默认
hud.text = @"Waiting...";
if ([rootvc isKindOfClass:WowGameViewController.class] ||
[rootvc.presentedViewController isKindOfClass:WowGameViewController.class]) {
if ([NSThread isMainThread]) {
[hud dismiss];
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[hud dismiss];
});
}
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();
} else {
cocos2d::Director::getInstance()->resume();
}
if ([NSThread isMainThread]) {
[hud dismiss];
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[hud dismiss];
});
}
self.gameViewController.modalPresentationStyle = UIModalPresentationFullScreen;
[rootvc presentViewController:self.gameViewController animated:YES completion:nil];
[self startGameWithID:gameid];
//// debug exit game
// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// [self exitGame];
// });
}
-(void)startGameWithID:(NSInteger)gameid {
cocos2d::Director::getInstance()->getScheduler()->performFunctionInCocosThread([=] {
// CCLOG("start gameid---> %d ", gameid);
cocos2d::EventCustom evtEnter("start_gameid");
evtEnter.setUserData((void *) gameid);
cocos2d::Director::getInstance()->getEventDispatcher()->dispatchEvent(&evtEnter);
});
}
- (void)popGame {
[self.gameViewController dismissViewControllerAnimated:YES completion:nil];
// [self cocosDidEnterBackground];
}
- (void)detoryCocosEnvironment {
}
- (void)cocosDidEnterBackground {
cocos2d::Application::getInstance()->applicationDidEnterBackground();
}
- (void)cocosWillEnterForeground {
cocos2d::Application::getInstance()->applicationWillEnterForeground();
}
@end