Достаточно ли легко разоблачить некоторые из 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]

0

Решение

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

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

void setPosition (const Vector2f &позиция)
установить положение объекта

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, чтобы сэкономить пользователю набор текста.

0

Другие решения


По вопросам рекламы [email protected]