根据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 …Run Code Online (Sandbox Code Playgroud) 请考虑以下示例:
function Process()
local Container=NewContainer()
Container:On(EventType.Add,function()
Container:DoSomething()
end)
-- Does not Garbage Collect
end
Run Code Online (Sandbox Code Playgroud)
在luabridge,我保存function()为LuaRef延伸寿命的Container,它不会是GCed因为它是一个RefCountedObjectPtr
这是一个解决方法,我用来使用一个有效的弱表,但它看起来很难看:
function Process()
local Container=NewContainer()
local ParamsTable={ Container=Container }
setmetatable(ParamsTable, { __mode = 'k' })
Container:On(EventType.Add,function()
ParamsTable.Container:DoSomething()
end)
-- Garbage Collects fine
end
Run Code Online (Sandbox Code Playgroud)
有没有办法让LuaRef这个功能与此类似?或许还有另一种解决方法?
我正在绘制一个小的 C++ 程序,它将把数组传递给 Lua 并在那里修改它们,我打算在程序中读取一个 lua 脚本,这样我就可以修改它而无需重新编译程序
我的第一个障碍是确保 Lua 能够修改已经分配的数组,而不是在 Lua 空间中再次分配它们。数据将是浮动的,并且大小会非常大,但我现在从很小的地方开始。
为了简化这个接口,我尝试了 LuaBridge 2.6,但它没有提供预期的结果。下面是一个完全“工作”的程序。
#include <iostream>
#include <cstdint>
#include <cstring>
#include <vector>
#include <lua5.3/lua.hpp>
#include <LuaBridge/LuaBridge.h>
int main(void)
{
const uint32_t LENGTH = 512 * 256;
std::vector <float> input(LENGTH),
output(LENGTH);
memset(output.data(), 0, LENGTH * sizeof(float)); // Zero the output
for(uint32_t i = 0; i < LENGTH; i++) // Populate input
input[i] = (float)i + 0.5f;
lua_State *luastate = luaL_newstate();
luabridge::push(luastate, input.data()); // Supposedly passing a pointer to the first …Run Code Online (Sandbox Code Playgroud) 我今天刚刚下载了LuaBridge,到目前为止我 对它非常满意.我注意到的一件事是我能够规避将lua_State作为函数参数的正常要求.
我可以做这个:
//C++ files
void love(int i) {std::cout << i;}
luabridge::getGlobalNamespace(lua)
.addFunction("love", love);
-- Lua file
love(8)
Run Code Online (Sandbox Code Playgroud)
它会工作得很好,但如果我做任何事情的效果:
//C++ files
struct Tester {
int number;
void MemFunction (int i) { std::cout << i;}
static void Register(lua_State*);
};
void Tester::Register(lua_State *lua) {
luabridge::getGlobalNamespace(lua)
.beginClass<Tester>("Tester")
.addConstructor <void (*) (void)> ()
.addData("number", &Tester::number)
.addFunction("MemFunction", &Tester::MemFunction)
.endClass();
}
--Lua file
c = Tester() -- works...
c.number = 1 -- works...
c.MemFunction(10) -- nothing!
Run Code Online (Sandbox Code Playgroud)
我在文档中读到的任何内容都表明无法注册具有非lua_State参数的成员函数,并且我已经看到一些LuaBridge代码执行此操作没有问题.我在这做错了什么?
我使用LuaBridge将一些类和函数移植到Lua.我正在调试,我总是得到
main.lua:1: attempt to call method 'new' (a nil value)
Run Code Online (Sandbox Code Playgroud)
这是main.lua:
v = TexVector:new( 1, 2 )
v.X = 0
v.Y = 0
print( v.X, v.Y ) -- print and explicit binded functions work
Run Code Online (Sandbox Code Playgroud)
这是TexVector的初始化代码:
luabridge::getGlobalNamespace( L ).
beginClass< Cheap::Math::TexVector >( "TexVector" ).
addConstructor< void (*) ( ) >( ).
addConstructor< void (*) ( const double& , const double& ) >( ).
addData( "X", &Cheap::Math::TexVector::X ).
addData( "Y", &Cheap::Math::TexVector::Y ).
addFunction( "Add", &Cheap::Math::TexVector::Add ).
addFunction( "Sub", &Cheap::Math::TexVector::Sub ).
addFunction( "Mul", …Run Code Online (Sandbox Code Playgroud) 如何使用Luabridge(1.0.2)将函数从LUA传递给C++
local Callback=function()
print("Inside Callback function!");
end
Run Code Online (Sandbox Code Playgroud)
然后将该回调传递给c ++:
self.Background:On("Click",Callback)
Run Code Online (Sandbox Code Playgroud)
"Click"是const std :: string&,但是如何将Callback定义为函数?我尝试了一些方法(void*,std :: function),但这些方法都没有正常工作.