使用lubridge相对容易地将一些SFML暴露给lua
Is exposing some of SFML to lua with luabridge relatively easy?
我知道如何将自己的类暴露给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::Text
或sf::Texture
。我对lubridge没有做过很多实验,我不确定我是否能做这样的事情:
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]
我不熟悉lubridge,但听起来你有一个问题,因为sf::Text::setPosition过载。
直接来自SFML文档:无效setPosition(浮动x,浮动y)设置对象
的位置void setPosition (const Vector2f &position)设置对象
的位置没有办法确定你的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
lubridge不支持重载函数,将来也不太可能支持。由于Lua是动态类型的,任何试图解析从脚本传递的一组参数的系统在选择适当匹配的c++函数签名时都会面临相当大的模糊性。
你需要打包,听起来像一个有趣的下午!您需要为函数提供不同的名称,或者只包含一个。
另外,我怀疑当参数或返回值是其他SFML对象时,会有一些欺骗。我想他们需要先被定义?请注意,像Vector2i和Vector2f这样的东西是sf::Vector2和sf::Vector2的类型,以节省用户输入的时间。
- SFML纹理像播放器
- 如何使用AngelScript注册SFML Vector2运算符
- 如何修复sfml c++代码编译错误
- SFML library: http request
- 落砂模拟碰撞检测C++和SFML
- 使用 SFML 和 C++ 将 Pixel 打印到屏幕上
- SFML RenderWindow打开窗口需要很长时间
- 矢量下标超出SFML游戏中的范围
- 获取 SFML 窗口的 HWND 和高可用性?
- 将 Vulkan 与 SFML 结合使用?
- SFML 文本未绘制在窗口上
- SFML 碰撞永远不会在我的系统中注册
- 使用对象数组对 SFML 进行动画处理
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 如何使用 SFML 在贪吃蛇游戏中定义游戏结束?
- 如何通过多类"Union variable" (sfml) 使用轮询事件
- 1d.exe找不到SFML文件?
- 当我尝试通过 mingw 使用 CMake 和 SFML 库编译项目时出错
- Declaration of IntRect SFML
- 使用lubridge相对容易地将一些SFML暴露给lua