[SFML 2.1] Vector a wczytywanie do niego tekstur
Ostatnio zmodyfikowano 2015-03-01 18:20
qest43 Temat założony przez niniejszego użytkownika |
[SFML 2.1] Vector a wczytywanie do niego tekstur » 2015-02-26 23:41:51 Gdy pisałem w ALLEGRO 5 to tworzyłem kontener vector < ALLEGRO BITMAP *> bitmapa , teraz w SFML sprawa trochę się skomplikowała, mianowicie jest teraz podział na wczytywanie tekstury i sprajty. W allegro po prostu przesuwałem vector bitmapa.push_back( al_load_bitmap( "patch.txt" ) ); w SFML tak się nie da, a dodatkowo słyszałem że w wypadku tej biblioteki nie powinno się używać vectorów. Jak ta sprawa wygląda w SMFL 2.1? |
|
Monika90 |
» 2015-02-27 00:18:57 Nie używam SFML więc może się mylę, ale można trzymać sf::Texture w wektorze. Trzeba tylko pamiętać o dwóch sprawach: 1. Wektor będzie kopiował tekstury, to może być niewydajne (bo SFML nie używa move semantics z C++11). 2. Dodawanie elementów do wektora unieważnia wskaźniki i referencje do elementów wcześniej dodanych, a sprajty mają wskaźniki do tekstur, więc najpierw trzeba dodać tekstury, a dopiero potem utworzyć sprajty.
Jeżeli wie się z góry ile tekstur będzie wczytanych do wektora, to można zarezerwować miejsce i uniknąć unieważnienia wskaźników i kopiowania tekstur.
|
|
qest43 Temat założony przez niniejszego użytkownika |
» 2015-02-27 00:33:25 Przeglądałem wiele projektów na internecie i w żadnym z nich nie używano vectorów do przechowywania obrazków. Mój program pobiera z pliku ścieżki do obrazków i potem tyle razy przesuwa vector. W wypadku klasy player albo map jest tylko jedna bitmapa i z niej wycinane są sprajty, ale jak jest ekran wejściowy to już powinno się pojawiać kilka obrazków (loga etc.). W takim wypadku nie wiem do czego mam je wczytywać skoro tyle problemów jest z vectorami a ilość obrazków jest nie znana. |
|
Pokropow |
» 2015-02-27 08:17:37 Może zamiast trzymać tekstury w wektorze, trzymaj wskaźniki do nich? std::vector < sf::Texture *> tekstury;
sf::Texture * ptr = new sf::Texture; ptr->loadFromFile( "tekstura.png" ); tekstury.push_back( ptr );
myślę, że to dobre wyjście, jednak należy pamiętać, aby wywołać delete podczas czyszczenia elementów z wektora. Jeżeli chcesz ładować obrazki, oczywiście przyda ci się również vector na sprajty: std::vector < sf::Sprite > sprajty
std::vector < sf::Sprite *> sprajty
|
|
maly |
» 2015-02-27 09:07:08 jednak należy pamiętać, aby wywołać delete podczas czyszczenia elementów z wektora |
Między innymi po to są mądre wskaźniki shared_ptr i unique_ptr żeby nie pamiętać o takich duperelach ale i tak niektórzy chcą się katować gołymi wskaźnikami więc nie wiem po co ja tu wogóle o tym piszę;) |
|
DejaVu |
» 2015-02-28 17:44:16 |
|
unkn9wn |
» 2015-03-01 00:28:53 według mnie łatwiej jest pracować gdy się ma mapę textur identyfikowanych przez włsny enum. O ile to mniej wydajne to nie powiem
enum Tekstury; std::map<Tekstury, sf::Texture> tekstury;
Najłatwiej stworzyć sobie klasę w ktorej to bedziesz trzymal + dwie proste metody załaduj(Tekstury id, std::string nazwaPliku) w ktorej ladujesz do mapy i get(Tekstury id)
sf::Sprite jakby co zawiera wskaźnik do sf::Textury |
|
DejaVu |
» 2015-03-01 12:27:16 @up: enum to niepotrzebny narzut kodu. lepiej mieć mapę w której kluczem jest nazwa tekstury. |
|
« 1 » 2 |