从函数角度看ID到文件路径的内部与外部映射
Internal vs External Mapping of IDs to file paths from function perspective
一个sf::Sprite
可以与多个sf::Sprite
对象共享相同的sf::Texture
对象,所以我想将纹理管理器设计为多次不使用相同的纹理。
我正在使用一个标识符来引用纹理。TextureID
将纹理映射到与包含纹理的文件相对应的文件路径:
std::filesystem::path mapIdToFilepath(TextureID id);
在TextureManager
中,我想要一个成员函数loadTexture()
,我想:
让
loadTexture()
接受TextureID
:sf::Texture& TextureManager::loadTexture(TextureID id);
然后,函数必须内部通过调用
mapIdToFilepath()
将标识符TextureID
转换为纹理文件路径。或者接受纹理的文件路径作为参数:
sf::Texture& TextureManager::loadTexture(std::filesystem::path filepath);
调用此函数的客户端代码必须将标识符
TextureID
转换为纹理文件路径。然而,该函数不必知道mapIdToFilepath
的存在,因为映射是在外部完成的。
我认为第一种方法更方便,但它将TextureManager
耦合到mapIdToFilepath()
,因为它在内部执行TextureID
到文件路径的转换。
从体系结构的角度,在考虑这两种不同的方法时,我应该记住哪些方面?
我认为,从广义上讲,您正在寻找类似资产管理器的东西,只加载一次资产(无论是纹理、声音还是字体(,并在任何地方使用它们。你可以用我很久以前用过的东西。制作一个将在贴图中包含纹理的"资源管理器"类。类似这样的东西:
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;
}
不要按原样使用代码,因为您需要添加加载失败或映射键值不正确的条件。如果你需要其他东西,或者我的回答有误,请告诉我。谢谢。:(
相关文章:
- 将函数类成员映射到类本身内部
- 如何将更多文件夹添加到c++include路径
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- C++A*算法并不总是在路径中具有目标节点
- Boost Spirit,获取迭代器内部语义动作
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 内联函数中具有内部链接的全局变量
- 在函数内部的声明中初始化数组,并在外部使用它
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 卷曲bracers内部结构的声明
- 从函数角度看ID到文件路径的内部与外部映射
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 如何在pugixml中获取节点的内部XML
- 使用C链接在函数内部创建C++模板
- boost xml parsingl将xml的路径作为变量发送
- 指针没有更新它在void函数内部指向的值
- 方法内部但循环仍得到预期的不合格id错误C++
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- 红黑树的内部路径长度
- 内部路径长度