之前一直是用C/C++写代码,lua嘛,东弄弄西搞搞,也看了许多乱七八糟的东西。

介绍

先看一段LuaTest的项目中AppDelegate的一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
AppDelegate::applicationDidFinishLaunching()
{
/**************************/
/* 略去Director相关初始化 */
/**************************/

/* 对Cocos2dx的函数进行注册 */
LuaEngine* pEngine = LuaEngine::getInstance();
ScriptEngineManager::getInstance()->setScriptEngine(pEngine);

/********************/
/* 此处略去资源加载 */
/********************/

/* 执行Lua的入口 */
pEngine->executeScriptFile("src/controller.lua");

return true;
}

看了Lua项目的AppDelegate也自然会对Lua有了初步的了解。接下来,我们看看和Lua相关的一些文件。

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
cocos/2d/script-support/CCScriptSupport.h
cocos/2d/script-support/CCScriptSupport.cpp
```

接着便是`cocos/scripting/lua-bindings/manual`下的目录结构(略去同名cpp、mm、c文件)

```bash
├── CCBProxy.h
├── CCLuaBridge.h
├── CCLuaEngine.h
├── CCLuaStack.h
├── CCLuaValue.h
├── Cocos2dxLuaLoader.h
├── LuaBasicConversions.h
├── LuaOpengl.h
├── LuaScriptHandlerMgr.h
├── LuaSkeletonAnimation.h
├── Lua_web_socket.h
├── lua_cocos2dx_coco_studio_manual.hpp
├── lua_cocos2dx_deprecated.h
├── lua_cocos2dx_extension_manual.h
├── lua_cocos2dx_manual.hpp
├── lua_cocos2dx_physics_manual.hpp
├── lua_cocos2dx_spine_manual.hpp
├── lua_cocos2dx_ui_manual.hpp
├── lua_debugger.h
├── lua_extensions.h
├── lua_xml_http_request.h
├── platform
│   ├── android
│   │   ├── CCLuaJavaBridge.h
│   │   └── jni
│   │   └── Java_org_cocos2dx_lib_Cocos2dxLuaJavaBridge.h
│   └── ios
│   ├── CCLuaObjcBridge.h
└── tolua_fix.h
  • 所有lua_开头的.h.cpp文件都是将本地方法绑定注册到lua的,这些一组组的就是一个一个模块撒。
    这些文件都是python文件生成的,具体可见项目LUAPROJ/frameworks/cocos2d-x/tools/
    PS : 可见 LuaStack::init()
  • 值得注意的是platform文件夹下的CCLuaXXXXBridge,这些文件实则大大方便了我们添加自定义本地方法(cpp中的函数)到lua中。
  • CCLuaBridge CCLuaStack CCLuaValue CCLuaEngine这几个则是对lua的lua_isXXXXXlua_toXXXXlua_pushXXXX等一些API进行二次封装。

lua – c库

cocos2dx 3.0 – lua c库

lua.h

lauxlib.h – 辅助库

cocos2dx中绑定c++函数

先贴上一些文章:

Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

cocos2dx 2.x – tolua++

  1. 需要根据.h编写.pkg文件和一份桥接h和.pkg
  2. 用tolua++生成对应.cpp文件
  3. 最后在AppDelegate.cpp中调用

若有改动需要再次编写pkg文件,较为繁琐

cocos2dx 3.x – generator.py & genbindings.py

  1. 配置/frameworks/cocos2d-x/tools/tolua/XXXXXX.ini
  2. 在AppDelegate.cpp中加入注册代码

PS : 本质还是调用了tolua++,相对于直接使用tolua++来说比较方便。

generator.py

待定

genbindings.py

待定

tolua++

参考文章:

tolua++实现分析

源码分析

待定(2500行代码左右,正在看中)

cocos2dx 3.0 – tolua++中文注释