Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有一种好方法可以通过Luabridge向Lua公开sf::Event?_C++_Enums_Lua_Sfml_Luabridge - Fatal编程技术网

C++ 有没有一种好方法可以通过Luabridge向Lua公开sf::Event?

C++ 有没有一种好方法可以通过Luabridge向Lua公开sf::Event?,c++,enums,lua,sfml,luabridge,C++,Enums,Lua,Sfml,Luabridge,根据,LuaBridge不支持“枚举常量”,我假设它只是enums。既然sf::Event几乎完全是enum,有什么方法可以公开该类吗?目前,我能想出的唯一另一个解决方案是检测C++中的按键,然后向Lua发送一个字符串,描述事件。显然,现代键盘上大约有100多个键,这将导致大量丑陋的just-if语句 对于未使用SFML的用户: 更新: 尝试创建我的问题中概述的函数之后,我发现它不起作用,因为在C++中你不能返回一个以上的字符串,所以大多数事件被忽略。 示例源(不起作用): std::stri

根据,LuaBridge不支持“枚举常量”,我假设它只是
enums
。既然
sf::Event
几乎完全是
enum
,有什么方法可以公开该类吗?目前,我能想出的唯一另一个解决方案是检测C++中的按键,然后向Lua发送一个字符串,描述事件。显然,现代键盘上大约有100多个键,这将导致大量丑陋的just-if语句

对于未使用SFML的用户:


更新:

尝试创建我的问题中概述的函数之后,我发现它不起作用,因为在C++中你不能返回一个以上的字符串,所以大多数事件被忽略。 示例源(不起作用):

std::string getEvent()
{
sf::事件;
while(window.pollEvent(事件))
{
如果(event.type==sf::event::Closed){window.close();返回“”;}
else if(event.type==sf::event::GainedFocus){返回“GainedFocus”;}
如果(event.type==sf::event::LostFocus){返回“LostFocus”;}
else if(event.type==sf::event::Resized){返回“Resized”}
else if(event.type==sf::event::textcentered)
{
如果((event.text.unicode<128)和(&(event.text.unicode>0)){return”“+static_cast(event.text.unicode);}
}
else if(event.type==sf::event::KeyPressed)
{
//键盘上所有键的If-else
}
else if(event.type==sf::event::keyreased)
{
//键盘上所有键的If-else
}
else{return”“;}
}
返回“”;
}

更新: 由于这个问题没有收到任何评论或答案,我决定不排除其他图书馆。所以,如果有一个支持EnnS的C++库,我将接受它 由于这个问题没有收到任何评论或答案,我决定不排除其他图书馆。所以,如果有一个支持EnnS的C++库,我将接受它
Thor库是一个SFML扩展,支持。这将有助于序列化枚举数并将它们作为字符串传递给Lua,如果需要,则返回。

< P>如果只想枚举枚举数,请考虑这一点。方法

#包括
枚举类日志级别{LOG_1,LOG_2}
名称空间列桥
{
模板
结构堆栈
{
静态void push(lua_State*L,LogLevels const&v){lua_pushnumber(L,static_cast(v));}
静态日志级别get(lua_State*L,int index){return LuaRef::fromStack(L,index);}
};
}

枚举只是命名常量,您可以将其导出为Lua表。如果需要声明,则不需要。我不知道LuaBridge,但是扫描他们的文档看起来可以通过成员代理公开EventType,然后返回一个用枚举键/值初始化的LuaTable。您可以使用字符串化操作符创建宏来执行大部分键入操作。枚举不是这里的难题。我认为正确处理union和复合成员变量要复杂得多。如果有一个绑定生成器可以做它(甚至是其中的一个)……@ SIFFEJOE,C++对象的内存布局对绑定的复杂性没有影响,我会印象深刻。该对象只是一个指针,既指向C++代码又适用于Lua代码,而成员访问的偏移数学是C++编译器处理的细节。@ MUT:成员用户数据的生存期取决于主要用户数据的生存期。成员userdata不会释放其内存,因为它属于其他人(主userdata),如果在成员userdata之前收集了主userdata,您将在成员userdata中获得一个悬空指针。@siffiejoe o.o与您以前的评论或我在本线程中说过的任何内容无关。当通过UrrDATA导出一个指向Lua的指针时,创建一个<代码>“ygGC/<代码>元方法”,这样当LUA USER数据被垃圾收集时,您可以释放C++内存。这与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 "";
}
#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); }
    };
}