No no no... lecimy z tym materiałem, że aż miło ;) Tak więc, dzisiaj również nie marnujemy czasu, bo dzisiaj wprawimy nasze paintowe ludziki w ruch i nauczymy się obsługiwać klawiaturę :] Na początku prosty kodzik:
#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( 10, 10, 10 ) );
int klawisz = 0;
while( !key[ KEY_ESC ] )
{
klawisz = readkey();
clear_to_color( screen, makecol( 10, 10, 10 ) );
textprintf( screen, font, 20, 20, makecol( 255, 255, 128 ), "Klawisz to : %d", klawisz );
}
allegro_exit();
return 0;
}
END_OF_MAIN();
Powyższy kodzik ma za zadanie wyświetlać numer ostatnio naciśniętego klawisza... w sumie to do niczego nie służy... ale warto wiedzieć że coś takiego da się zrobić ;D
while( !key[ KEY_ESC ] )
{
klawisz = readkey();
clear_to_color( screen, makecol( 10, 10, 10 ) );
textprintf( screen, font, 20, 20, makecol( 255, 255, 128 ), "Klawisz to : %d", klawisz );
}
I tu pojawia się coś nowego, jest to pętla nieskończona, no oczywiście do czasu, aż nie naciśniemy
klawisza ESC. Gdyż działa ona dopóki klawisz ESC zostawiamy w spokoju ;) Z tej pętli będziemy korzystać bardzo często... właściwie to prawie zawsze :] We wnętrzu pętli odczytujemy numer ostatnio wciśniętego klawisza.
Jak zapewne zwróciliście uwagę sprawdzenie, który klawisz został wciśnięty jest w Allegro bardzo łatwe. Wystarczy bowiem jedna linijka:
if ( key[ klawisz ])
w miejsce klawisz możemy podstawić dowolny klawisz na klawiaturze, są to min.:
KEY_A...KEY_Z,
KEY_0...KEY_9,
KEY_0_PAD...KEY_9_PAD,
KEY_F1...KEY_F12,
KEY_ESC, KEY_ENTER, KEY_SPACE,
KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN,
Dobra... skoro już wiemy jak obsługiwać klawisze... i znamy ich kody... napiszmy program, który wprawi w ruch postać którą ostatnio wyświetlaliśmy na ekranie :] Potrzebny nam będzie jakiś plik graficzny... u mnie jest to ludek.bmp ten sam co ostatnio :]
#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 ) );
BITMAP * ludek = NULL;
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;
I tutaj właśnie znowu będzie nam potrzebna pętla nieskończona, będzie ona trwała aż do naciśnięcia klawisza ESC. Następnie sprawdzamy czy któraś ze strzałek: lewo, prawo, góra dół nie została wciśnięta, jeśli tak przesuwamy naszego ludka.
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++;
masked_blit( ludek, screen, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h );
}
destroy_bitmap( ludek );
allegro_exit();
return 0;
}
END_OF_MAIN();
Jeśli ludek przesuwa się z zawrotną prędkością, odblokuj funkcję rest wewnątrz naszej nieskończonej pętli.
rest(10);
Funkcja ta powoduje wstrzymanie programu na określona liczbę milisekund.
Rozwiązanie jednego problemu czasami stwarza kolejny
Jak zapewne zauważyliście nasz ludek się rozmazuje, można temu zapobiec zamalowując ekran po każdym ruchu. Jednak wtedy napotkamy kolejny problem.. ekran będzie migał.. aby temu zapobiec potrzebne będzie podwójne buforowanie... ale to już materiał na inną lekcję ;)
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.