【问题标题】:Pushing C++ Objects to Lua将 C++ 对象推送到 Lua
【发布时间】:2021-12-27 06:33:31
【问题描述】:

我需要帮助将用 C++ 创建的游戏对象推送到我们的 Lua 环境中。这是一个看起来像我们在 C++ 中创建以下游戏对象的示例

class Player
{
public:
    Player(std::string pName, int ObjID)
    {
        this -> name = pName;
        this -> objectId = ObjID
    }
    std::string name;
    int objectId;

};

现在我们的对象都是用 C++ 创建的,我们不想在 Lua 脚本中为它创建构造函数。我对使用 sol 或 LuaBridge 持开放态度,我研究了他们的示例,他们展示了如何使用构造函数和推送函数推送类,但是是否可以使用属性而不是函数推送用户数据?这样在我们的 lua 脚本中,我们可以做 obj.name 而不是 obj:GetName()

更多关于我们如何创建 obj 的细节并希望将其推送:

Player* player1 = new Player("Player1", 1)
Player* player2 = new Player("Player2", 2)

那么希望我们能以某种方式将这些推送到环境中,谢谢您的帮助!

我对 luabridge 的尝试:

luabridge::getGlobalNamespace(this->lua_state)
        .beginClass<GameObject>("GameObject")
        .addProperty("Name", &GameObject::Name)
        .endClass();

但据我所知,如果我想通过 Lua 创建新类,而不是推送已经创建的类。用 sol 也试过类似的东西。

【问题讨论】:

  • 您想分享任何自己的想法、尝试和研究吗?
  • is it possible to push userdata with properties instead of functions? - 是的。当你写obj.name时,Lua实际上调用了getmetatable(obj).__index(obj, "name"),其中__index是你写的C函数。
  • @Piglet,感谢您的回复。我用我尝试使用 luabridge 的方法更新了主要问题,也尝试了与 sol 类似的方法。但我认为这是为了在 Lua 中创建新类,而不是从 C++ 传递类。
  • @EgorSkriptunoff,感谢您的回复,所以您的意思是我必须为我的 C++ 游戏对象编写一个小 Lua 包装器,作为 obj 的 __index?

标签: c++ lua


【解决方案1】:

好吧,在对 cme​​ts 的建议进行了一些研究之后,我似乎能够使用 sol 解决这个问题。我的解决方案是为我的游戏对象制作一个小包装器:

class Lua_GameObject
{
public: 

    Lua_GameObject(GameObject* obj) {
        this -> real_obj = obj;
        
        objects.push_back(this);
    }
    std::string GetName() const {
        auto name_str = this->real_obj->GetName();
        int len = strlen(reinterpret_cast<const char*>(name_str));
        return std::string(name_str, name_str + len);
    }
    
    static std::vector<Lua_GameObject*> ObjectList() {
        return Lua_GameObject::objects;
    }

private:
    GameObject* real_obj;

    static std::vector<Lua_GameObject*> objects;
};

在此之后,我在不同的文件中使用 sol 来公开类并创建如下对象:

// Exposes Lua_Object to the enviroment
this->lua.new_usertype<Lua_GameObject>(
    "GameObject",

    // No Constructors from lua
    sol::no_constructor,

    // Name Property
    "Name", sol::property(&Lua_GameObject::GetName),

    // List of all objects
    "ObjectList", &Lua_GameObject::ObjectList

    );

现在我每次创建 Lua_GameObject 时它都会自动添加到列表中,只需要添加一个句柄就可以稍后删除它们:

// Creates GameObject
GameObject* obj = new GameObject("ObjName", 123);

//Creates new lua Object which will automatically add it to GameObject:ObjectList()
Lua_GameObject* lua_obj = new Lua_GameObject(obj);

谢谢大家的帮助!

【讨论】:

    猜你喜欢
    • 2016-07-05
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    相关资源
    最近更新 更多