Внутреннее и внешнее сопоставление идентификаторов с путями к файлам с точки зрения функций - PullRequest
0 голосов
/ 10 июля 2020

Объект sf::Sprite может использовать один и тот же объект sf::Texture с несколькими объектами sf::Sprite, поэтому я хочу создать Диспетчер текстур , чтобы не одна и та же текстура несколько раз повторялась.

Я использую идентификатор для обозначения текстур. A TextureID отображает текстуру на путь к файлу, соответствующий файлу, содержащему текстуру:

std::filesystem::path mapIdToFilepath(TextureID id);

В TextureManager Я хочу иметь функцию-член loadTexture(), я думаю:

  1. с loadTexture() принять TextureID:

    sf::Texture& TextureManager::loadTexture(TextureID id);
    

    Функция должна затем внутренне преобразовать идентификатор TextureID в путь к файлу текстуры, вызвав mapIdToFilepath().

  2. или приняв путь к файлу текстуры в качестве аргумента:

    sf::Texture& TextureManager::loadTexture(std::filesystem::path filepath);
    

    Клиентский код, вызывающий эту функцию, должен преобразовать идентификатор TextureID пути к файлу текстуры. Однако этой функции не обязательно знать о существовании mapIdToFilepath, потому что отображение выполняется извне .

Я думаю, что первый подход более удобен но он связывает TextureManager с mapIdToFilepath(), потому что он внутренне выполняет преобразование TextureID пути к файлу.

С архитектурной точки зрения , какие аспекты я должен иметь в виду, когда учитывая эти два разных подхода?

1 Ответ

1 голос
/ 14 июля 2020

Я предполагаю, что в широком смысле вы ищете что-то вроде Asset Manager, чтобы загружать ваши активы (будь то текстуры, звуки или шрифты) только один раз и использовать их везде. Вы можете использовать то, что я использовал как go. Создайте класс Asset Manager, который будет иметь ваши текстуры на карте. Примерно так:

class TexManager
{
public:

    TexManager* tex()  //to access your assets without creating multiple instances of this class
    {
         static Texmanager texMan;
         return &texMan;
    }

    void loadTexture(std::string name, std::string filepath) //to load textures
    { 
         sf::Texture tmp;
         tmp.loadFromFile(filepath);
         texMap.insert(std::make_pair(name, tmp));
    }

    sf::Texture& getTexture(st::string name) //to retrieve textures
    { 
         return texMap.at("name");
    }

private:
    std::map<std::string, sf::Texture> texMap;
}

Не используйте код в том виде, в каком он есть, поскольку вам нужно будет добавить условия для неудачной загрузки или неправильного значения ключа для карты. Пожалуйста, дайте мне знать, если вам что-то понадобится или я ответил неправильно. Спасибо. :)

...