Я близок к завершению вводного урока по программированию игр и хотел бы объединить навыки, которые я выучил в классе, с моим предыдущим опытом ООП, чтобы создать небольшую библиотеку для создания 2D-игр.Моя текущая проблема, тем не менее, это лучший способ управлять коллекциями экземпляров моих классов.
Используемая мной библиотека (DarkGDK) полностью состоит из свободных функций, которые действуют на целые числа.Когда «объект» создается с помощью функции, такой как dbSprite (), вы присваиваете ему уникальный идентификатор (int
значение) для ссылки на него - я думаю, это своего рода «адрес».Лично я считаю этот подход ужасным, поэтому я создал классы для инкапсуляции каждого набора бесплатных функций, таких как Image, Sprite и AnimatedSprite (два типа спрайтов различаются в библиотеке DarkGDK.)
Проблема в том, чтоЧтобы эти объекты работали, мне все равно нужно передать уникальный идентификатор конструктору, чтобы вызывать функции DarkGDK для соответствующего адреса.Я пытаюсь отойти от ссылки на эти вещи по идентификатору все вместе, но я спорю о том, как объекты должны быть созданы.На данный момент у меня есть несколько классов AssetManager, которые хранят ссылки на каждый созданный объект, проверяют существующие идентификаторы и разрешают только уникальные, но это по-прежнему не решает проблему принудительной генерации идентификатора, внешнего для класса управления.Это привело меня к мысли, что Factory - лучший подход.
Я знаю, что в C # я мог бы создать AssetFactory<T> where T:Asset
, который может легко вызывать соответствующие конструкторы для каждого актива для создания экземпляров, но, насколько мне известно, C ++не имеет таких возможностей.
Так что я думаю, что подход, который я должен использовать, - это использование какого-то абстрактного AssetFactory. Моя идея (правильная или нет) состоит в том, что дочерние элементы AssetFactory будут отслеживать используемые идентификаторы и выдают только уникальные идентификаторы объектов.Примерно так:
class Asset {
int m_index;
Asset(int index);
};
class Image : public Asset {
Image(char* imgPath);
void Draw();
};
class Sprite : public Asset {
Sprite(Image* img);
void Draw();
};
class AssetFactory {
private:
std::vector<Asset*> m_assets;
int GetUniqueID();
public:
AssetFactory();
~AssetFactory();
virtual Asset* CreateAsset(); // but each class has different constructor parameters...
};
class ImageFactory : public AssetFactory {
Asset* CreateAsset(char* imgPath); // ...so this wouldn't work (nor compile)
};
class SpriteFactory : public AssetFactory {
Asset* CreateAsset(); // ...so will i be forced to call the default constructor and modify it later?
};
Проблема здесь в том, что, как отмечено выше, разные объекты имеют разных конструкторов, что делает этот дизайн спорным.Должен ли я придерживаться другого подхода?Или у меня просто неверное представление о фабричном шаблоне?
РЕДАКТИРОВАТЬ: Для пояснения я хочу выделить отдельные фабрики для спрайтов и изображений, потому что равен допустимо для спрайта и изображения иметь одинаковый идентификатор.Идентификаторы должны быть уникальными только среди других активов того же «типа».