Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Tutorial by Easykoder ®
www.easykoder.vot.pl
Biblioteki C++

Klawiatura

[lekcja] Rozdział 7. Obsługa klawiszy.
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:

C/C++
#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 ) );
   
    //char klawisz;
    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

C/C++
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.:

C/C++
// literki od A do Z
KEY_A...KEY_Z,

// cyferki od 1 do 9
KEY_0...KEY_9,

// cyferki od 1 do 9 na klawiaturze numerycznej
KEY_0_PAD...KEY_9_PAD,

// klawisze od F1 do F12
KEY_F1...KEY_F12,

// ESCape, ENTER i SPACJA
KEY_ESC, KEY_ENTER, KEY_SPACE,

// i chba najlepsze: strzałki ;]
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 :]

C/C++
#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.

C/C++
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++;
   
    //clear_to_color(screen, makecol(10,10,10));
    //rest(1);
    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.
Poprzedni dokument Następny dokument
Pliki graficzne Podwójne buforowanie