有什么好的方法可以使用 Lua 桥将 sf::Event 暴露给 Lua 吗?
Is there a good way to expose sf::Event to Lua with Luabridge?
根据 LuaBridge readme,LuaBridge 不支持“枚举常量”,我认为这只是 enums
。由于 sf::Event
几乎完全是 enums
,有什么办法可以公开 class?目前我能想到的唯一其他解决方案是在 C++ 中检测按键,然后将描述事件的字符串发送到 Lua。显然,现代键盘上大约有 100 多个键,这会导致大量丑陋的 just if 语句段。
对于那些没有使用过 SFML 的人:Link to sf::Event class source code
更新:
在尝试创建我的问题中概述的函数后,我发现它无论如何都不起作用,因为在 C++ 中你不能 return 多个字符串,所以大多数事件都被忽略了。
示例来源(不起作用):
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 "";
}
更新更新:
由于这个问题收到零评论或回答,我决定不排除其他图书馆。所以,如果有支持枚举的C++库,我会接受
Since this question has received zero comments or answers, I've decided not to rule out other libraries. So, if there is a C++ library that supports enums, I will accept it
Thor 库是一个 SFML 扩展,支持 conversions between SFML key types and strings。这将帮助您序列化枚举器并将它们作为字符串传递给 Lua —— 如果需要则返回。
如果您只想枚举数字,请考虑这个。 方法。
#include <LuaBridge/detail/Stack.h>
enum class LogLevels { LOG_1, LOG_2 }
namespace luabridge
{
template <>
struct Stack<LogLevels>
{
static void push(lua_State* L, LogLevels const& v) { lua_pushnumber( L, static_cast<int>(v) ); }
static LogLevels get(lua_State* L, int index) { return LuaRef::fromStack(L, index); }
};
}
将此添加到 Namespace
class:
template<class T>
Namespace& addConstant(char const* name, T value)
{
if (m_stackSize == 1)
{
throw std::logic_error("addConstant () called on global namespace");
}
assert(lua_istable(L, -1)); // Stack: namespace table (ns)
Stack<T>::push(L,value); // Stack: ns, value
rawsetfield(L, -2, name); // Stack: ns
return *this;
}
然后使用:
getGlobalNamespace(L)
.addNamespace("sf")
.addNamespace("Event")
.addConstant("KeyPressed",sf::Event::KeyPressed)
//....
.endNamespace()
.endNamespace();
根据 LuaBridge readme,LuaBridge 不支持“枚举常量”,我认为这只是 enums
。由于 sf::Event
几乎完全是 enums
,有什么办法可以公开 class?目前我能想到的唯一其他解决方案是在 C++ 中检测按键,然后将描述事件的字符串发送到 Lua。显然,现代键盘上大约有 100 多个键,这会导致大量丑陋的 just if 语句段。
对于那些没有使用过 SFML 的人:Link to sf::Event class source code
更新:
在尝试创建我的问题中概述的函数后,我发现它无论如何都不起作用,因为在 C++ 中你不能 return 多个字符串,所以大多数事件都被忽略了。
示例来源(不起作用):
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 "";
}
更新更新:
由于这个问题收到零评论或回答,我决定不排除其他图书馆。所以,如果有支持枚举的C++库,我会接受
Since this question has received zero comments or answers, I've decided not to rule out other libraries. So, if there is a C++ library that supports enums, I will accept it
Thor 库是一个 SFML 扩展,支持 conversions between SFML key types and strings。这将帮助您序列化枚举器并将它们作为字符串传递给 Lua —— 如果需要则返回。
如果您只想枚举数字,请考虑这个。
#include <LuaBridge/detail/Stack.h>
enum class LogLevels { LOG_1, LOG_2 }
namespace luabridge
{
template <>
struct Stack<LogLevels>
{
static void push(lua_State* L, LogLevels const& v) { lua_pushnumber( L, static_cast<int>(v) ); }
static LogLevels get(lua_State* L, int index) { return LuaRef::fromStack(L, index); }
};
}
将此添加到 Namespace
class:
template<class T>
Namespace& addConstant(char const* name, T value)
{
if (m_stackSize == 1)
{
throw std::logic_error("addConstant () called on global namespace");
}
assert(lua_istable(L, -1)); // Stack: namespace table (ns)
Stack<T>::push(L,value); // Stack: ns, value
rawsetfield(L, -2, name); // Stack: ns
return *this;
}
然后使用:
getGlobalNamespace(L)
.addNamespace("sf")
.addNamespace("Event")
.addConstant("KeyPressed",sf::Event::KeyPressed)
//....
.endNamespace()
.endNamespace();