【问题标题】:Is there a good way to expose sf::Event to Lua with Luabridge?有没有用 Luabridge 向 Lua 公开 sf::Event 的好方法?
【发布时间】: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


【解决方案1】:

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

Thor 库是 SFML 扩展,支持 conversions between SFML key types and strings。这将帮助您序列化枚举器并将它们作为字符串传递给 Lua - 如果需要,可以返回。

【讨论】:

    【解决方案2】:

    如果您只想对枚举进行编号,请考虑这一点。 方法。

    #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); }
        };
    }
    

    【讨论】:

      【解决方案3】:

      将此添加到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();
      

      【讨论】:

        猜你喜欢
        • 2013-01-29
        • 1970-01-01
        • 2021-07-14
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 2020-07-17
        • 1970-01-01
        • 2010-09-30
        相关资源
        最近更新 更多