【H5+ & Quick-cocos2dx整合】之iOS 四 协调H5+和Quick-Coco
JavaScript和Lua两者分别调用Native OC接口通道,实现这两个框架的协调工作。 H5+ SDK以插件的实现客户化的调用Native OC,Lua则可以通过tolua工具实现。 开发H5+ SDK插件插件名称:PGPluginTest PluginTest.h @interfacePGPluginTest : PGPlugin
- (void)gotoMyGame:(PGMethod*)commands; + (void) back2App; @end PluginTest.mm @implementationPGPluginTest - (void)gotoMyGame:(PGMethod*)commands {
NSString* cbId = [commands.arguments objectAtIndex:0]; // 用户的参数会在第二个参数传回 NSString* pArgument1 = [commands.arguments objectAtIndex:1]; NSLog(@"gotomygame>>>:%@",pArgument1);
NSString* pResultString = @"success"; // 运行Native代码结果和预期相同,调用回调通知JS层运行成功并返回结果 PDRPluginResult *result = [PDRPluginResult resultWithStatus:PDRCommandStatusOK messageAsString:pResultString]; AppManager* mgr = [AppManager getInstance]; mgr.gameName = [NSString stringWithFormat:@"%@%@%@",@"games/",pArgument1,@"/src/main.lua" ]; mgr.ccView = [[CocosViewController alloc] init]; mgr.h5View = [[mgr.navigationController viewControllers] objectAtIndex:0]; [mgr.navigationController pushViewController:mgr.ccView animated:YES]; [self toCallback:cbId withReslut:[result toJSONString]]; } + (void) back2App { [[AppManager getInstance] releaseCocos]; } 实现C++ toluaLuaHelper.mm int LuaHelper::back2App() { CCLOG("LuaHelper back2App"); [PGPluginTest back2App]; return 1; } GameUtil.h #ifndef __GAME_UTIL_H_ #define __GAME_UTIL_H_ extern "C" { #include "lua.h" #include "tolua++.h" } #include "tolua_fix.h" TOLUA_API int luaopen_GameUtil_luabinding(lua_State* tolua_S); #endif
GameUtil.cpp #include "GameUtil.h" #include "LuaHelper.h" static void tolua_reg_types (lua_State* tolua_S) { tolua_usertype(tolua_S,"LuaHelper"); } #ifndef TOLUA_DISABLE_tolua_HelperFunc_luabinding_HelperFunc_getFileData00 static int tolua_LuaHelper_luabinding_LuaHelper_back2App00(lua_State* tolua_S) { #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; if ( !tolua_isusertable(tolua_S,1,"LuaHelper",&tolua_err) || !tolua_isstring(tolua_S,2,&tolua_err) || !tolua_isnoobj(tolua_S,3,&tolua_err) ) goto tolua_lerror; else #endif { LuaHelper::back2App(); } return 1; #if COCOS2D_DEBUG >= 1 tolua_lerror: tolua_error(tolua_S,"#ferror in function 'back2App'.",&tolua_err); return 0; #endif } #endif TOLUA_API int tolua_GameUtil_luabinding_open (lua_State* tolua_S) { tolua_open(tolua_S); tolua_reg_types(tolua_S); tolua_cclass(tolua_S,"",NULL); tolua_beginmodule(tolua_S,"LuaHelper"); tolua_function(tolua_S,"back2App",tolua_LuaHelper_luabinding_LuaHelper_back2App00); tolua_endmodule(tolua_S); return 1; } #if defined(LUA_VERSION_NUM) && LUA_VERSION_NUM >= 501 TOLUA_API int luaopen_GameUtil_luabinding (lua_State* tolua_S) { return tolua_GameUtil_luabinding_open(tolua_S); }; #endif
AppDelegate.mm quick_module_register方法调用luaopen_GameUtil_luabinding(L)以便于Lua调用C++接口 窗口管理关系图如下: AppManager.h:为了管理整个应用的所有UIWindow和UIController的加载和移除。 static AppManager *instance=nil; @implementation AppManager @synthesize gameName; + (AppManager*)getInstance{ static dispatch_once_tonceToken ; dispatch_once(&onceToken,^{ instance = [[super allocWithZone:NULL] init] ; }) ; return instance; } +(id) allocWithZone:(struct _NSZone *)zone { return [AppManagerinstance] ; } -(id) copyWithZone:(struct _NSZone *)zone { return [AppManagerinstance] ; } //释放cocos所有变量 - (void)releaseCocos{ cocos2d::CCDirector* director = cocos2d::CCDirector::sharedDirector(); director->end(); [self.ccView.window resignKeyWindow]; [self.ccView.window removeFromSuperview]; self.ccView.window.rootViewController = nil; self.ccView.window.hidden=YES; [self.ccView.window release]; [self.navigationController popToViewController:self.h5View animated:YES]; self.ccView.window=nil; self.ccView=nil; [self performSelector:@selector(releaseLuaEngine) withObject:nil afterDelay:0.1]; //[self.navigationController.parentViewController makeKeyAndVisible]; } - (void)releaseLuaEngine{ cocos2d::ScriptEngineManager::getInstance()->destroyInstance(); } @end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |