• 关于在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
    ");
        }
        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 }
  • 相关阅读:
    oracle 查询 主机名和对应的IP地址
    mysql 常用命令
    linux 下 mysql-5.5.8 安装
    oracle批量插入数据(测试)
    Oracle数据库查询优化(上百万级记录如何提高查询速度)
    针对分区表一个月3个分区定期清理脚本
    C语言中%p,%u,%lu都有什么用处
    MAC下查看环境变量的值的方法
    Mac 终端 Linux 命令总结(简单命令)
    TypeScript学习-TypeScript环境配置
  • 原文地址:https://www.cnblogs.com/cg-Yun/p/4040230.html
Copyright © 2020-2023  润新知