gilgamesh Temat założony przez niniejszego użytkownika |
[C++ Allegro] Wyświetlanie losowych obrazków » 2012-11-27 21:46:50 To znowu ja, wybaczcie. Mam problem, napisałem funkcję do wyświetlania losowych obrazków - to działa. Chciałem jednak dodać aby po osiągnięciu współrzędnych przykładowo x=300, y=300, obrazek się losował i wyświetlał nowy. void LosujImage() { image.live = true; int pom =( rand() % 4 ) + 1; image.nazwa << "znak/" << pom << ".png"; imageImage = al_load_bitmap( image.nazwa.str().c_str() ); printf( "%d", pom ); }
void DrawZnak() { image.zycie = true; al_draw_scaled_rotated_bitmap( image.image, image.Width / 2, image.Height / 2, image.x, image.y, 1, 1, 0, 0 ); }
void pozycja() if( ludzik.x == 300 ) &&( ludzik.y == 300 ) ) { image.zycie = false; if( !ludzik.live ) LosujImage( image ); }
moim zdaniem muszę jakoś wyczyścić funkcją ale gdy próbuję to się program wiesza. Proszę bardzo o pomoc. //edit Pierwsze losowanie jest udane i się wyświetla |
|
SeaMonster131 |
» 2012-11-27 22:08:00 Albo to błąd, albo dajesz nam nie te funkcje co trzeba :p void LosujImage() { image.live = true; int pom =( rand() % 4 ) + 1; image.nazwa << "znak/" << pom << ".png"; imageImage = al_load_bitmap( image.nazwa.str().c_str() ); printf( "%d", pom ); }
...
if( !ludzik.live ) LosujImage( image );
Ale jeżeli jest tylko jedna taka funkcja, to powinno być okej. Wczytujesz bitmapę (co nie jest zbyt wydajne, aby wczytywać bitmapę za każdym razem), wyświetlasz, jeżeli warunek if będzie prawdziwy, to znowu wczytujesz bitmapę, wyświetlasz... |
|
gilgamesh Temat założony przez niniejszego użytkownika |
» 2012-11-27 22:29:14 tak też próbowałem i gdy sprawdzam gdy warunek jest prawdziwy lub nie to wyświetla mi tylko pierwszy wylosowany obrazek.
nie to nie jest jedna funkcja, uznałem aby nie wrzucać wszystkiego czyli deklaracji tego typu, bo wyświetla pierwszą wylosowaną bitmapę, jednak jak mówię gdy ludzikiem będę na polu x=300, y=300, faktycznie obrazek mi losuje, jednak wyświetla cały czas ten sam.
//edit
to są trzy różne funkcje, nie jest wszystko robione w jednej.
mam pytanie w jaki sposób można było robić aby było wydajniej, inaczej niż wczytywanie bitmapy?
|
|
gilgamesh Temat założony przez niniejszego użytkownika |
» 2012-11-27 23:23:11 dokładnie mam tak w programie deklaracja (globalnie) ALLEGRO_BITMAP *fotoImage; ALLEGRO_BITMAP *ludzikImage; deklaracja(main) InitLudzik(ludzik, ludzikImage); InitFoto(foto, fotoImage); void InitFoto( Foto & foto, ALLEGRO_BITMAP * image = NULL ) { foto.live = true; foto.x = 100; foto.y = 100; if( image != NULL ) { foto.image = image; } }
funkcja sprawdzająca pozycji ludzika void LudzikPos( ludzikImage & ludzik ) { if( ludzik.x = 300 && ludzik.y = 300 ) foto.live = false; LosujFoto( Foto & foto ); }
funkcja losująca void LosujFoto( FotoImage & foto ) { int losuj =( rand() % 4 ) + 1; foto.live = true; foto.nazwa << "znaki/" << losuj << ".png"; fotoImage = al_load_bitmap( foto.nazwa.str().c_str() ); printf( "%d", losuj ); }
funkcja wyświetlająca void DrawFoto( FotoImage & foto ) { al_draw_scaled_rotated_bitmap( foto.image, foto.imageWidth / 2, foto.imageHeight / 2, foto.x, foto.y, 0.5, 0.5, 0, 0 ); }
obrazek mi się nie wyświetla gdy foto.live=false, losuje się ponownie i wyświetla zawsze pierwszy obrazek który wylosowało. Pozmieniałem nazwę zmiennych aby było czytelniejsze. Proszę o pomoc/ |
|
gilgamesh Temat założony przez niniejszego użytkownika |
» 2012-11-28 16:04:43 męczę się nadal z tym :/
jak sprawdzam pozycję ludzika dodałem wywołanie funkcji InitFoto(), wyświetla tylko pierwszy wylosowany obrazek, pomyślałem aby zwolnić al_destroy_bitmap(foto.image); po prostu kończy mi działanie programu. Nadal nie wiem czemu tak się dzieje. |
|
SeaMonster131 |
» 2012-11-28 16:43:58 if( ludzik.x = 300 && ludzik.y = 300 )
== operator porównania = operator przypisania
LosujFoto( Foto & foto );
Tak nie wywołuje się funkcji. |
|
gilgamesh Temat założony przez niniejszego użytkownika |
» 2012-11-28 16:56:04 tak to już poprawiłem, mój błąd przy wklejaniu na forum, albowiem chciałem uprościć moje funkcje aby były czytelniejsze, lecz nadal nie działa po poprawianiu, kompilacja wykonuje się pozytywnie (bez żadnego błędu czy ostrzeżenia) jednak gdy odpalę program to nie działa. if(( ludzik.x == 300 ) &&( ludzik.y == 0 ) ) { ludzik.x = 420; ludzik.y = 500; losuj = 0; foto.live = false; if( !foto.live ) LosujFoto( foto, losuj ); InitFoto( foto, fotoImage ); }
teraz mam tak i nadal nic to nie daje. |
|
gilgamesh Temat założony przez niniejszego użytkownika |
» 2012-11-28 18:30:20 bawię się z tym i niby mi zadziałało, prosiłbym tylko o wyjaśnienie czemu tak działa a wcześniej nie działało: stara funkcja która nie działała: void LosujFoto( Foto foto[], int pomoc, int losuj ) { foto[ pomoc ].live = true; srand( time( 0 ) ); losuj =( rand() % 4 ) + 1; printf( "%d", losuj ); foto[ pomoc ].nazwa << "znaki/" << losuj << ".png"; fotoImage[ pomoc ] = al_load_bitmap( foto[ pomoc ].nazwa.str().c_str() ); }
funkcja która działa void LosujFoto()
{ std::ostringstream nazwa; losuj =( rand() % 4 ) + 1; printf( "%d", losuj ); nazwa << "znaki/" << losuj << ".png"; fotoImage[ losuj ] = al_load_bitmap( nazwa.str().c_str() ); }
Dodam, iż obie losowały, lecz ta druga działa poprawie, nie wiem czemu. |
|
« 1 » 2 |