[SFML] Vector z obrazkami
Ostatnio zmodyfikowano 2012-04-05 19:19
jpowie01 Temat założony przez niniejszego użytkownika |
[SFML] Vector z obrazkami » 2012-04-05 15:13:32 Witajcie, Właśnie pracuję nad prostą przeglądarką zdjęć. Sęk w tym, że mam do wczytania kilka dość dużych obrazków. Pomyślałem, żeby podczas otwierania programu wszystkie obrazki ładowały się do tablicy. Lecz napotkałem niespodziewany problem :/ Otóż w miejscach gdzie powinny pojawiać się zdjęcia są po prostu puste, białe pola. Czytałem o tym w internecie, lecz nie wiem jak mam się zastosować do tych rad. Moje wypociny: Deklaracja vectorów: std::vector < sf::Image > zdjecie_galeria_i; std::vector < sf::Sprite > zdjecie_galeria_s; std::vector < string > sciezki; Ładowanie zdjęć do tablic: for( int i = 1; i < numer_screenshot; i++ ) { sf::Image zdjecie_i; sf::Sprite zdjecie_s; ostringstream ss; ss << i; string numer_s = ss.str(); string sciezka; sciezka = "screenshots/screenshot"; sciezka += numer_s; sciezka += ".png"; sciezki.push_back( sciezka ); zdjecie_i.LoadFromFile( sciezki.back() ); zdjecie_galeria_i.push_back( zdjecie_i ); zdjecie_s.SetImage( zdjecie_galeria_i.back() ); zdjecie_s.SetPosition( i * 100, i * 100 ); zdjecie_s.Resize( 100, 100 ); zdjecie_galeria_s.push_back( zdjecie_s ); } Oraz rysowanie spritów: for( int i = 0; i < zdjecie_galeria_s.size(); i++ ) { okno.Draw( zdjecie_galeria_s[ i ] ); } Myślałem, że będzie działać :S A ładuje się tylko ostatni obrazek. Zdjęcie poglądowe: http://zapodaj.net/images/4d25301867aa.pngOczywiście efekt końcowy będzie inny ;) Pomóżcie i z góry dzięki ! jpowie01 |
|
DejaVu |
» 2012-04-05 16:53:54 Najpierw wrzuć obiekt na listę, a później go wczytuj. Czyli:
x.push_back( sf::Image() ); x.back().LoadFromFile( "ścieżka" );
To samo dotyczy sprajtów. |
|
jpowie01 Temat założony przez niniejszego użytkownika |
» 2012-04-05 18:19:06 Niestety nie pomogło :/ Brakuje mi pomysłów. Ścieżki są dobre, bo przed napisaniem na forum je sprawdzałem. Efektem końcowym ma być zwykłe wyświetlenie wszystkich zdjęć - konkretnie screenshotów z gry zrobionych przez użytkowników. Może jakiś inny sposób ? Jakieś wskazówki jak można by to napisać inaczej ? Tablice dynamiczne poprzez new/delete coś zmienią ? Oj, wątpię. Aktualnie wygląda to następująco: for( int i = 1; i < numer_screenshot; i++ ) { ostringstream ss; ss << i; string numer_s = ss.str(); string sciezka; sciezka = "screenshots/screenshot"; sciezka += numer_s; sciezka += ".png"; sciezki.push_back( sciezka ); zdjecie_galeria_i.push_back( sf::Image() ); zdjecie_galeria_i.back().LoadFromFile( sciezki.back() ); zdjecie_galeria_s.push_back( sf::Sprite() ); zdjecie_galeria_s.back().SetImage( zdjecie_galeria_i.back() ); zdjecie_galeria_s.back().SetPosition( i * 100, i * 100 ); zdjecie_galeria_s.back().Resize( 100, 100 ); } |
|
DejaVu |
» 2012-04-05 18:33:26 A... no fakt :P Weź dynamicznie zaalokuj obiekty w vectorze. Dlaczego?
Ponieważ jeżeli kontener std::vector<sf::Sprite> się powiększa to w rzeczywistości może nastąpić realokacja tablicy przechowującej obiekty przez co tworzony jest nowy obiekt, który jest kopiowany, a sprajty mają uchwyt na dane (na obrazki), które zostały zwolnione w wyniku realokacji. Dlatego widzisz tylko jednego (ostatniego) sprajta. |
|
jpowie01 Temat założony przez niniejszego użytkownika |
» 2012-04-05 19:19:03 Dzięki wielkie ! Myślałem, że vector jest bardziej przyjazny ;) Poradziłem sobie, to najważniejsze. Temat uważam za zamknięty.
Jeszcze raz dzięki i pozdrawiam ! jpowie01 |
|
« 1 » |