最简单的方法将枚举类型从Lua传递到C++?

我正在尝试从 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
点赞
用户4058932
用户4058932

下面是最简单的方法,实际上只需要在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);
}

}
2014-10-08 05:49:05