永发信息网

如何在appdelegate中调用lua类

答案:1  悬赏:0  手机版
解决时间 2021-11-09 11:48
如何在appdelegate中调用lua类
最佳答案
如何在cocos2d c++代码中调用lua以及探究,有需要的朋友可以参考下。

如何在cocos2d c++代码中调用lua

在AppDelegate 中加入了
#include"Lua_extensions_CCB.h"
#include"CCLuaEngine.h"
#include"Lua_web_socket.h"

查到代码加载lua脚步引擎
官方原话注册引擎
CCLuaEngine*pEngine=CCLuaEngine::defaultEngine();
CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);

和ccb有关的lua
CCLuaStack*pStack=pEngine->getLuaStack();
lua_State*tolua_s=pStack->getLuaState();
tolua_extensions_ccb_open(tolua_s);

和web_socket 相关的lua
pStack=pEngine->getLuaStack();
tolua_s=pStack->getLuaState();
tolua_web_socket_open(tolua_s);

pEngine->executeScriptFile("luaScript/controller.lua");
结束

打开luaScript/controller.lua仔细研究

-- avoidmemory leak
collectgarbage("setpause",100)
collectgarbage("setstepmul",5000)

require"luaScript/mainMenu"
----------------

-- run
local scene =CCScene:create()
scene:addChild(CreateTestMenu())
CCDirector:sharedDirector():runWithScene(scene)

到这里如果熟悉cocos2dx 的朋友就很熟悉了
不错,这里是cocos2d中lua的使用方法和c++中调用差别不大!

但是还没有完

Cocos2dx 对lua的封装是很好的!

如果不熟悉c++与lua的绑定的代码下面的不建议看
C++与lua的绑定传送门

关于cocos2d 与 lua绑定的代码的探究

//打开"CCLuaEngine.h"

单例实现CCScripEngineProtocol
后期应该支持不仅仅只是lua的脚本引擎

头文件有很多方法

挑一个看看
virtualintexecuteNodeEvent(CCNode*pNode,intnAction);

intCCLuaEngine::executeNodeEvent(CCNode*pNode,intnAction)
{
intnHandler=pNode->getScriptHandler();
if(!nHandler)return0;

switch(nAction)
{
casekCCNodeOnEnter:
m_stack->pushString("enter");
break;

casekCCNodeOnExit:
m_stack->pushString("exit");
break;

casekCCNodeOnEnterTransitionDidFinish:
m_stack->pushString("enterTransitionFinish");
break;

casekCCNodeOnExitTransitionDidStart:
m_stack->pushString("exitTransitionStart");
break;

casekCCNodeOnCleanup:
m_stack->pushString("cleanup");
break;

default:
return0;
}
intret=m_stack->executeFunctionByHandler(nHandler,1);
m_stack->clean();
returnret;
}

这里是进入CCNode后的一些消息函数的处理

不管
intret=m_stack->executeFunctionByHandler(nHandler,1);

最终是回到了CCLuaStack

调用了executeFunctionByHandler(nHandler,1);

继续探究

intCCLuaStack::executeFunctionByHandler(intnHandler,intnumArgs)
{
intret=0;
if(pushFunctionByHandler(nHandler))
{
if(numArgs>0)
{
lua_insert(m_state,-(numArgs+1));
}
ret=executeFunction(numArgs);
}
lua_settop(m_state,0);
returnret;
}

可以看到一些和lua与c++联系的代码了

看看这个类的初始化

boolCCLuaStack::init(void)
{
m_state=lua_open();
luaL_openlibs(m_state);
tolua_Cocos2d_open(m_state);
toluafix_open(m_state);

// Register our version of the global "print"function
constluaL_regglobal_functions[]={
{"print",lua_print},
{NULL,NULL}
};
luaL_register(m_state,"_G",global_functions);
tolua_CocoStudio_open(m_state);
#if(CC_TARGET_PLATFORM==CC_PLATFORM_IOS||CC_TARGET_PLATFORM==CC_PLATFORM_MAC)
CCLuaObjcBridge::luaopen_luaoc(m_state);
#endif
register_all_cocos2dx_manual(m_state);
register_all_cocos2dx_extension_manual(m_state);
register_all_cocos2dx_studio_manual(m_state);
// add cocos2dx loader
addLuaLoader(cocos2dx_lua_loader);

returntrue;
}

这个里的方法看名称应该是注册 coco2dx 中的类到
C++中

register_all_cocos2dx_manual(m_state);
register_all_cocos2dx_extension_manual(m_state);
register_all_cocos2dx_studio_manual(m_state);

详细看
Coco2dx-studio 先不看

头文件
lua_cocos2dx_manual.h

#ifdef__cplusplus
extern"C"{
#endif
#include"tolua++.h"
#ifdef__cplusplus
}
#endif

LUA_APIintregister_all_cocos2dx_manual(lua_State*tolua_S);

头文件
lua_cocos2dx_extensions_manual
#ifdef__cplusplus
extern"C"{
#endif
#include"tolua++.h"
#ifdef__cplusplus
}
#endif

LUA_APIintregister_all_cocos2dx_extension_manual(lua_State*tolua_S);

惊人的相似
看看tolua++.h
真相快水落石出了

这里定义了lua所以用到全部函数

这里是头部,




原来tolua也是lua封装起来的函数库,大师2003 4月就写好了
相当的牛

好上面只看了lua_cocos2dx_extensions_manual.h的头文件
cpp文件我们也一看详情
我发现注册了一些函数
但是不是全部

在CCLuaStack::init()
方法里还有
tolua_Cocos2d_open(m_state);
这个方法
相应的头文件是LuaCocos2d..h
可以打开看看详情

Luacocos2d..cpp注册了n多函数
我用注册是相对于lua而言

Luacocos2d.cpp代码贼多
有兴趣的童鞋可以看看

看来什么时间要看看cocos2d studio 的代码
紧跟时代的步伐
不能老是cocos builder
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
putty中是否可以创建文件夹
李山甫的兵后寻边三首
今天收到公司的解聘通知书
难道不帅吗
铁板神数,君有千斤担,妻担五百斤
清朝时有哪些汉族的大官
满70至80岁企业退休人有高龄补贴吗
佛山市顺宽工程劳务有限公司怎么样?
场效应管TO--220电流动不动就上100A,想知道
K1502次列车经过哪些站
求问什么是硬实时任务和软实时任务?并举例说
笑看红尘繁体字
胸椎变形 往左边歪 4 5 6 7 8节
和静县景弛汽车销售公司地址有知道的么?有点
描写壮丽河山的古诗
推荐资讯
西安鼓楼地址在哪,我要去那里办事
口袋妖怪绿宝石386中8本秘笈在哪里?
前夫说我带男人回家就把我杀掉是什么意思
水之蔻的莹肌系列好用吗?
功放平衡电位器的作用
唐山车牌号冀b28676值多少钱
谁会做手工姜汁软糖的吗,含有哪些配料,及个
辐射3到达银河广播站遇见大怪兽后,在哪拿兄
满了16岁未满17岁可以独自一个人坐飞机吗
Pauli matrix是什么意思及反义词
从国内汇款到澳洲需要几天 哪家银行最快 手续
利用爆米花纸桶做一个创意设计,求大神指点
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?