Skip to content

Instantly share code, notes, and snippets.

@PoetaKodu
Last active January 28, 2017 23:14
Show Gist options
  • Save PoetaKodu/a64aa78e75e5d384686a04dd4de0d7b9 to your computer and use it in GitHub Desktop.
Save PoetaKodu/a64aa78e75e5d384686a04dd4de0d7b9 to your computer and use it in GitHub Desktop.
//////////////////////////////////////////////////////////////////////
CTextureManager::CTextureManager()
{
}
//////////////////////////////////////////////////////////////////////
CTextureManager::~CTextureManager()
{
/* Usuwamy każdą teksturę. */
for (auto textureData : m_textures)
{
delete (textureData.second);
}
}
//////////////////////////////////////////////////////////////////////
sf::Texture* CTextureManager::Load(const std::string &textureName, const std::string &texturePath)
{
/* Spróbujmy pobrać teksture z menedżera */
sf::Texture *result = CTextureManager::Get(textureName);
/* Jezeli istnieje juz tekstura o takiej nazwie */
if (result)
{
/* Używamy jej do wczytania nowej tekstury.
Nowa tekstura zamieni starą.
*/
result->loadFromFile(texturePath);
}
else
{
/* Jeśli jednak tekstura jeszcze nie istaniała
to musimy ją utworzyć od podstaw.
Tworzymy nową teksture.
*/
result = new sf::Texture();
/* Wczytujemy ją z pliku. */
result->loadFromFile(texturePath);
/* Następnie zapisujemy ją w kontenerze.*/
Instance().m_textures[textureName] = result;
}
/* Tekstura wynikowa jest wskazywana wlasnie przez result. Zwracamy ją */
return result;
}
//////////////////////////////////////////////////////////////////////
bool CTextureManager::Unload(const std::string &textureName)
{
/* By uniknąć kilkukrotniego wywołania funkcji Instance()
tworzymy referencje na tą instancję.
*/
auto &instance = Instance();
/* Szukamy tekstury w kontenerze. Funkcja find zwraca iterator. */
auto textureIt = instance.m_textures.find(textureName);
/* Jeśli iterator wskazuje na koniec kontenera to nie znaleziono tekstury.*/
if (textureIt == instance.m_textures.end())
{
return false;
}
else
{
/* Tekstura została znaleziona. Należy usunąć ją za pomocą jej wskaźnika,
który znajduje się pod textureIt->second.
*/
delete (textureIt->second);
/* Iterator wskazuje dokładnie na teksturę, którą chcemy usunąć z kontenera.
Robimy to za pomocą metody erase.
*/
instance.m_textures.erase(textureIt);
/* Tekstura została zwolniona, zwracamy prawdę. */
return true;
}
}
//////////////////////////////////////////////////////////////////////
std::size_t CTextureManager::Cleanup()
{
/* By uniknąć kilkukrotniego wywołania funkcji Instance()
tworzymy referencje na tą instancję.
*/
auto &instance = Instance();
/* Pobieramy ilość tekstur do usunięcia. */
std::size_t textureCount = instance.m_textures.size();
/* Usuwamy każdą teksture. */
for (auto textureData : instance.m_textures)
{
delete (textureData.second);
}
/* Zwracamy ilość tekstur */
return textureCount;
}
//////////////////////////////////////////////////////////////////////
sf::Texture * CTextureManager::Get(const std::string &textureName)
{
/* By uniknąć kilkukrotniego wywołania funkcji Instance()
tworzymy referencje na tą instancję.
*/
auto &instance = Instance();
/* Szukamy tekstury w kontenerze. Funkcja find zwraca iterator. */
auto textureIt = instance.m_textures.find(textureName);
/* Jeśli iterator wskazuje na koniec kontenera to nie znaleziono tekstury.*/
if (textureIt == instance.m_textures.end())
{
return nullptr;
}
/* Tekstura została znaleziona. Zwracamy ją. */
return textureIt->second;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment