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

Animacja-Allegro

Ostatnio zmodyfikowano 2010-11-11 19:25
Autor Wiadomość
Ernest171
Temat założony przez niniejszego użytkownika
Animacja-Allegro
» 2010-11-11 14:43:52
Mam problem zrobiłem że można chodzić ludkiem w lewo,prawo itd.
Ale gdy staje to znika.
Jak zrobić żeby nie znikał jak staje ?

KOD:
C/C++
#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_palette( default_palette );
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_FULLSCREEN, 640, 480, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 200 ) );
   
    BITMAP * bufor = NULL;
    BITMAP * ludek_prawo1 = NULL;
    BITMAP * ludek_prawo2 = NULL;
    BITMAP * ludek_prawo3 = NULL;
    BITMAP * ludek_lewo1 = NULL;
    BITMAP * ludek_lewo2 = NULL;
    BITMAP * ludek_lewo3 = NULL;
    BITMAP * ludek_gora1 = NULL;
    BITMAP * ludek_gora2 = NULL;
    BITMAP * ludek_gora3 = NULL;
    BITMAP * ludek_dol1 = NULL;
    BITMAP * ludek_dol2 = NULL;
    BITMAP * ludek_dol3 = NULL;
    BITMAP * postac = NULL;
   
   
   
   
   
   
   
   
    bufor = create_bitmap( 640, 480 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
   
    ludek_prawo1 = load_bmp( "ludek_prawo1.bmp", default_palette ); //prawo
    ludek_prawo2 = load_bmp( "ludek_prawo3.bmp", default_palette );
    ludek_prawo3 = load_bmp( "ludek_prawo3.bmp", default_palette );
   
    ludek_lewo1 = load_bmp( "ludek_lewo1.bmp", default_palette ); // lewo
    ludek_lewo2 = load_bmp( "ludek_lewo2.bmp", default_palette );
    ludek_lewo3 = load_bmp( "ludek_lewo3.bmp", default_palette );
   
    ludek_gora1 = load_bmp( "ludek_gora1.bmp", default_palette ); //góra
    ludek_gora2 = load_bmp( "ludek_gora2.bmp", default_palette );
    ludek_gora3 = load_bmp( "ludek_gora3.bmp", default_palette );
   
    ludek_dol1 = load_bmp( "ludek_dol1.bmp", default_palette ); //dół
    ludek_dol2 = load_bmp( "ludek_dol2.bmp", default_palette );
    ludek_dol3 = load_bmp( "ludek_dol3.bmp", default_palette );
   
   
   
   
    int ludek_x = 300, ludek_y = 300;
    int frame = 0;
   
   
   
    while( !key[ KEY_ESC ] )
    {
       
       
       
       
        while( speed > 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++;
           
           
           
            speed--;
           
            frame++;
            if( frame > 80 ) frame = 0;
           
            clear_to_color( bufor, makecol( 150, 150, 150 ) );
           
        }
        if( key[ KEY_LEFT ] )
       
        if( frame < 20 ) { draw_sprite( bufor, ludek_lewo1, ludek_x, ludek_y ); }
        else if( frame >= 20 && frame < 40 ) { draw_sprite( bufor, ludek_lewo1, ludek_x, ludek_y ); }
        else if( frame >= 40 && frame < 60 ) { draw_sprite( bufor, ludek_lewo2, ludek_x, ludek_y ); }
        else if( frame >= 60 && frame < 80 ) { draw_sprite( bufor, ludek_lewo3, ludek_x, ludek_y ); }
       
       
       
        if( key[ KEY_RIGHT ] )
       
        if( frame < 20 ) { draw_sprite( bufor, ludek_prawo1, ludek_x, ludek_y ); }
        else if( frame >= 20 && frame < 40 ) { draw_sprite( bufor, ludek_prawo1, ludek_x, ludek_y ); }
        else if( frame >= 40 && frame < 60 ) { draw_sprite( bufor, ludek_prawo2, ludek_x, ludek_y ); }
        else if( frame >= 60 && frame < 80 ) { draw_sprite( bufor, ludek_prawo3, ludek_x, ludek_y ); }
       
       
        if( key[ KEY_UP ] )
       
        if( frame < 20 ) { draw_sprite( bufor, ludek_gora1, ludek_x, ludek_y ); }
        else if( frame >= 20 && frame < 40 ) { draw_sprite( bufor, ludek_gora1, ludek_x, ludek_y ); }
        else if( frame >= 40 && frame < 60 ) { draw_sprite( bufor, ludek_gora2, ludek_x, ludek_y ); }
       
       
        if( key[ KEY_DOWN ] )
       
        if( frame < 20 ) { draw_sprite( bufor, ludek_dol1, ludek_x, ludek_y ); }
        else if( frame >= 20 && frame < 40 ) { draw_sprite( bufor, ludek_dol1, ludek_x, ludek_y ); }
        else if( frame >= 40 && frame < 60 ) { draw_sprite( bufor, ludek_dol2, ludek_x, ludek_y ); }
        else if( frame >= 60 && frame < 80 ) { draw_sprite( bufor, ludek_dol3, ludek_x, ludek_y ); }
       
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
       
       
    }
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
    remove_int( increment_speed );
    destroy_bitmap( ludek_prawo1 );
    destroy_bitmap( ludek_prawo2 );
    destroy_bitmap( ludek_prawo3 );
    destroy_bitmap( ludek_lewo1 );
    destroy_bitmap( ludek_lewo2 );
    destroy_bitmap( ludek_lewo3 );
    destroy_bitmap( ludek_gora1 );
    destroy_bitmap( ludek_gora2 );
    destroy_bitmap( ludek_gora3 );
    destroy_bitmap( ludek_dol1 );
    destroy_bitmap( ludek_dol2 );
    destroy_bitmap( ludek_dol3 );
   
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-23861
SeaMonster131
» 2010-11-11 14:48:11
np przed tymi if'ami dotyczącymi poruszania się wyświetl ludzika gdy się nie porusza. I będzie dobrze :)
Ponieważ wyświetlasz ludzika gdy naciśniesz lewo,góra,dół,prawo, a jak nic nie naciskasz to on po prostu sie nie wyświetla :)
P-23862
Ernest171
Temat założony przez niniejszego użytkownika
animacja
» 2010-11-11 14:59:18
Dałem tak i nie działa.


C/C++
while( !key[ KEY_ESC ] )
{
   
   
   
   
    while( speed > 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++;
       
       
       
        speed--;
       
        frame++;
        if( frame > 80 ) frame = 0;
       
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
       
    }
    if( key[ KEY_LEFT ] )
         blit( ludek_lewo1, screen, 0, 0, 100, 100, ludek_lewo1->w, ludek_lewo1->h );
   
    readkey();
   
   
    if( frame < 20 ) { draw_sprite( bufor, ludek_lewo1, ludek_x, ludek_y ); }
    else if( frame >= 20 && frame < 40 ) { draw_sprite( bufor, ludek_lewo1, ludek_x, ludek_y ); }
    else if( frame >= 40 && frame < 60 ) { draw_sprite( bufor, ludek_lewo2, ludek_x, ludek_y ); }
    else if( frame >= 60 && frame < 80 ) { draw_sprite( bufor, ludek_lewo3, ludek_x, ludek_y ); }
   
   
   
    if( key[ KEY_RIGHT ] )
         blit( ludek_prawo1, screen, 0, 0, 100, 100, ludek_prawo1->w, ludek_prawo1->h );
   
    readkey();
   
   
    if( frame < 20 ) { draw_sprite( bufor, ludek_prawo1, ludek_x, ludek_y ); }
    else if( frame >= 20 && frame < 40 ) { draw_sprite( bufor, ludek_prawo1, ludek_x, ludek_y ); }
    else if( frame >= 40 && frame < 60 ) { draw_sprite( bufor, ludek_prawo2, ludek_x, ludek_y ); }
    else if( frame >= 60 && frame < 80 ) { draw_sprite( bufor, ludek_prawo3, ludek_x, ludek_y ); }
   
   
    if( key[ KEY_UP ] )
   
   
         blit( ludek_gora1, screen, 0, 0, 100, 100, ludek_gora1->w, ludek_gora1->h );
   
    readkey();
   
    if( frame < 20 ) { draw_sprite( bufor, ludek_gora1, ludek_x, ludek_y ); }
    else if( frame >= 20 && frame < 40 ) { draw_sprite( bufor, ludek_gora1, ludek_x, ludek_y ); }
    else if( frame >= 40 && frame < 60 ) { draw_sprite( bufor, ludek_gora2, ludek_x, ludek_y ); }
   
   
    if( key[ KEY_DOWN ] )
   
         blit( ludek_dol1, screen, 0, 0, 100, 100, ludek_dol1->w, ludek_dol1->h );
   
    readkey();
   
   
    if( frame < 20 ) { draw_sprite( bufor, ludek_dol1, ludek_x, ludek_y ); }
    else if( frame >= 20 && frame < 40 ) { draw_sprite( bufor, ludek_dol1, ludek_x, ludek_y ); }
    else if( frame >= 40 && frame < 60 ) { draw_sprite( bufor, ludek_dol2, ludek_x, ludek_y ); }
    else if( frame >= 60 && frame < 80 ) { draw_sprite( bufor, ludek_dol3, ludek_x, ludek_y ); }
   
    blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
   
   
}
P-23863
DejaVu
» 2010-11-11 15:25:37
Rysuj ludzika zawsze, a nie warunkowo. Warunkowo decyduj jaki obrazek ma się rysować, np.
C/C++
int klatka = 0;
if( klawisz[ LEWO ] )
     klatka = 1;

if( klawisz[ PRAWO ] )
     klatka = 2;

switch( klatka )
{
case 1:
    //rysuj ruch w lewo
    break;
case 2:
    //rysuj ruch w prawo
    break;
   
default:
    //rysuj klatkę domyślną
    break;
}
P-23865
dmx81
» 2010-11-11 16:51:14
lub bez switch'a jesli chcesz mniej pisania :P

C/C++
if( klawisz[ LEWO ] )
     klatka = 1;

else if( klawisz[ PRAWO ] )
     klatka = 2;

else klatka = 0;

rysuj( klatka ); /* blit lub masked_blit przerobiony na pobieranie nr klatki i mnożysz odpowiedni parametr w w/w funkcji z klatka (szerokosc razy klatka= poczatek rysuwanej bitmapy :))*/

oczywiscie jesli dopiszesz sobie ruch w gore lub w dol i bedziesz chcial zmienic jeszcze animacje, musisz pozniej sobie dopisac nowe warunki else if, a ostatni jako domyslny
P-23870
Ernest171
Temat założony przez niniejszego użytkownika
animacja
» 2010-11-11 19:25:40
Dzięki,
Temat do usunięcia.
P-23882
« 1 »
  Strona 1 z 1