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

Myszka

[lekcja] Rozdział 12. Obsługa myszki.
Przeglądając mój tutorial zastanawiałem się czego w nim jeszcze brakuje ;p i nagle mnie olśniło, przecież jeszcze nie ma nic o myszce. A to przecież dość ważna sprawa, posłuży nam do zbudowania jakiegoś menu, czy gry strategicznej. Czy wyobrażacie sobie grę RTS bez myszki?! No chyba nie bardzo... więc czym prędzej nauczmy się ją obsługiwać... ;p

Ogólnie rzecz biorąc obsługa myszki w allegro jest bardzo prosta, na razie skupimy się więc na zwykłym wyświetleniu myszki. Wyjaśnienia wszystkich procedur znajdziecie na końcu tej lekcji.

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

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
   
    install_mouse();
   
    //enable_hardware_cursor();
    //select_mouse_cursor(MOUSE_CURSOR_BUSY);
   
    show_mouse( screen );
    unscare_mouse();
   
    clear_to_color( screen, makecol( 128, 128, 128 ) );
    readkey();
   
    allegro_exit();
    return 0;
}
END_OF_MAIN();

Powyższy program nie robi nic prócz wyświetlenia kursora na ekranie. Wyświetla standardowy kursor (strzałkę), jeśli chcemy użyć któregoś z niestandardowych kursorów odblokowujemy funkcję: enable_hardware_cursor(); i ustalamy jakiego kursora chcemy używać: select_mouse_cursor(MOUSE_CURSOR_BUSY); Do wyboru mamy:
  • MOUSE_CURSOR_ALLEGRO - czyli ten podstawowy.
  • MOUSE_CURSOR_ARROW - strzałka, windowsowa.
  • MOUSE_CURSOR_BUSY - klepsydra.
  • MOUSE_CURSOR_QUESTION - strzałka wraz ze znakiem zapytania.
  • MOUSE_CURSOR_EDIT - znaczek edycji znany z edytorów tekstowych.

Położenie myszki, i jej klawisze.

Jednak samo wyświetlenie myszki nic nam nie da, musimy znać jej położenie i kody aktualnie wciskanych klawiszy, aby móc reagować na zaistniałą sytuację. W allegro pozycja i kod klawisza myszki przechowywane są w zmiennych: mouse_x, mouse_y, mouse_b myślę, że nie trzeba wyjaśniać które jest które? ;p ... Napiszmy więc funkcję, która będzie odczytywać pozycję i kod klawisza myszki:

C/C++
int mx = 0, my = 0, mb = 0;
void myszka()
{
    if( mx != mouse_x || my != mouse_y || mb != mouse_b )
    {
        mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
    }
};

Nasza funkcja nie robi nic nadzwyczajnego po prostu, zamieniamy zmienne na trochę krótsze.
A cały kod programu przedstawia się następująco:

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

int mx = 0, my = 0, mb = 0;
void myszka()
{
    if( mx != mouse_x || my != mouse_y || mb != mouse_b )
    {
        mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
    }
};

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    install_mouse();
    show_mouse( screen );
    unscare_mouse();
    BITMAP * bufor = NULL;
    bufor = create_bitmap( 800, 600 );
   
    while( !key[ KEY_ESC ] )
    {
        clear_to_color( bufor, makecol( 100, 100, 100 ) );
        myszka();
       
        textprintf_ex( bufor, font, 20, 20, makecol( 200, 200, 200 ), - 1, "Myszka x = %d, y = %d, klawisz = %d !", mx, my, mb );
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
        clear_keybuf();
    }
   
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();

Dzięki powyższemu programowi możemy łatwo sprawdzić jaki kod odpowiada danemu klawiszowi myszki. Zwróć też uwagę na to co stanie się jeśli naciśniesz oba klawisze, a jeśli posiadasz to nawet trzy?

Własny kursor myszki.

No tak, obsługa myszki nie stanowi dla nas żadnego problemu. Ale co zrobić jeśli standardowe kursory nie bardzo się nam podobają?? No cóż, odpowiedź jest prosta, narysować własny i z niego skorzystać! ;p

Po małej przeróbce kod wyglądał będzie tak:

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

BITMAP * kursor;

void laduj_kursor()
{
    kursor = load_bitmap( "kursor.bmp", NULL );
    if( !kursor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge zaladowac grafiki ( kursor )" );
        allegro_exit();
    }
};

int mx = 0, my = 0, mb = 0;
void myszka()
{
    if( mx != mouse_x || my != mouse_y || mb != mouse_b )
    {
        mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
    }
};

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
   
    BITMAP * bufor = NULL;
    bufor = create_bitmap( 800, 600 );
   
    laduj_kursor();
    install_mouse();
    show_mouse( screen );
    set_mouse_sprite( kursor );
    unscare_mouse();
   
    while( !key[ KEY_ESC ] )
    {
        clear_to_color( bufor, makecol( 100, 100, 100 ) );
        myszka();
       
        textprintf_ex( bufor, font, 20, 20, makecol( 200, 200, 200 ), - 1, "Myszka x = %d, y = %d, klawisz = %d !", mx, my, mb );
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
        clear_keybuf();
    }
   
    destroy_bitmap( bufor );
    destroy_bitmap( kursor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();

Ten program nie różni się prawie niczym od poprzedniego, jedyną różnicą jest nowa funkcja, która ładuje bitmapę naszego kursora. Myślę, że nie ma czego wyjaśniać, gdyż jest to zwykłe ładowanie bitmapy do pamięci.

A teraz omówienie najważniejszych funkcji:

install_mouse();

Jak zwykle w allegro, zanim z czegoś skorzystamy, musimy to zainstalować. Jeżeli wszystko będzie dobrze, funkcja zwróci nam ilość przycisków myszki. Jeżeli nie to zwróci -1;

show_mouse(screen);

Dzięki tej funkcji możemy wybrać bitmapę na której chcemy wyświetlać nasz kursor myszki. Możemy więc wyświetlać myszkę niekoniecznie na ekranie, a na przykład na buforze, jednak odradzam tego typu metody.

set_mouse_sprite(kursor);

To właśnie dzięki tej funkcji możemy zamienić standardową bitmapę kursora na naszą ;p

set_mouse_sprite_focus(10,10);

Funkcja która ustawia pixel prowadzony przez myszkę. Standardowo jest to piksel (0,0), czyli lewy górny róg naszej bitmapy. Jeśli jednak chcielibyśmy, aby punkt kliknięcia wypadał na środku naszej bitmapy nic nie stoi na przeszkodzie, aby go przesunąć. Nie wiem czy zrozumieliście o co mi chodzi? Najlepiej popróbować samemu... ;p

unscare_mouse();

Tą funkcją zezwalamy na rysowanie myszki na bitmapie.

scare_mouse();

Efekt przeciwny, "chowa" kursor...

set_mouse_speed(1,1);

Funkcja służy do ustawiania czułości myszki. Pierwszy parametr to prędkość wzdłuż osi X, a drugi wzdłuż osi Y.

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
Dźwięk Dodatek: biblioteka AllegroPNG