使用 luabridge 将一些 SFML 暴露给 lua 相对容易吗?
Is exposing some of SFML to lua with luabridge relatively easy?
我知道如何将我自己的 classes 暴露给 lua,像这样:
lua_State* L = luaL_newstate();
luaL_openlibs(L);
getGlobalNamespace(L)
.beginClass<Foo>("Foo")
.addConstructor<void(*)(void)>()
.addProperty(/*Property Definition*/)
.addFunction(/*Function Definition*/)
.endClass()
但是,由于我试图将尽可能多的代码移动到 lua 脚本中,所以我希望 lua class 具有 SFML 对象,例如sf::Text
或 sf::Texture
。我还没有对 Luabridge 做过很多实验,我不确定我是否能够做这样的事情:
lua_State* L = luaL_newstate();
luaL_openlibs(L);
getGlobalNamespace(L)
.beginClass<sf::Text>("Text")
.addConstructor<void(*)(void)>()
.addFunction("setCharacterSize", &sf::Text::setCharacterSize)
.addFunction("getCharacterSize", &sf::Text::getCharacterSize)
//ETC...
.endClass()
如果这样做不起作用(我担心可能会发生),我是否需要创建一个包装器 class,如下所示:
class Text
{
private:
sf::Text textObj;
public:
void setCharacterSize(const int& size) {textObj.setCharacterSize(size);}
int& getCharacterSize() {return textObj.getCharacterSize();}
}
//Then do the same as the second snippet, without sf::Text but with Text class
更新:
在尝试公开 sf::Text
class 后,我在尝试执行 sf::Text::setPosition
功能时遇到错误:
lua_State* L = luaL_newstate();
luaL_openlibs(L);
luabridge::getGlobalNamespace(L)
.beginClass<sf::Text>("Text")
.addConstructor<void(*)(void)>()
.addFunction("setCharacterSize", &sf::Text::setCharacterSize)
.addFunction("getCharacterSize", &sf::Text::getCharacterSize)
.addFunction("setColor", &sf::Text::setColor)
.addFunction("getColor", &sf::Text::getColor)
.addFunction("setFont", &sf::Text::setFont)
.addFunction("getFont", &sf::Text::getFont)
.addFunction("setPosition", &sf::Text::setPosition)
.addFunction("getPosition", &sf::Text::getPosition)
.addFunction("setScale", &sf::Text::setScale)
.addFunction("getScale", &sf::Text::getScale)
.addFunction("setString", &sf::Text::setString)
.addFunction("getString", &sf::Text::getString)
.endClass()
错误信息:
no matching function for call to ‘luabridge::Namespace::Class<sf::Text>::addFunction(const char [12], <unresolved overloaded function type>)’
note: candidate is:
note: template<class MemFn> luabridge::Namespace::Class<T>& luabridge::Namespace::Class<T>::addFunction(const char*, MemFn) [with MemFn = MemFn; T = sf::Text]
我不熟悉 luabridge,但听起来你有问题,因为 sf::Text::setPosition 超载了。
直接来自 SFML 文档:
void setPosition (float x, float y)
设置对象的位置
void setPosition (const Vector2f &position)
设置对象的位置
luabridge 无法确定您要将哪个用于 setPosition。由于您听起来不熟悉评论中的想法,我将澄清:在 C++ 中,函数签名是它的名称,以及它采用的参数(参数数量和参数类型)。函数不能有相同的签名,这意味着它们可以有相同的名字,但 C++ 编译器可以通过它们的参数来区分它们。 sf::Text有两个函数setPosition,一个取一个vector2f,一个直接取两个float
然而,你这样做是这样吗link? http://oberon00.github.io/luabind/functions.html
哪里说到重载函数,你能不能同样提供签名?
所以你会有这样的东西:
.addFunction("setPosition", (void(*)(float x, float y)) &sf::Text::setPosition)
如果不是,您将需要换行并为重载指定一个不同的名称。
编辑:https://github.com/vinniefalco/LuaBridgeDemo/blob/master/LuaBridge/README.md
LuaBridge 不支持重载函数,将来也不可能支持。由于 Lua 是动态类型的,任何试图解析从脚本传递的一组参数的系统在尝试选择适当匹配的 C++ 函数签名时都会面临相当大的歧义。
你需要总结一下,听起来是个有趣的下午!您需要为函数指定不同的名称,或者只包含一个名称。
此外,我怀疑当参数或 return 值是其他 SFML 对象时会有一些诡计。我猜他们需要先定义?请注意,像 Vector2i 和 Vector2f 这样的东西是 sf::Vector2 和 sf::Vector2 的类型定义,以节省用户一些输入。
我知道如何将我自己的 classes 暴露给 lua,像这样:
lua_State* L = luaL_newstate();
luaL_openlibs(L);
getGlobalNamespace(L)
.beginClass<Foo>("Foo")
.addConstructor<void(*)(void)>()
.addProperty(/*Property Definition*/)
.addFunction(/*Function Definition*/)
.endClass()
但是,由于我试图将尽可能多的代码移动到 lua 脚本中,所以我希望 lua class 具有 SFML 对象,例如sf::Text
或 sf::Texture
。我还没有对 Luabridge 做过很多实验,我不确定我是否能够做这样的事情:
lua_State* L = luaL_newstate();
luaL_openlibs(L);
getGlobalNamespace(L)
.beginClass<sf::Text>("Text")
.addConstructor<void(*)(void)>()
.addFunction("setCharacterSize", &sf::Text::setCharacterSize)
.addFunction("getCharacterSize", &sf::Text::getCharacterSize)
//ETC...
.endClass()
如果这样做不起作用(我担心可能会发生),我是否需要创建一个包装器 class,如下所示:
class Text
{
private:
sf::Text textObj;
public:
void setCharacterSize(const int& size) {textObj.setCharacterSize(size);}
int& getCharacterSize() {return textObj.getCharacterSize();}
}
//Then do the same as the second snippet, without sf::Text but with Text class
更新:
在尝试公开 sf::Text
class 后,我在尝试执行 sf::Text::setPosition
功能时遇到错误:
lua_State* L = luaL_newstate();
luaL_openlibs(L);
luabridge::getGlobalNamespace(L)
.beginClass<sf::Text>("Text")
.addConstructor<void(*)(void)>()
.addFunction("setCharacterSize", &sf::Text::setCharacterSize)
.addFunction("getCharacterSize", &sf::Text::getCharacterSize)
.addFunction("setColor", &sf::Text::setColor)
.addFunction("getColor", &sf::Text::getColor)
.addFunction("setFont", &sf::Text::setFont)
.addFunction("getFont", &sf::Text::getFont)
.addFunction("setPosition", &sf::Text::setPosition)
.addFunction("getPosition", &sf::Text::getPosition)
.addFunction("setScale", &sf::Text::setScale)
.addFunction("getScale", &sf::Text::getScale)
.addFunction("setString", &sf::Text::setString)
.addFunction("getString", &sf::Text::getString)
.endClass()
错误信息:
no matching function for call to ‘luabridge::Namespace::Class<sf::Text>::addFunction(const char [12], <unresolved overloaded function type>)’
note: candidate is:
note: template<class MemFn> luabridge::Namespace::Class<T>& luabridge::Namespace::Class<T>::addFunction(const char*, MemFn) [with MemFn = MemFn; T = sf::Text]
我不熟悉 luabridge,但听起来你有问题,因为 sf::Text::setPosition 超载了。
直接来自 SFML 文档: void setPosition (float x, float y) 设置对象的位置
void setPosition (const Vector2f &position) 设置对象的位置
luabridge 无法确定您要将哪个用于 setPosition。由于您听起来不熟悉评论中的想法,我将澄清:在 C++ 中,函数签名是它的名称,以及它采用的参数(参数数量和参数类型)。函数不能有相同的签名,这意味着它们可以有相同的名字,但 C++ 编译器可以通过它们的参数来区分它们。 sf::Text有两个函数setPosition,一个取一个vector2f,一个直接取两个float
然而,你这样做是这样吗link? http://oberon00.github.io/luabind/functions.html
哪里说到重载函数,你能不能同样提供签名?
所以你会有这样的东西:
.addFunction("setPosition", (void(*)(float x, float y)) &sf::Text::setPosition)
如果不是,您将需要换行并为重载指定一个不同的名称。
编辑:https://github.com/vinniefalco/LuaBridgeDemo/blob/master/LuaBridge/README.md
LuaBridge 不支持重载函数,将来也不可能支持。由于 Lua 是动态类型的,任何试图解析从脚本传递的一组参数的系统在尝试选择适当匹配的 C++ 函数签名时都会面临相当大的歧义。
你需要总结一下,听起来是个有趣的下午!您需要为函数指定不同的名称,或者只包含一个名称。
此外,我怀疑当参数或 return 值是其他 SFML 对象时会有一些诡计。我猜他们需要先定义?请注意,像 Vector2i 和 Vector2f 这样的东西是 sf::Vector2 和 sf::Vector2 的类型定义,以节省用户一些输入。