【H5+ & Quick-cocos2dx整合】之iOS 四 协调H5+和Quick-Cocos2dx之间工作

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++ tolua

LuaHelper.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

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...