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

[SFML] Vector z obrazkami

Ostatnio zmodyfikowano 2012-04-05 19:19
Autor Wiadomość
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:
C/C++
std::vector < sf::Image > zdjecie_galeria_i;
std::vector < sf::Sprite > zdjecie_galeria_s;
std::vector < string > sciezki;
Ładowanie zdjęć do tablic:
C/C++
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:
C/C++
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.png
Oczywiście efekt końcowy będzie inny ;)

Pomóżcie i z góry dzięki !
jpowie01
P-53887
DejaVu
» 2012-04-05 16:53:54
Najpierw wrzuć obiekt na listę, a później go wczytuj. Czyli:
C/C++
x.push_back( sf::Image() );
x.back().LoadFromFile( "ścieżka" );
To samo dotyczy sprajtów.
P-53894
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:
C/C++
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 );
}
P-53902
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.
P-53903
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
P-53905
« 1 »
  Strona 1 z 1