从功能角度看 ID 到文件路径的内部与外部映射
Internal vs External Mapping of IDs to file paths from function perspective
一个sf::Sprite
可以与多个sf::Sprite
对象共享同一个sf::Texture
对象,所以我想设计一个纹理管理器来不多次使用相同的纹理。
我正在使用标识符来引用纹理。 A 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
到文件路径转换。
从架构的角度,在考虑这两种不同的方法时我应该记住哪些方面?
我假设,从广义上讲,您正在寻找类似 Asset Manager 的东西来加载您的资产(无论是纹理、声音还是字体)一次并在任何地方使用它们。你可以用我很久以前用过的东西。制作一个资产管理器 class,它将在地图中包含您的纹理。像这样:
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;
}
不要按原样使用代码,因为您需要为加载失败或地图键值不正确添加条件。如果您需要其他东西或者我回答不正确,请告诉我。谢谢你。 :)
一个sf::Sprite
可以与多个sf::Sprite
对象共享同一个sf::Texture
对象,所以我想设计一个纹理管理器来不多次使用相同的纹理。
我正在使用标识符来引用纹理。 A 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
到文件路径转换。
从架构的角度,在考虑这两种不同的方法时我应该记住哪些方面?
我假设,从广义上讲,您正在寻找类似 Asset Manager 的东西来加载您的资产(无论是纹理、声音还是字体)一次并在任何地方使用它们。你可以用我很久以前用过的东西。制作一个资产管理器 class,它将在地图中包含您的纹理。像这样:
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;
}
不要按原样使用代码,因为您需要为加载失败或地图键值不正确添加条件。如果您需要其他东西或者我回答不正确,请告诉我。谢谢你。 :)