WowGameCocosManager.mm
4.24 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
134
135
136
137
138
139
140
141
142
143
144
145
//
// 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 {
[self clearData];
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)clearData
{
cocos2d::SpriteFrameCache::getInstance()->removeSpriteFrames();
cocos2d::Director::getInstance()->getTextureCache()->removeAllTextures();
//清理搜索路径
std::vector<std::string> searchPathArray;
searchPathArray.push_back("res");
cocos2d::FileUtils::getInstance()->setSearchPaths(searchPathArray);
}
- (void)detoryCocosEnvironment {
}
- (void)cocosDidEnterBackground {
cocos2d::Application::getInstance()->applicationDidEnterBackground();
}
- (void)cocosWillEnterForeground {
cocos2d::Application::getInstance()->applicationWillEnterForeground();
}
@end