enums — Самый простой способ передать перечислимый тип из Lua в C ++?

Я пытаюсь загрузить текстуры из скрипта Lua в мой игровой движок на C ++.

Движок использует класс с именем «ResourceHolder», а перечисляемый тип относится к классу «ResourceIdenifiers».

Моя игровая сцена создает свой собственный ResourceHolder для обеих текстур & Шрифты (как и все, что мне нужно). Поэтому у меня есть пространства имен для Textures :: ID (тип enum) и 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.

ResourceIdentifier.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

1

Решение

Вот самый простой способ сделать это — просто использовать перечисленные типы в 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);
}

}
0

Другие решения


По вопросам рекламы [email protected]