最简单的方法将枚举类型从Lua传递到C++?
2014-10-7 9:33:30
收藏:0
阅读:104
评论:1
我正在尝试从 Lua 脚本中加载纹理到我的 C++ 游戏引擎。
引擎使用一个名为“ResourceHolder”的类,枚举类型来自一个名为“ResourceIdenifiers”的类。
我的游戏场景为纹理和字体(以及其他需要的任何内容)创建自己的 ResourceHolder。所以我有用于纹理的命名空间 Textures::ID(枚举类型)和用于字体的命名空间 Fonts::ID。
所以我只需创建一个名为 'mTextures' 的 TextureHolder 对象:
TextureHolder mTextures;
然后我只需使用一行命令非常容易地加载纹理:
mTextures.load(Textures::Airplane2, "../GFX/Airplane2.png");
问题是我无法在 Lua 中使用这些枚举类型,尽管我计划在我的 lua.script 文件中有这样的东西:
allTextures
{
--Airplanes
["Airplane1"] = "../GFX/Airplane1.png",
["Airplane2"] = "../GFX/Airplane2.png",
--或者像这样
["Textures::Airplane3"] = "../GFX/Airplane3.png"
}
有什么最简单的方法可以让 Lua 脚本处理这些枚举类型吗?
这是我的 ResourceIdentifier 和 ResourceHolder 类:
ResourceIdentifier.h
#ifndef RESOURCEIDENTIFIERS_H
#define RESOURCEIDENTIFIERS_H
// SFML 类的前向声明
namespace sf
{
class Texture;
class Font;
}
namespace Textures
{
enum ID
{
//飞机
Airplane1,
Airplane2,
Airplane3,
Background1,
Background2,
};
}
namespace Fonts
{
enum ID
{
Main,
};
}
// 前向声明和一些类型定义
template <typename Resource, typename Identifier>
class ResourceHolder;
typedef ResourceHolder<sf::Texture, Textures::ID> TextureHolder;
typedef ResourceHolder<sf::Font, Fonts::ID> FontHolder;
#endif // RESOURCEIDENTIFIERS_H
ResourceHolder.h(较不相关)
#ifndef RESOURCEHOLDER_H
#define RESOURCEHOLDER_H
#include <map>
#include <string>
#include <memory>
#include <stdexcept>
#include <cassert>
#include <SFML/Graphics/Image.hpp>
template <typename Resource, typename Identifier>
// 此类存储标识符以便访问。
class ResourceHolder
{
public:
// 这会从文件名创建并加载纹理,为其分配一个 ID,并将其存储在 std::map 容器 mTextureMap 中。
void load(Identifier id, const std::string& filename);
void loadImage(Identifier id, const sf::Image& image);
template <typename Parameter>
void load(Identifier id, const std::string& filename, const Parameter& secondParam);
// 这从 std::map 容器中获取纹理,以便可以使用它。 它会根据纹理的 ID(名称)获取资源。
Resource& get(Identifier id);
const Resource& get(Identifier id) const;
//^SFML book - Chapter 2 - "Accessing the Identifier" ??? 当您不希望允许编辑纹理时使用??
private:
// 映射存储所有标识符。 std::map <(第 1 参数)“资源名称”,(第 2 参数)资源的唯一指针)。
std::map<Identifier, std::unique_ptr<Resource>> mResourceMap;
};
#include "ResourceHolder.inl"
#endif // RESOURCEHOLDER_H
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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中使用基本的新手枚举类型,通过将C++中的枚举类型复制/粘贴到Lua中(并删除逗号),然后按名称和路径加载纹理图像即可。
我使用的是“LuaPlus”,而不是“LuaBridge”。虽然安装LuaPlus很麻烦,但是在正确添加到项目后,它比较优越(使用和理解更容易)。
这些是我的枚举类型:
namespace Textures { enum ID { //飞机 Airplane1 = 1, Airplane2 = 2, Airplane3 = 3, //背景 Background1 = 100, Background2 = 101, }; }我的Lua脚本看起来像这样:
--将枚举类型复制/粘贴到此处,删除“,”号。 Airplane1 = 1 Airplane2 = 2 Airplane3 = 3 Background1 = 100 Background2 = 101 --将所有纹理注册在此处。 allTextures = { --飞机 [Airplane1] = "../GFX/Airplane1.png", [Airplane2] = "../GFX/Airplane2.png", --背景 [Background] = "../GFX/Background.png", }然后在C++中调用函数
//在此处加载游戏纹理。 void Scene::loadTextures() { LuaState* pLuaState = LuaState::Create(); pLuaState->DoFile("../GFX/test.lua"); LuaObject table = pLuaState->GetGlobals()["allTextures"]; for(LuaTableIterator it(table); it; it.Next()) { int key = it.GetKey().GetInteger(); const char* value = it.GetValue().GetString(); //std::cout<<"Key: "<<key<<", Value: "<<value<<std::endl; mTextures.load(static_cast<Textures::ID>(key), value); } }