将 C++ 对象推送到 Lua
2021-11-16 18:55:34
收藏:0
阅读:179
评论:1
我需要帮助将在 C++ 中创建的游戏对象推送到我们的 Lua 环境中。这是一个例子,展示了我们在 C++ 中创建的 GameObjects :
class Player
{
public:
Player(std::string pName, int ObjID)
{
this -> name = pName;
this -> objectId = ObjID
}
std::string name;
int objectId;
};
现在所有的对象都是在 C++ 中创建的,我们不想在 Lua 脚本中使用构造函数。我可以使用 sol 或 LuaBridge,我已经研究了它们的示例,它们展示了如何推送带有构造函数和函数的类,但是是否可以推送带有属性而不是函数的 userdata?这样在我们的 lua 脚本中,我们可以使用 obj.name 代替 obj:GetName()
一些关于我们如何创建对象以及希望如何推送它的更多细节:
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 示例。
原文链接 https://stackoverflow.com/questions/69984785
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
好的,经过查看评论中的建议和一些研究,我似乎已经能够使用 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 暴露这个类并创建对象,如下所示:
// 将 Lua_GameObject 暴露给环境 this->lua.new_usertype<Lua_GameObject>( "GameObject", // 禁止从 Lua 构造 sol::no_constructor, // 名称属性 "Name", sol::property(&Lua_GameObject::GetName), // 所有对象的列表 "ObjectList", &Lua_GameObject::ObjectList );
现在每次我创建一个 Lua_GameObject,它都会自动添加到列表中,只需要添加一个句柄以稍后删除它们:
// 创建游戏对象 GameObject* obj = new GameObject("ObjName", 123); // 创建新的 Lua 对象,这样它就会自动添加到 GameObject:ObjectList() 中 Lua_GameObject* lua_obj = new Lua_GameObject(obj);
感谢你们的帮助!