12

根据LuaBridge 自述文件,LuaBridge 不支持“枚举常量”,我认为它只是enums. 由于sf::Event几乎完全enums是,有什么办法可以公开课程吗?目前我能想出的唯一其他解决方案是检测 C++ 中的按键,然后向 Lua 发送一个描述事件的字符串。显然,现代键盘上有大约 100 多个键,这将导致大量、丑陋的 if 语句。

没用过SFML的朋友:链接到sf::Event类源码


更新:

在尝试创建我的问题中概述的函数后,我发现它无论如何都不起作用,因为在 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 "";
}

更新更新:

由于此问题收到的评论或答案为零,因此我决定不排除其他库。所以,如果有支持枚举的 C++ 库,我会接受

4

3 回答 3

2

由于此问题收到的评论或答案为零,因此我决定不排除其他库。所以,如果有支持枚举的 C++ 库,我会接受

Thor 库是 SFML 扩展,支持SFML 密钥类型和字符串之间的转换。这将帮助您序列化枚举器并将它们作为字符串传递给 Lua——如果需要,再返回。

于 2015-10-11T15:23:59.247 回答
1

如果您只想枚举编号,请考虑这一点。<luabridge/detail/Vector.h> 方法。

#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); }
    };
}
于 2020-11-11T14:16:52.063 回答
0

将此添加到Namespace类中:

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();
于 2021-07-06T07:16:40.337 回答