Так что после многих часов игры с вещами у меня есть кое-что, что хорошо.Я не совсем думаю, что то, что я хочу сделать, возможно, или, если это так, я просто понятия не имею, как.Это то, с чем я согласился.
Я создал новый класс под названием ArtFactory
(не решил, стоит ли расширять его до всего, что есть в игре, например, оборудования, атак и т. Д.) Со следующими заголовочными и исходными файлами;
ArtFactory.h;
#include "Arts.h"
#include "FireBolt.h"
#include <functional>
class ArtFactory {
static std::map<std::string, std::function<Art*()>> artMap;
public:
ArtFactory();
static void loadArts();
static Art* getNewArt(std::string ID) {return artMap.find(ID)->second();}
static void regArt(std::string ID, std::function<Art*()> f) {artMap[ID] = f;}
};
Отображает строку (ID) для лямбда-функции в статической карте.Лямбда-функция просто вернет новую версию Art
, которую мы хотим, если вы введете правильный идентификатор, что позволит ей создать много одинаковых Art
, что означает, что мне не нужно каждый раз инициализировать ArtFactory
в любом месте,Мне нужно будет # включить все произведения, которые я делаю в этом файле, что, к сожалению, но я считаю, что это необходимо.Если нет, я бы полюбил путь, которого не было.
Исходный файл, файл cpp;
#include "ArtFactory.h"
std::map<std::string, std::function<Art*()>> ArtFactory::artMap;
ArtFactory::ArtFactory() {
return;
}
void ArtFactory::loadArts() {
artMap["001A"] = []() -> Art* {return new FireBolt();};
}
Чтобы затем развернуть это, просто скопируйте строку в loadArts и замените идентификатор (в данном случае «001A») новым идентификатором иновый класс (FireBolt()
в данном случае) с новым классом.
Что мне не нравится в этом, так это то, что если я #include "ArtFactory.h"
где-нибудь, я также включил все остальные произведения искусства.Этот метод не устраняет необходимость ссылаться на другие виды искусства, и фактически делает обратное.В этой игре определенные персонажи / враги начинают с определенных искусств / атак, а определенные предметы несут эти искусства / атаки, поэтому будет лучше включить конкретный арт / атаку, которые мне нужны, вместо использования этой фабрики.
Для этого будет полезно реализовать режим консоли / бога, потому что теперь я могу легко перечислить все доступные рисунки и их идентификаторы и вернуть новый.Я искренне надеюсь, что это поможет кому-то в какой-то момент.Я застрял в этой проблеме в течение долгого времени, и я не мог найти хорошие темы.