sf::Sprite可以与多个sf::Sprite对象共享相同的sf::Sprite对象,因此我希望设计一个纹理管理器,使其不多次使用相同的纹理。
我使用一个标识符来引用纹理。TextureID将纹理映射到与包含该纹理的文件对应的文件路径:
std::filesystem::path mapIdToFilepath(TextureID id);在TextureManager中,我希望有一个成员函数loadTexture(),我想:
拥有
loadTexture()接受TextureID:sf::织构及纺织经理::装载机(TextureID id);
函数随后必须在内部通过调用mapIdToFilepath().将标识符TextureID转换为纹理文件路径。
sf::织构& TextureManager::loadTexture(std::filesystem::path薄膜);
调用此函数的客户端代码必须将标识符TextureID转换为纹理文件路径。但是,这个函数不需要知道mapIdToFilepath的存在,因为映射是externally.完成的
我认为第一种方法更方便,但它将TextureManager耦合到mapIdToFilepath(),因为它在内部执行TextureID文件路径转换。
从体系结构的角度来看,在考虑这两种不同的方法时应该记住哪些方面?
发布于 2020-07-14 07:12:47
我猜想,在一个广泛的方面,您正在寻找类似于资产管理器的东西来加载您的资产(无论是纹理、声音还是字体),并在任何地方使用它们。你可以用我很久以前用过的东西。创建一个Asset类,它将在地图中包含您的纹理。就像这样:
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;
}不要像现在这样使用代码,因为您需要为失败的加载或映射的不正确的键值添加条件。如果你需要别的东西,或者我回答得不对,请告诉我。谢谢。:)
https://stackoverflow.com/questions/62839108
复制相似问题