Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.1] Vector a wczytywanie do niego tekstur

Ostatnio zmodyfikowano 2015-03-01 18:20
Autor Wiadomość
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?
P-127429
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.
P-127433
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.
P-127434
Pokropow
» 2015-02-27 08:17:37
Może zamiast trzymać tekstury w wektorze, trzymaj wskaźniki do nich?
C/C++
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:
C/C++
std::vector < sf::Sprite > sprajty
//lub
std::vector < sf::Sprite *> sprajty
P-127435
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ę;)
P-127436
DejaVu
» 2015-02-28 17:44:16
Frazy, które należy wpisać w wyszukiwarkę google:


http://cpp0x.pl/forum/temat/​?id=6894

/edit:
http://cpp0x.pl/forum/temat/​?id=8398
P-127494
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  
P-127497
DejaVu
» 2015-03-01 12:27:16
@up: enum to niepotrzebny narzut kodu. lepiej mieć mapę w której kluczem jest nazwa tekstury.
P-127503
« 1 » 2
  Strona 1 z 2 Następna strona