标签: luabridge

有没有一个很好的方法用Luabridge将sf :: Event暴露给Lua?

根据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)

c++ lua enums sfml luabridge

12
推荐指数
1
解决办法
595
查看次数

Luabridge对LuaRef数据的弱引用

请考虑以下示例:

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++ data-binding lua luabridge

7
推荐指数
1
解决办法
977
查看次数

在没有额外分配的情况下从 Lua 修改 main() 中的 C++ 数组

我正在绘制一个小的 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)

c++ lua luajit luabridge

6
推荐指数
1
解决办法
256
查看次数

LuaBridge和会员职能

我今天刚刚下载了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代码执行此操作没有问题.我在这做错了什么?

c++ lua class member-functions luabridge

4
推荐指数
1
解决办法
2270
查看次数

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)

c++ lua luabridge

2
推荐指数
1
解决办法
928
查看次数

LuaBridge回调(将lua函数传递给c ++)

如何使用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),但这些方法都没有正常工作.

c++ lua binding luabridge

1
推荐指数
1
解决办法
1199
查看次数

标签 统计

c++ ×6

lua ×6

luabridge ×6

binding ×1

class ×1

data-binding ×1

enums ×1

luajit ×1

member-functions ×1

sfml ×1