No dobra... na ostatniej lekcji nauczyliśmy się poruszać wymarzoną paintową postacią po ekranie. Wszystko byłoby dobrze gdyby ekran nie migał. Dzisiaj pozbędziemy się tego problemu, z pomocą przyjdzie nam podwójne buforowanie...
Czym jest podwójne buforowanie -
Double Buffering? Otóż jest to jedna z technik wyświetlania obrazu, stosowana w wielu grach. Polega ona na tym, że zamiast rysować wszystko na ekranie (
screen), tworzymy drugi bufor i rysujemy wszystko na nim, a następnie kopiujemy bufor na ekran... I co nam to daje? Otóż operacja kopiowania jest znacznie szybsza od operacji rysowania i dlatego skopiowanie całego bufora zajmie dużo mniej czasu niż rysowanie wszystkiego na ekranie. Kopiowanie jest na tyle szybkie, że nie zobaczymy już migotającego obrazu, tylko płynną animację. Czasami stosuje się
potrójne buforowanie - triple buffering, ale nam raczej to nie będzie potrzebne (tak tylko chciałem się pochwalić, że wiem że takie coś istnieje ;P ...).
Musicie jednak wiedzieć, że zastosowanie tego w Allegro nie jest takie proste... żartowałem!!! Chyba nigdzie nie robi się tego tak łatwo jak w Allegro! ;P ... Allegro nie dość, że udostępnia nam specjalną strukturę BITMAP to jeszcze oferuje procedury takie jak blit dzięki, którym od razu przerzucimy bufor na ekran!
Ale się nagadałem ;P Okej pora zastosować to w praktyce... Skorzystamy z ostatniej lekcji... i wzbogacimy ją tylko o kilka linijek.
#include <allegro.h>
int main()
{
allegro_init();
install_keyboard();
set_color_depth( 16 );
set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0 );
clear_to_color( screen, makecol( 128, 128, 128 ) );
Nasz bufor potrzebuje wskaźnika na strukturę BITMAP dlatego go tworzymy:
BITMAP * bufor = NULL;
BITMAP * ludek = NULL;
Tworzymy nasz bufor:
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;
}
Ładujemy ludka:
ludek = load_bmp( "ludek.bmp", default_palette );
if( !ludek )
{
set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
allegro_message( "nie mogę załadować obrazka Ludek !" );
allegro_exit();
return 0;
}
int ludek_x = 100, ludek_y = 100;
Teraz nasza pętla nieskończona, w ktorej sterujemy ludkiem...
while( !key[ KEY_ESC ] )
{
if( key[ KEY_LEFT ] ) ludek_x--;
if( key[ KEY_RIGHT ] ) ludek_x++;
if( key[ KEY_UP ] ) ludek_y--;
if( key[ KEY_DOWN ] ) ludek_y++;
Za każdym obiegiem pętli czyścimy nasz bufor:
clear_to_color( bufor, makecol( 150, 150, 150 ) );
Rysujemy naszego ludzika, ale nie na ekranie tylko na buforze!
masked_blit( ludek, bufor, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h );
Kopiujemy bufor na ekran:
blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
}
Po wyjściu z pętli czyścimy po swoim programie usuwając nasze BITMAPY.
destroy_bitmap( ludek );
destroy_bitmap( bufor );
allegro_exit();
return 0;
}
END_OF_MAIN();
I to by było na tyle jeśli chodzi o podwójne buforowanie. Mam nadzieję że lekcja była zrozumiała. Na następny raz zajmiemy się timerami, dzięki którym ustawimy odpowiednie tempo naszej gry.
Kody źródłowe programów
Zadania do tej i innych lekcji znajdziesz
na naszym repozytorium.
Prawa autorskie
Serwis otrzymał zgodę od autora na publikację niniejszego materiału.