【发布时间】:2015-10-08 20:28:08
【问题描述】:
根据LuaBridge readme,LuaBridge 不支持“枚举常量”,我假设它只是enums。由于sf::Event 几乎完全是enums,有什么办法可以公开课程吗?目前我能想出的唯一其他解决方案是检测 C++ 中的按键,然后向 Lua 发送一个描述事件的字符串。显然,现代键盘上有大约 100 多个键,这将导致大量、丑陋的 if 语句。
没用过SFML的朋友:Link to sf::Event class source code
更新:
在尝试创建我的问题中概述的函数后,我发现它无论如何都不起作用,因为在 C++ 中不能返回多个字符串,所以大多数事件都被忽略了。
示例来源(不起作用):
std::string getEvent()
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed) {window.close(); return "";}
else if (event.type == sf::Event::GainedFocus) {return "GainedFocus";}
else if (event.type == sf::Event::LostFocus) {return "LostFocus";}
else if (event.type == sf::Event::Resized) {return "Resized";}
else if (event.type == sf::Event::TextEntered)
{
if ((event.text.unicode < 128) && (event.text.unicode > 0)) {return "" + static_cast<char>(event.text.unicode);}
}
else if (event.type == sf::Event::KeyPressed)
{
//If else for all keys on keyboard
}
else if (event.type == sf::Event::KeyReleased)
{
//If else for all keys on keyboard
}
else {return "";}
}
return "";
}
更新更新:
由于这个问题收到了零个 cmets 或答案,我决定不排除其他库。所以,如果有支持枚举的C++库,我会接受的
【问题讨论】:
-
枚举只是命名常量,您可以将其导出为 Lua 表。不需要 if 语句。我不知道 LuaBridge,但是扫描他们的文档看起来你可以通过成员代理公开 EventType,然后只返回一个你用枚举键/值初始化的 LuaTable。您可以使用字符串化运算符创建一个宏来为您完成大部分输入操作。
-
枚举不是这里的难点。我认为正确处理联合和复合成员变量要复杂得多。如果有一个绑定生成器可以做到这一点(甚至其中之一),我会印象深刻......
-
@siffiejoe C++ 对象的内存布局对绑定的复杂性没有影响。该对象只是一个指向 C++ 代码和 Lua 代码的指针,成员访问的偏移量数学是由 C++ 编译器处理的细节。
-
@Mud:成员用户数据的生命周期取决于主用户数据的生命周期。 member-userdata 不会释放它的内存,因为它属于其他人(main-userdata),如果 main-userdata 在 member-userdata 之前收集,您将在 member-userdata 中获得一个悬空指针.
-
@siffiejoe o.O 这与您之前的评论或我在此线程中所说的任何内容无关。当你通过用户数据导出一个指向 Lua 的指针时,你创建了一个
__gc元方法,这样你就可以在 Lua 用户数据被垃圾回收时释放 C++ 内存。这与 C++ 对象是否是联合完全无关。对象可能包含联合或位域或打包/对齐编译指示的事实与此讨论没有任何关系。
标签: c++ enums lua sfml luabridge