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

[Allegro] Poruszanie postacią, Animacja = miganie

Ostatnio zmodyfikowano 2011-10-04 15:17
Autor Wiadomość
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:

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_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.
P-41631
Gabes
» 2011-10-03 01:05:45
frame < 80 ) na frame <= 80 )
aby nie mrugał.
P-41636
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:

C/C++
#include <allegro.h>

struct Cpostac
{
   
    int x, y;
    short int kierunek, klatka;
};
// Zmienna naszej struktury
Cpostac ludek;

// Inicjowanie timera
volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

// Funkcja Główna
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;
    // Wgrywanie tla
    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;
    }
    // Tworzenie bufora
    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;
    }
    // Ładowanie grafiki
    ludekb = load_bmp( "animacja.bmp", default_palette );
   
    // Ustalanie początkowej pozycji ludzika
    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; }
            //if( key[KEY_UP]) { ludek.kierunek = 1; ludek.y-=2; }
            //if( key[KEY_DOWN]) { ludek.kierunek = 3; ludek.y+=2; }
            speed--;
           
            frame++;
            if( frame > 40 ) frame = 0;
           
        }
        // Czyszczenie bufora
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
        blit( tlo, bufor, 0, 0, 0, 0, tlo->w, tlo->h );
        // Sterowanie animacją
        if( frame < 20 ) { ludek.klatka = 0; }
        else if( frame >= 20 && frame < 40 ) { ludek.klatka = 1; }
       
        //Wyświetlanie ludzika
        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 );
    }
    // Usuwanie wszystkiego z pamięci.
    remove_int( increment_speed );
    destroy_bitmap( ludekb );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-41639
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
P-41640
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 ?
P-41686
DejaVu
» 2011-10-04 15:17:21
Jeden temat = jeden problem.
P-41690
« 1 »
  Strona 1 z 1