有什么好的方法可以使用 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();