Достаточно ли легко разоблачить некоторые из SFML Луа с Луабриджем?

Я понимаю, как выставлять свои собственные классы Луа, вот так:

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 с объектами SFML, такими как sf::Text или же sf::Texture, Я не очень много экспериментировал с Луабриджем, и я не уверен, смогу ли я сделать что-то вроде этого:

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 ответ

Решение

Я не знаком с luabridge, но, похоже, у вас проблема, потому что sf::Text::setPosition перегружен.

Прямо из документации SFML: void setPosition (float x, float y) устанавливает положение объекта

void setPosition (const Vector2f &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, являются typedefs для sf::Vector2 и sf::Vector2, чтобы сэкономить пользователю набор текста.

Другие вопросы по тегам