用luabridge将一些SFML暴露给lua相对容易吗?

时间:2015-07-18 14:48:27

标签: c++ lua sfml luabridge

我理解如何将我自己的类暴露给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脚本中,所以我希望拥有具有SFML对象的lua类,如sf::Textsf::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 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类后,尝试执行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]

1 个答案:

答案 0 :(得分:0)

我不熟悉luabridge,但听起来你有问题因为sf :: Text :: setPosition超载了。

直接来自SFML文档: void setPosition(float x,float y)     设置对象的位置

void setPosition(const Vector2f&amp; position)     设置对象的位置

luabridge无法确定您对setPosition使用的含义。由于您在评论中听不到这个想法,我将澄清:在C ++中,函数签名是它的名称,以及它所采用的参数(参数的数量和参数的类型)。函数不能具有相同的签名,这意味着它们具有相同的名称,但C ++编译器可以通过它们的参数区分它们。 sf :: Text有两个名为setPosition的函数,一个接受vector2f,另一个接受两个浮点数。

然而,你正在做这个链接吗? 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 ++函数签名时都会面临相当大的歧义。

你需要包裹,听起来像一个有趣的下午!您需要为函数指定不同的名称,或者只包含一个。

另外,我怀疑当参数或返回值是其他SFML对象时会有一些诡计。我想他们需要先定义?请注意,像Vector2i和Vector2f这样的东西是sf :: Vector2和sf :: Vector2的typedef,以保存用户输入的内容。