Przemok123 Temat założony przez niniejszego użytkownika |
[Allegro] Poruszanie postacią, Animacja = miganie » 2011-10-03 00:09:31 Witam Mam taki problem chciałbym aby moja postać (ludek) się poruszała w prawo i lewo z animacją, lecz gdy włączam program postać stoi i mruga, a gdy ruszę w lewo to przestaje i wykonuje się animacja, lecz gdy ruszę w prawo animacja nie wykonuję się w pełni, więc chciałbym aby znikło mruganie i żeby w lewo też animacja się wykonywała w pełni. uruchamiając oto kod: #include <allegro.h> volatile long speed = 0; void increment_speed() { speed++; } END_OF_FUNCTION( increment_speed ); LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed ); int main() { allegro_init(); install_keyboard(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 80 ) ); BITMAP * tlo = NULL; BITMAP * bufor = NULL; BITMAP * ludek0 = NULL; BITMAP * ludek1 = NULL; BITMAP * ludek2 = NULL; BITMAP * ludek3 = NULL; bufor = create_bitmap( 800, 600 ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę utworzyć bufora !" ); allegro_exit(); return 0; } tlo = load_bmp( "tlo.bmp", default_palette ); if( !tlo ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka tlo !" ); allegro_exit(); return 0; } ludek0 = load_bmp( "ludek.bmp", default_palette ); ludek1 = load_bmp( "ludek1.bmp", default_palette ); ludek2 = load_bmp( "ludek2.bmp", default_palette ); ludek3 = load_bmp( "ludek3.bmp", default_palette ); int ludek_x = 380, ludek_y = 380; int frame = 0; while( !key[ KEY_ESC ] ) { while( speed > 0 ) { if( key[ KEY_LEFT ] ) ludek_x--; if( key[ KEY_RIGHT ] ) ludek_x++; speed--; frame++; if( frame > 80 ) frame = 0; } clear_to_color( bufor, makecol( 150, 150, 150 ) ); blit( tlo, bufor, 0, 0, 0, 0, tlo->w, tlo->h ); if( frame < 20 ) { draw_sprite( bufor, ludek0, ludek_x, ludek_y ); } else if(( frame >= 20 && frame < 40 ) ) { draw_sprite( bufor, ludek1, ludek_x, ludek_y ); } else if(( frame >= 40 && frame < 60 ) ) { draw_sprite( bufor, ludek2, ludek_x, ludek_y ); } else if(( frame >= 60 && frame < 80 ) ) { draw_sprite( bufor, ludek3, ludek_x, ludek_y ); } if(( !key[ KEY_RIGHT ] ) &&( !key[ KEY_LEFT ] ) ) { draw_sprite( bufor, ludek1, ludek_x, ludek_y ); } if(( !key[ KEY_RIGHT ] ) &&( !key[ KEY_LEFT ] ) ) { draw_sprite( bufor, ludek2, ludek_x, ludek_y ); } if(( !key[ KEY_RIGHT ] ) &&( !key[ KEY_LEFT ] ) ) { draw_sprite( bufor, ludek1, ludek_x, ludek_y ); } blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); } remove_int( increment_speed ); destroy_bitmap( ludek0 ); destroy_bitmap( ludek1 ); destroy_bitmap( ludek2 ); destroy_bitmap( ludek3 ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
proszę o pomoc i z góry dziękuje EDIT: Zedytowałem trochę program i teraz nie mruga tak jak wtedy, ale gdy poruszam sie np w prawo, to gdy wyświetli wszystkie obrazki (czyli wykona animacje) to mrugnie raz. |
|
Gabes |
» 2011-10-03 01:05:45 frame < 80 ) na frame <= 80 ) aby nie mrugał. |
|
Przemok123 Temat założony przez niniejszego użytkownika |
» 2011-10-03 12:43:05 hmm dzięki, działa to :), ale i tak skorzystałem z poradnika easycodera i robiłem to w inny sposób (zresztą zaraz będzie widać w jaki [ wyczytywanie z jednej bitmapy]). Nie wiem teraz czy mam zakładać kolejny temat ,ale spróbuję w tym opisać mój "problem", a więc wszystko ładnie wyczytuje, animacja działa i wgl jest ok, ale chciałby ,aby mój ludek poruszał się tylko do ściany i nie dalej, a teraz on wychodzi za nią i nie widać go. Nie wiem jak to zrobić. oto ten kod: #include <allegro.h>
struct Cpostac { int x, y; short int kierunek, klatka; };
Cpostac ludek;
volatile long speed = 0; void increment_speed() { speed++; } END_OF_FUNCTION( increment_speed ); LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed );
int main() { allegro_init(); install_keyboard(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 80 ) ); BITMAP * bufor = NULL; BITMAP * tlo = NULL; BITMAP * ludekb = NULL; tlo = load_bmp( "tlo.bmp", default_palette ); if( !tlo ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka tlo !" ); allegro_exit(); return 0; } bufor = create_bitmap( 800, 600 ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę utworzyć bufora !" ); allegro_exit(); return 0; } ludekb = load_bmp( "animacja.bmp", default_palette ); int frame = 0; ludek.x = 380; ludek.y = 380; ludek.klatka = 0; ludek.kierunek = 0; while( !key[ KEY_ESC ] ) { while( speed > 0 ) { ludek.kierunek = 0; if( key[ KEY_LEFT ] ) { ludek.kierunek = 1; ludek.x -= 2; } if( key[ KEY_RIGHT ] ) { ludek.kierunek = 2; ludek.x += 2; } speed--; frame++; if( frame > 40 ) frame = 0; } clear_to_color( bufor, makecol( 150, 150, 150 ) ); blit( tlo, bufor, 0, 0, 0, 0, tlo->w, tlo->h ); if( frame < 20 ) { ludek.klatka = 0; } else if( frame >= 20 && frame < 40 ) { ludek.klatka = 1; } masked_blit( ludekb, bufor, ludek.kierunek * 176, ludek.klatka * 209, ludek.x, ludek.y, 176, 209 ); blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); } remove_int( increment_speed ); destroy_bitmap( ludekb ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
|
|
Gabes |
» 2011-10-03 13:06:37 if( key[ KEY_LEFT ] && ludek.x > 0 ) { ludek.kierunek = 1; ludek.x -= 2; }
dla każdego kierunku podobnie w prawo if( key[ KEY_RIGHT ] && ludek.x < 800 - ludekb->w ) (u ciebie szer ludka 176)
może lepiej wpisać 176 zamiast ludekb->w nie wiem ile masz klatek ludekb->w / liczba klatek |
|
Przemok123 Temat założony przez niniejszego użytkownika |
» 2011-10-04 13:20:04 hmm dzięki wielkie działa.. a może byś mi pomógł jeszcze ze skokiem ? |
|
DejaVu |
» 2011-10-04 15:17:21 Jeden temat = jeden problem. |
|
« 1 » |