如何在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 的朋友就很熟悉了

不错,这里是cocos2dlua的使用方法和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))                                /* L: ... arg1 arg2 ... func */

   {

        if(numArgs>0)

        {

            lua_insert(m_state,-(numArgs+1));                        /* L: ... func arg1 arg2 ... */

        }

        ret=executeFunction(numArgs);

   }

   lua_settop(m_state,0);

   returnret;

}

 

可以看到一些和luac++联系的代码了

 

看看这个类的初始化

 

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

** Support code for Lua bindings.

** Written by Waldemar Celes

** TeCGraf/PUC-Rio

** Apr 2003

** $Id: $

*/

 

/* This code is free software; you can redistributeit and/or modify it.

** The software provided hereunder is on an"as is" basis, and

** the author has no obligation to providemaintenance, support, updates,

** enhancements, or modifications.

*/

 

原来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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值