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