2

我正在尝试将纹理从 Lua 脚本加载到我的 C++ 游戏引擎中。

该引擎使用一个名为“ResourceHolder”的类,枚举类型来自一个名为“ResourceIdenifiers”的类。

我的游戏场景为纹理和字体(以及我需要的任何其他内容)创建了自己的 ResourceHolder。所以我有 Textures::ID(枚举类型)和 Fonts::ID 的命名空间。

所以我只是创建了一个 TextureHolder 对象'mTextures'

TextureHolder                       mTextures;

然后我简单地用单线很容易地加载纹理,如下所示:

mTextures.load(Textures::Airplane2, "../GFX/Airplane2.png");

问题是我不能在 Lua 中使用这些枚举类型,尽管我计划在我的 lua.script 文件中有这样的东西:

allTextures
{

--Airplanes
["Airplane1"]       = "../GFX/Airplane1.png",
["Airplane2"]       = "../GFX/Airplane2.png",

--Or something like this instead
["Textures::Airplane3"]         = "../GFX/Airplane3.png"

}

让 Lua 脚本处理这些枚举类型的最简单方法是什么?

这是我的 ResourceIdentifier 和 ResourceHolder 类。

资源标识符.h

#ifndef RESOURCEIDENTIFIERS_H
#define RESOURCEIDENTIFIERS_H


// Forward declaration of SFML classes
namespace sf
{
class Texture;
class Font;
}

namespace Textures
{
enum ID
{
    //Airplanes
    Airplane1,
    Airplane2,
    Airplane3,
    Background1,
    Background2,
};
}

namespace Fonts
{
enum ID
{
    Main,
};
}

// Forward declaration and a few type definitions
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>

//This class stores Identifier so they can be accessed.
class ResourceHolder
{
public:
    //This creates loads the texture from the filename, gives it an ID, and stores it in the std::map container 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);

    //This gets the texture from the std::map container, so it can be used. It gets the Resource based on the texture's ID (name).
    Resource& get(Identifier id);
    const Resource& get(Identifier id) const;
    //^SFML book - Chapter 2 - "Accessing the Identifier" ??? For when you dont want to allow editing of the Texture???


private:
    //A map stores all of the Identifier. The std::map< (1 parameter) 'Name of Resource', (2 parameter) a unique pointer of the Resource).
    std::map<Identifier, std::unique_ptr<Resource> > mResourceMap;

};

#include "ResourceHolder.inl"

#endif // RESOURCEHOLDER_H
4

1 回答 1

0

这是最简单的方法,实际上只是在 Lua 中使用基本上是新手的枚举类型,通过将枚举类型从 C++ 复制/粘贴到 Lua(并删除逗号),然后按名称将纹理加载到图像中和路径。

我正在使用“LuaPlus”而不是 LuaBridge。虽然 LuaPlus 是一个可以安装的 PITA,但在正确添加到您的项目时它会更出色(更易于使用和理解)。

这是我列举的类型:

namespace Textures
{
    enum ID
    {
        //Airplanes
        Airplane1 = 1,
        Airplane2 = 2,
        Airplane3 = 3,
        //Backgrounds
        Background1 = 100,
        Background2 = 101,
    };
}

我的 lua 脚本最终看起来像这样:

--Copy/Paste the Enumerated Types here, deleting the "," commas.
Airplane1 = 1
Airplane2 = 2
Airplane3 = 3
Background1 = 100
Background2 = 101

--All Textures are registered here.
allTextures =
{

--Airplanes
[Airplane1]         = "../GFX/Airplane1.png",
[Airplane2]         = "../GFX/Airplane2.png",
--Backgrounds
[Background]        = "../GFX/Background.png",

}

然后在C++中,调用一个函数

//LOAD GAME TEXTURES HERE
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-08T05:49:05.607 回答