我正在构建一个简单的 2D 游戏引擎,它变得越来越大,暴露 Lua 中的所有功能将是不可能的:所以我试图自动化一点这个过程,
无论如何,是否可以一次从堆栈中获取所有 n 个参数(具有不同类型)并将它们直接注入到 C++ 函数中。
我已经自动化了函数参数检查。仍然是函数绑定,这有点棘手
例如:
我有改变精灵位置的正常代码:
int LuaSprite::SetSpritePosition(lua_State* L)
{
Drawable* sprt = (Drawable*)lua_touserdata(L, 1);
int x = (int)lua_tonumber(L, 2);
int y = (int)lua_tonumber(L, 3);
sprt->setPosition(Vec2i(x, y));
return 0;
}
我想要实现的概念更像是这样:
int LuaSprite::SetSpritePosition(lua_State* L)
{
LOAD_ARGS(Sprite*, int, int)
GET_ARG(1)->setPosition(Vec2i(GET_ARGS_FROM(1)));
LOAD_RETURN(true, x, y, 3);
return 3;
}
So
- LOAD_ARGS将从堆栈中分别获取给定的类型。
- GET_ARG(i) 将获取索引 i 处的 arg。
- GET_ARGS_FROM(i) 将执行类似 x,y,z,type 的操作
我并不是要求同样的行为,因为它可能是不可能做到的,但至少是类似的行为
我确信仅使用“普通”C++ 是无法实现的,而且我还需要一些“神奇”宏。
我没有使用现成的自动 Lua 绑定“库”,因为存在自定义结构,并且某些函数正在使用复杂的结构和类
我做了很多搜索,但我感到非常失落。
尝试 Luaaa(https://github.com/gengyong/luaaa https://github.com/gengyong/luaaa),这是更轻量级的,仅在一个头文件中实现。
它完美地满足了您的要求。
示例代码:
// include luaaa file
#include "luaaa.hpp"
using namespace luaaa;
// Your exists class
class Cat
{
public:
Cat();
virtual ~Cat();
public:
void setName(const std::string&);
const std::string& getName() const;
void eat(const std::list<std::string>& foods);
//...
private:
//...
};
lua_State * state; // create and init lua
// To export it:
LuaClass<Cat>(state, "AwesomeCat")
.ctor<std::string>();
.fun("setName", &Cat::setName);
.fun("getName", &Cat::getName);
.fun("eat", &Cat::eat);
.def("tag", "Cat");
您可以在这里找到更多详细信息(https://github.com/gengyong/luaaa https://github.com/gengyong/luaaa).
我是这个lib的作者,我强烈建议你尝试一下,如果你有任何问题,请随时提问。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)