thamiar Temat założony przez niniejszego użytkownika |
[Allegro C++] Grafika w tle, wyświetlanie grafiki na grafice. » 2011-04-09 20:43:43 Witam!
Niedawno zacząłem zabawę w C++ i gdy tylko usłyszałem o czymś takim jak biblioteki graficzne, odrazu zabrałem się za poszukiwania ;)
W końcu natrafiłem na allegro wraz z poradnikiem http://cpp0x.pl/kursy/Kurs-Allegro-C++/Bitmapy/66 na tej stronce i muszę powiedzieć, że jestem pod wrażeniem możliwości jakie zapewnia owa biblioteka ;)
Do rzeczy: Natrafiłem na następujący problem! Otóż chciałbym wyświetlić grafikę na graficę (Jakkolwiek to brzmi.)
Jako najprostrzy przykład: Grafika tła:Trawa, a po niej ma poruszać się ludzik.
Udało mi się to zrobić na chłopski rozum...tj. za każdym razem najpierw wyświetlana jest mapa, potem ludzik.
Niestety, z tego powodu ekran co jakiś czas miga na szaro...
Po drugie, jeśli chcialbym wyświetlić jakieś inne elementy tła musiałbym je za każdym razem wyświetlać... a chyba nie o to chodzi?
Dało by się to zrobić porządniej? tak aby bufor nie usuwał tła or sth?
int ludek_x = 100, ludek_y = 100; int frame = 0;
while( !key[ KEY_ESC ] ) { draw_sprite( bufor, ludek0, ludek_x, ludek_y ); while( speed > 0 ) { if( key[ KEY_LEFT ] ) { ludek_x--; clear_to_color( bufor, makecol( 150, 150, 150 ) ); if( frame < 10 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekl0, ludek_x, ludek_y ); } else if( frame >= 10 && frame < 20 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekl1, ludek_x, ludek_y ); } else if( frame >= 20 && frame < 30 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekl2, ludek_x, ludek_y ); } else if( frame >= 30 && frame < 40 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekl3, ludek_x, ludek_y ); } blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); } else { if( key[ KEY_RIGHT ] ) { ludek_x++; clear_to_color( bufor, makecol( 150, 150, 150 ) ); if( frame < 10 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekp0, ludek_x, ludek_y ); } else if( frame >= 10 && frame < 20 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekp1, ludek_x, ludek_y ); } else if( frame >= 20 && frame < 30 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekp2, ludek_x, ludek_y ); } else if( frame >= 30 && frame < 40 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekp3, ludek_x, ludek_y ); } blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); } else { if( key[ KEY_UP ] ) { ludek_y--; clear_to_color( bufor, makecol( 150, 150, 150 ) ); if( frame < 10 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekg0, ludek_x, ludek_y ); } else if( frame >= 10 && frame < 20 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekg1, ludek_x, ludek_y ); } else if( frame >= 20 && frame < 30 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekg2, ludek_x, ludek_y ); } else if( frame >= 30 && frame < 40 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludekg3, ludek_x, ludek_y ); } blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); } else { if( key[ KEY_DOWN ] ) { ludek_y++; clear_to_color( bufor, makecol( 150, 150, 150 ) ); if( frame < 10 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludek0, ludek_x, ludek_y ); } else if( frame >= 10 && frame < 20 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludek1, ludek_x, ludek_y ); } else if( frame >= 20 && frame < 30 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludek2, ludek_x, ludek_y ); } else if( frame >= 30 && frame < 40 ) { draw_sprite( bufor, trawa, 0, 0 ); draw_sprite( bufor, ludek3, ludek_x, ludek_y ); } blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); } } } } speed--; frame++; if( frame > 40 ) frame = 0; } |
ison |
» 2011-04-09 20:48:11 spójrz co się dzieje jeśli w pewnym momencie frame jest równe 40, nic wtedy nie wyświetlasz - dlatego co chwilę ekran mruga ;) zamień if( frame > 40 ) frame = 0;
na if( frame >= 40 ) frame = 0;
zreorganizuj kod bo masz bałagan, niepotrzebnie w każdym warunku wyświetlasz osobno trawę skoro możesz ją wyświetlać na początku pętli? tak powinien wyglądać Twój kod: while( !key[ KEY_ESC ] ) { while( speed > 0 ) { clear_to_color( bufor, makecol( 150, 150, 150 ); draw_sprite( bufor, trawa, 0, 0 ); if( key[ KEY_LEFT ] ) ludek_x--; if( key[ KEY_RIGHT ] ) ludek_x++; if( key[ KEY_UP ] ) ludek_y--; if( key[ KEY_DOWN ] ) ludek_y++; if( frame < 10 ) draw_sprite( bufor, ludek0, ludek_x, ludek_y ); else if( frame < 20 ) draw_sprite( bufor, ludek1, ludek_x, ludek_y ); else if( frame < 30 ) draw_sprite( bufor, ludek2, ludek_x, ludek_y ); else draw_sprite( bufor, ludek3, ludek_x, ludek_y ); blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); speed--; frame++; if( frame >= 40 ) frame = 0; } }
robi to samo, a prawda że wygląda czytelniej? :) //ups, nie zauważyłem że dla każdego kierunku jest osobna animacja, co nie zmienia faktu że warto by i tak zreorganizować kod, najlepiej będzie jak będziesz zapamiętywał kierunek w zmiennej, a sprity postaci trzymał w tablicy BITMAP * ludek[ 4 ][ 4 ];
pierwszy wymiar tablicy mówi o kierunku a drugi o aktualnej klatce animacji draw_sprite( bufor, ludek[ KIERUNEK ][ KLATKA ], ludek_x, ludek_y );
|
thamiar Temat założony przez niniejszego użytkownika |
» 2011-04-09 22:32:17 Jeszcze raz dziękuje za pomoc.
Coby nie zakładać nowego tematu, chcialbym zadać jeszcze jedno pytanie.
Otóż na trawce w polu 0,0 wstawiłem grafikę głazika o wymiarach 52x32 i chciałbym by ludzik nie mógł po nim przechodzić.
if( key[ KEY_LEFT ] ) {if(ludek_x<=52&&ludek_y<=30); else{ludek_x--;
if( frame < 10 ) { draw_sprite( bufor, ludekl0, ludek_x, ludek_y ); }
else if( frame >= 10 && frame < 20 ) { draw_sprite( bufor, ludekl1, ludek_x, ludek_y ); }
else if( frame >= 20 && frame < 30 ) { draw_sprite( bufor, ludekl2, ludek_x, ludek_y ); }
else if( frame >= 30 && frame < 40 ) { draw_sprite( bufor, ludekl3, ludek_x, ludek_y ); }
blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
}} |
Działa. Tyle, że musiałbym wpisywać warunek dla każdej przeszkody oddzielnie w ifie dla wszystkich czterech klawiszy.
Da się to zrobić inaczej? Myślałem nad zrobieniem czegośw stylu tablicy dwuwymiarowej wypełnionej 0(blokada przejścia) i 1 (przejśce). Ale nie wiem, czy coś takiego zdało by egzamin, szczególnie w allegro, gdzie mogę poruszać ludzikiem w bardzo dokładny sposób. |