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

Allegro, animacja wraz z buforami.

Ostatnio zmodyfikowano 2012-05-26 21:23
Autor Wiadomość
Forczek
Temat założony przez niniejszego użytkownika
Allegro, animacja wraz z buforami.
» 2012-05-26 18:30:14
Siemka, na początek kodzik:

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, 500, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 200 ) );
   
   
    BITMAP * postac = NULL;
    BITMAP * postac0 = NULL;
    BITMAP * postac1 = NULL;
    BITMAP * postac2 = NULL;
    BITMAP * postac3 = NULL;
    BITMAP * postac4 = NULL;
    BITMAP * postac5 = NULL;
   
    BITMAP * ludek = NULL;
    BITMAP * ludek0 = NULL;
    BITMAP * ludek1 = NULL;
    BITMAP * ludek2 = NULL;
    BITMAP * ludek3 = NULL;
    BITMAP * ludek4 = NULL;
    BITMAP * ludek5 = NULL;
   
    BITMAP * buffor = NULL;
    BITMAP * tlo = NULL;
   
    postac0 = load_bmp( "postac0.bmp", default_palette );
    postac1 = load_bmp( "postac1.bmp", default_palette );
    postac2 = load_bmp( "postac2.bmp", default_palette );
    postac3 = load_bmp( "postac3.bmp", default_palette );
    postac4 = load_bmp( "postac4.bmp", default_palette );
    postac5 = load_bmp( "postac5.bmp", default_palette );
   
    ludek0 = load_bmp( "ludek0.bmp", default_palette );
    ludek1 = load_bmp( "ludek1.bmp", default_palette );
    ludek2 = load_bmp( "ludek2.bmp", default_palette );
    ludek3 = load_bmp( "ludek3.bmp", default_palette );
    ludek4 = load_bmp( "ludek4.bmp", default_palette );
    ludek5 = load_bmp( "ludek5.bmp", default_palette );
   
    tlo = load_bmp( "tlo.bmp", default_palette );
   
    int postac_x = 500, postac_y = 200;
    int ludek_x = 100, ludek_y = 200;
    int frame = 0;
   
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
            frame++;
            if( frame > 150 ) frame = 0;
           
            if( key[ KEY_A ] )
            {
                if( frame < 50 ) { draw_sprite( buffor, ludek, ludek_x, ludek_y ); }
                else if( frame >= 50 && frame < 100 ) { draw_sprite( buffor, ludek4, ludek_x, ludek_y ); }
                else if( frame >= 100 && frame < 150 ) { draw_sprite( buffor, ludek5, ludek_x, ludek_y ); }
                else if( frame >= 150 && frame < 200 ) { draw_sprite( buffor, ludek4, ludek_x, ludek_y ); }
                ludek_x--;
            }
           
            if( key[ KEY_D ] )
            {
                ludek_x++;
                if( frame < 50 ) { draw_sprite( buffor, ludek, ludek_x, ludek_y ); }
                else if( frame >= 50 && frame < 100 ) { draw_sprite( buffor, ludek4, ludek_x, ludek_y ); }
                else if( frame >= 100 && frame < 150 ) { draw_sprite( buffor, ludek5, ludek_x, ludek_y ); }
                else if( frame >= 150 && frame < 200 ) { draw_sprite( buffor, ludek4, ludek_x, ludek_y ); }
            }
            if( key[ KEY_W ] )
            {
                if( frame < 50 ) { draw_sprite( buffor, ludek, ludek_x, ludek_y ); }
                else if( frame >= 50 && frame < 100 ) { draw_sprite( buffor, ludek4, ludek_x, ludek_y ); }
                else if( frame >= 100 && frame < 150 ) { draw_sprite( buffor, ludek5, ludek_x, ludek_y ); }
                else if( frame >= 150 && frame < 200 ) { draw_sprite( buffor, ludek4, ludek_x, ludek_y ); }
                ludek_y--;
            }
           
            if( key[ KEY_S ] )
            {
                if( frame < 50 ) { draw_sprite( buffor, ludek, ludek_x, ludek_y ); }
                else if( frame >= 50 && frame < 100 ) { draw_sprite( buffor, ludek4, ludek_x, ludek_y ); }
                else if( frame >= 100 && frame < 150 ) { draw_sprite( buffor, ludek5, ludek_x, ludek_y ); }
                else if( frame >= 150 && frame < 200 ) { draw_sprite( buffor, ludek4, ludek_x, ludek_y ); }
                ludek_y++;
            }
           
            if( key[ KEY_LEFT ] )
            {
                if( frame < 50 ) { draw_sprite( buffor, postac, postac_x, postac_y ); }
                else if( frame >= 50 && frame < 100 ) { draw_sprite( buffor, postac4, postac_x, ludek_y ); }
                else if( frame >= 100 && frame < 150 ) { draw_sprite( buffor, postac5, postac_x, ludek_y ); }
                else if( frame >= 150 && frame < 200 ) { draw_sprite( buffor, postac4, postac_x, ludek_y ); }
                postac_x--;
            }
           
            if( key[ KEY_RIGHT ] )
            {
                if( frame < 50 ) { draw_sprite( buffor, postac, postac_x, postac_y ); }
                else if( frame >= 50 && frame < 100 ) { draw_sprite( buffor, postac, postac_x, postac_y ); }
                else if( frame >= 100 && frame < 150 ) { draw_sprite( buffor, postac, postac_x, postac_y ); }
                else if( frame >= 150 && frame < 200 ) { draw_sprite( buffor, postac, postac_x, postac_y ); }
                postac_x++;
            }
           
            if( key[ KEY_UP ] )
            {
                if( frame < 50 ) { draw_sprite( buffor, postac, postac_x, postac_y ); }
                else if( frame >= 50 && frame < 100 ) { draw_sprite( buffor, postac4, postac_x, postac_y ); }
                else if( frame >= 100 && frame < 150 ) { draw_sprite( buffor, postac5, postac_x, postac_y ); }
                else if( frame >= 150 && frame < 200 ) { draw_sprite( buffor, postac4, postac_x, postac_y ); }
                postac_y--;
            }
           
            if( key[ KEY_DOWN ] )
            {
                if( frame < 50 ) { draw_sprite( buffor, postac, postac_x, postac_y ); }
                else if( frame >= 50 && frame < 100 ) { draw_sprite( buffor, postac4, postac_x, postac_y ); }
                else if( frame >= 100 && frame < 150 ) { draw_sprite( buffor, postac5, postac_x, postac_y ); }
                else if( frame >= 150 && frame < 200 ) { draw_sprite( buffor, postac4, postac_x, postac_y ); }
                postac_y++;
            }
           
            speed--;
           
        }
        clear_to_color( buffor, makecol( 150, 150, 150 ) );
        blit( tlo, screen, 0, 0, 0, 0, 800, 500 );
        masked_blit( ludek, buffor, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h );
        masked_blit( postac, buffor, 0, 0, postac_x, postac_y, postac->w, postac->h );
        blit( buffor, screen, 0, 0, 0, 0, 800, 500 );
       
    }
    remove_int( increment_speed );
    destroy_bitmap( ludek );
    destroy_bitmap( ludek0 );
    destroy_bitmap( ludek1 );
    destroy_bitmap( ludek2 );
    destroy_bitmap( ludek3 );
    destroy_bitmap( ludek4 );
    destroy_bitmap( ludek5 );
    destroy_bitmap( postac );
    destroy_bitmap( postac0 );
    destroy_bitmap( postac1 );
    destroy_bitmap( postac2 );
    destroy_bitmap( postac3 );
    destroy_bitmap( postac4 );
    destroy_bitmap( postac5 );
    destroy_bitmap( tlo );
    destroy_bitmap( buffor );
    remove_int( increment_speed );
    readkey();
    allegro_exit();
    return 0;
   
}
END_OF_MAIN();

Problem w tym, że tło mi miga chociaż mam bufora. No i animacja się nie animuje. Co jest źle? To moja pierwsza gra dopiero się uczę, więc proszę jak najprościej :D
P-57321
m4tx
» 2012-05-26 18:43:40
» Kurs STC » Kolorowanie składniKolorowanie składni języka C++ lekcja

C/C++
BITMAP * postac = NULL;
BITMAP * postac0 = NULL;
BITMAP * postac1 = NULL;
BITMAP * postac2 = NULL;
BITMAP * postac3 = NULL;
BITMAP * postac4 = NULL;
BITMAP * postac5 = NULL;
Nie znasz podstaw C++. Prościej byłoby tutaj zrobić tablicę. Odsyłam Cię do kursu C++: » KursyKurs C++ kurs
P-57322
Forczek
Temat założony przez niniejszego użytkownika
» 2012-05-26 18:45:22
Uczyłem się, znam podstawy, umiem robić tablice. Uczę się robić gry. Nie umiem robić gier, więc mam kłopoty... Nie wiedziałem że lepiej użyć tablic... Nie działa, może robię źle. Napisz jak dokładnie ma być, albo sposób z BITMAP * coś = NULL;
P-57323
m4tx
» 2012-05-26 18:51:17
Lepiej-nie lepiej, ale prościej i krócej :P

Animacja się nie animuje zapewne dlatego, bo nie używasz takiego cuda, które się zwie time per frame. Za każdym obiegiem pętli while zwiększasz frame o 1, i tutaj mamy 2 problemy:
- aplikacja może być na tyle szybka, że nie będzie w ogóle widać animacji, lub będzie wyglądać... dziwnie
- animacja nie będzie działała tak samo szybko na różnych komputerach, czy nawet różnej ilości uruchomionych programów.

Tak swoją drogą, lepszym rozwiązaniem trzymania klatek animacji od tego, jakiego ty chcesz użyć, czyli każda klatka w oddzielnym pliku, jest wszystkie klatki w jednym pliku, umieszczone obok siebie. Rysujesz wtedy tylko kawałek tekstury, w zależności od czasu działania animacji.
P-57324
SeaMonster131
» 2012-05-26 18:53:12
@up: Z tego co widze, to on ma tutaj timer, 200 FPS ma ustawione bodajże.

A nie widać animacji, ponieważ najpierw rysujesz konkretną klatkę tego ludka / postaci, a następnie już na końcu pętli na tych samych pozycjach rysujesz znowu ludka i postać.
P-57325
Forczek
Temat założony przez niniejszego użytkownika
» 2012-05-26 19:07:06
Dobra, to co mam zrobić, timera mam na 200.
P-57326
SeaMonster131
» 2012-05-26 19:10:20
Napisze Ci jeszcze raz:
A nie widać animacji, ponieważ najpierw rysujesz konkretną klatkę tego ludka / postaci, a następnie już na końcu pętli na tych samych pozycjach rysujesz znowu ludka i postać.
P-57327
Forczek
Temat założony przez niniejszego użytkownika
» 2012-05-26 19:11:57
Dobra, to co na co zmienić xD
P-57328
« 1 » 2
  Strona 1 z 2 Następna strona