Dev.log(4) – podstawowy magazyn

Sklep ma swój magazyn produktów, fabryka też, nasza gra nie będzie od nich odstawała. W tym projekcie będzie jedna znacząca różnica – produktami przechowywanymi będą tekstury.

Map? Co to?

Mapa to posortowany kontener asocjacyjny, czyli zbiornik o zmiennej długości gromadzący dane, które można dodawać i usuwać. Nie można jednak dodawać danych na konkretną pozycje, ponieważ kolejność ustalana jest według danego klucza. Mapa jest również parowym zbiornikiem asocjacyjnym, czyli jej elementami są pary wartości klucz i dana.

Źródło

Tłumacząc na polski – jest to pudełko na mniejsze pudełka. Te mniejsze pudełka mają swoje unikalne nazwy. Taki ciekawy organizer. Żeby było jeszcze lepiej, te pudełka są posortowane według nazwy.

Po co nam się to przyda?

Tekstury najlepiej przechowywać w jakimś kontenerze, tak, żeby potem móc w łatwy sposób zapanować nad nimi, by móc zapobiegać duplikatom czy w łatwy sposób usuwać je z pamięci. W tym przypadku użyjemy do tego std::map.

void ImageManager::loadTexture(const string& name, const string& filename) {
    if (textures.find(name) == textures.end()) {
        Texture tex;
        tex.loadFromFile(resourcePath() + filename);

        this->textures[name] = tex;
    }

    return;
}

Metoda ta odpowiedzialna jest za ładowanie nowych tekstur. Na początku sprawdzamy czy plik o tej nazwie jest już w naszej „bazie”. Jeśli go nie ma to ładujemy go z pliku. Następnym krokiem jest przypisanie do mapy tekstur załadowanego pliku.

Teraz wyciągnijmy naszą teksturę z mapy.

Texture& ImageManager::getRef(const string& texture) {
    return this->textures.at(texture);
}

Jak widać, wystarczy podać nazwę pod jaką się ją zapisało i voilà. Skoro potrafimy wczytać i wyciągnąć daną teksturę to teraz wykorzystajmy to w praktyce.

Przykładowe ładowanie tekstury. Jako argumenty wywołania podajemy nazwę tego elementu oraz nazwę z lokalizacją pliku, który chcemy wczytać.

imageManager->loadTexture("logo", "Caution.png");

Teksturę pozyskujemy jak w poniższym przykładzie.

gameLogo.setTexture(imageManager->getRef("logo"));

Podsumowanie

Stworzyliśmy prosty kontener na tekstury, który z czasem rozbudujemy. Pamiętaj, że odpowiednie zarządzanie pamięcią może mieć duży wpływ na działanie aplikacji. Resztę kodu znajdziesz na GitHubie.

Nie zapomnij o mediach społecznościowych!

Do następnego!

#shareShare on FacebookShare on Google+Tweet about this on TwitterShare on TumblrPin on PinterestShare on LinkedInShare on VKShare on RedditEmail this to someone