关于在Cocos2dx引擎中手动绑定C++到Lua

虽然大多数写的代码是Lua脚本,但是仍然会遇到单纯的使用Lua语言解决不了的问题,而只好要先用C++写好想要的功能,然后留好接口给Lua调用,

那么问题来了,怎么将C++写好的函数绑定到Lua中呢。。。

当然Cocos2dx3.x版本的应该集成了绑定这一功能,但是下面我要说的是绑定固定的函数到Lua中。

先在C++中实现自己的静态函数(此处只贴出声明.h):

 1 //
 2 //  TestBind.h
 3 //  testMoveTo
 4 //
 5 #include <stdio.h>
 6 #include <iostream>
 7 #include "cocos2d.h"
 8 #include "lua.h"
 9 using namespace std;
10 
11 class TestBind{
12 public:
13     static string getWorld(string prefix);
14 };

开始绑定:

//
//  TestBind_luabinding.h
//  testMoveTo
//

extern "C"{
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <tolua++.h>
}

extern int luaopen_TestBind_luabinding(lua_State* luaState);

//
//  TestBind_luabinding.cpp
//  testMoveTo
//
#include "TestBind_luabinding.h"
#include <iostream>
#include "tolua_fix.h"
#include "LuaBasicConversions.h"
#include "TestBind.h"
#define BIND_PREFIX std::string("bind")

int TestBind_getWorld(lua_State* luaState)
{
    int topIndex = lua_gettop(luaState);
    assert(topIndex == 1);//此处的 1指的是该函数具有几个参数
    
    const char *prefix = lua_tostring(luaState, -1);//此处的 -1指的是参数在该函数的参数列表中从后往前是第几个
    if (!prefix) {
        generror(luaState, "TestBind.getWorld - #1\n");
    }
    std::string word = TestBind::getWorld(prefix);
    lua_pushstring(luaState, word.c_str());
    return 1;//目标函数返回值的个数
}

extern int luaopen_TestBind_luabinding(lua_State* luaState){
    int top = lua_gettop(luaState);
    
    static const struct luaL_Reg funcs[] = {
        {"sayHelo", TestBind_getWorld},
        {NULL, NULL}
    };
    luaL_register(luaState, BIND_PREFIX.c_str(), funcs);//BIND_PREFIX 指的是函数所属的全局表
    lua_settop(luaState, top);
}

最后,将绑定函数在AppDelegate中注册一下:

 1 #include "CCLuaEngine.h"
 2 #include "SimpleAudioEngine.h"
 3 #include "TestBind_luabinding.h"
 4 
 5 bool luaBinding(lua_State* luaState){
 6     lua_CFunction luabinds[] = {
 7         luaopen_TestBind_luabinding,
 8         nullptr
 9     };
10     loadlibs(luabinds, luaState);
11     return true;
12 }
13 
14 bool AppDelegate::applicationDidFinishLaunching()
15 {
16     auto engine = LuaEngine::getInstance();
17     ScriptEngineManager::getInstance()->setScriptEngine(engine);
18     
19     lua_State *luaState = engine->getLuaStack()->getLuaState();
20     
21     //注册lua-binding函数
22     if (!luaBinding(luaState)) {
23         CCLOG("Launch # register lua-binding error");
24         return false;
25     }
26 //    engine->executeString("print('this is a executeString!')");
27     
28     if (engine->executeScriptFile("src/main.lua")) {
29         return false;
30     }
31     
32     
33     
34 
35     return true;
36 }

 

posted @ 2014-10-21 14:03  -浮云骑士-  阅读(375)  评论(0编辑  收藏  举报