Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Piotr Szawdyński
Biblioteki C++

Bezpośredni dostęp do klawiatury, myszy i joysticka

[lekcja] Rozdział 7. W niniejszym rozdziale opisano bezpośredni dostęp do obsługi klawiatury, myszy i joysticka przy pomocy biblioteki SFML 2.0.

Wprowadzenie

Jeżeli znasz z autopsji inne biblioteki graficzne, takie jak np. SDL czy Allegro to zapewne poprzedni rozdział pozostawił po sobie niedosyt w temacie obsługi klawiatury i myszy. Jeżeli tak jest to po przeczytaniu tego rozdziału powinieneś poczuć się usatysfakcjonowany możliwościami obsługi wspomnianych urządzeń przez bibliotekę SFML 2.0.

Bezpośredni dostęp do klawiatury

Biblioteka SFML 2.0 posiada klasę sf::Keyboard, w której znajduje się metoda statyczna isKeyPressed. Wspomniana metoda sprawdza, czy klawisz podany poprzez argument jest aktualnie wciśnięty. Jeżeli klawisz jest aktualnie wciśnięty to wówczas metoda statyczna isKeyPressed zwróci wartość true - w przeciwnym wypadku zostanie zwrócona wartość false. Przykładowe wywołanie omówionej metody statycznej może wyglądać następująco:
C/C++
if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
{
    //INFO: strzałka w prawo jest aktualnie wciśnięta
} //if

Bezpośredni dostęp do myszy

Kolejnym popularnym urządzeniem wejściowym do komunikacji użytkownika z komputerem jest myszka. Obsługa wspomnianego urządzenia jest analogiczna do obsługi klawiatury, a więc opiera się o metody statyczne, które zostały umieszczone w klasie sf::Mouse. Pracując z myszką, interesujące będą dla nas takie informacje jak aktualny stan wciśniętych przycisków myszki oraz aktualne położenie myszki. Aktualne położenie myszki można rozpatrywać pod wieloma aspektami, takimi jak:
  • położenie myszy względem pulpitu;
  • położenie myszy względem określonego okna;
  • położenie myszy na scenie.
W przypadku przycisków myszy sytuacja jest nieco prostsza, bowiem jedyne co nas interesuje to fakt, czy określony przycisk jest w danej chwili wciśnięty czy też nie.

Aktualny stan przycisków myszki

Sprawdzanie aktualnego stanu przycisków myszki sprowadza się do odpowiedniego wywołania metody statycznej isButtonPressed, która znajduje się we wcześniej już wspomnianej klasie sf::Mouse. Wspomniana metoda sprawdza, czy przycisk myszy podany poprzez argument jest aktualnie wciśnięty. Jeżeli przycisk myszy jest aktualnie wciśnięty to wówczas metoda statyczna isButtonPressed zwróci wartość true - w przeciwnym wypadku zostanie zwrócona wartość false. Przykładowe wywołanie omówionej metody statycznej może wyglądać następująco:
C/C++
if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
{
    //INFO: lewy przycisk myszy jest aktualnie wciśnięty
} //if

Położenie myszki względem pulpitu

Jeżeli interesuje Ciebie aktualne położenie myszki względem pulpitu to wystarczy wywołać metodę statyczną o nazwie getPosition, znajdującą się w klasie sf::Mouse. Ważne jest, aby opisana metoda została wywołana bez podawania jakichkolwiek argumentów. W wyniku wywołania metody statycznej getPosition, zwrócona zostanie aktualna pozycja myszy względem pulpitu. Przykład:
C/C++
sf::Vector2i pozycjaMyszyWzgledemPulpitu = sf::Mouse::getPosition();

Położenie myszki względem podanego okna SFML

Jeżeli interesuje Ciebie aktualne położenie myszki względem konkretnego okna, utworzonego przy pomocy biblioteki SFML to należy wywołać metodę statyczną o nazwie getPosition oraz dodatkowo za pomocą argumentu określić okno, względem którego współrzędne myszy mają zostać zwrócone. Przykładowo może być to:
C/C++
sf::Window oknoAplikacji( sf::VideoMode( 800, 600, 32 ), "Kurs SFML 2.0 - http://cpp0x.pl" );
//...
sf::Vector2i pozycjaMyszyWzgledemOkna = sf::Mouse::getPosition( oknoAplikacji );

Położenie myszki na scenie

Pobranie aktualnego położenia myszki na scenie sprowadza się do wywołania metody convertCoords, należącej do klasy sf::RenderWindow, natomiast jako argument podaje się położenie myszy względem okna, dla którego chcesz otrzymać położenie określonego punktu na scenie. Zagmatwane? Ten temat zostanie szerzej omówiony w jednym z dalszych rozdziałów, wraz z odpowiednim przykładem. W każdym razie kod zwracający aktualną pozycję myszy na scenie może wyglądać tak:
C/C++
sf::RenderWindow oknoAplikacji; //INFO: szczegóły związane z tą klasą zostaną omówione w kolejnym rozdziale
//...
sf::Vector2i pozycjaMyszyWzgledemOkna = sf::Mouse::getPosition( oknoAplikacji );
sf::Vector2f pozycjaMyszyNaScenie = oknoAplikacji.convertCoords( pozycjaMyszyWzgledemOkna );

Bezpośredni dostęp do joysticka

Interesującym elementem biblioteki SFML 2.0, obok którego trudno przejść obojętnie, jest możliwość łatwej obsługi joysticków. Tak samo jak w przypadku omówionych już urządzeń wejściowych, obsługa joysticka sprowadza się do wywoływania odpowiednich metod statycznych, które znajdują się w klasie sf::Joystick. Metody statyczne we wspomnianej klasie mają następujące deklaracje:
C/C++
namespace sf
{
    class Joystick
    {
    public:
        static bool isConnected( unsigned int joystick );
        static unsigned int getButtonCount( unsigned int joystick );
        static bool hasAxis( unsigned int joystick, Axis axis );
        static bool isButtonPressed( unsigned int joystick, unsigned int button );
        static float getAxisPosition( unsigned int joystick, Axis axis );
    }; //class Joystick
} //namespace sf

Aktualnie podłączone joysticki

Metoda isConnected służy do sprawdzenia czy joystick o podanym identyfikatorze jest podłączony do komputera. Biblioteka SFML 2.0 obsługuje do 8 joysticków, a więc joysticki mają identyfikatory od 0 do 7 włącznie. Przykład:
C/C++
if( sf::Joystick::isConnected( 0 ) )
{
    //INFO: joystick o identyfikatorze '0' jest podłączony
} //if

Liczba przycisków joysticka

Metoda getButtonCount zwraca liczbę przycisków, jakie obsługuje joystick o podanym identyfikatorze. Przykład:
C/C++
unsigned iLiczbaPrzyciskow = sf::Joystick::getButtonCount( 0 );
//INFO: iLiczbaPrzyciskow zawiera liczbę obsługiwanych przycisków przez joystick o identyfikatorze '0'

Aktualny stan przycisków joysticka

Za pomocą metody isButtonPressed możliwe jest sprawdzenie, czy określony przycisk danego joysticka jest aktualnie wciśnięty. Przyciski dla każdego joysticka są numerowane wartościami od 0 do 31 włącznie. Przykład:
C/C++
if( sf::Joystick::isButtonPressed( 0, 1 ) )
{
    //INFO: przycisk nr '1' na joysticku nr '0' jest wciśnięty - wykonaj jakąś akcję
} //if

Dostępne osie joysticka

Metoda hasAxis służy do sprawdzania czy joystick o podanym identyfikatorze posiada daną oś. Nazwy osi są zdefiniowane w klasie sf::Joystick i są następujące:
C/C++
namespace sf
{
    class Joystick
    {
    public:
        enum Axis
        {
            X, Y, Z, R, U, V, PovX, PovY
        }; //enum Axis
    }; //class Joystick
} //namespace sf
Poniższy przykład pokazuje jak należy korzystać z metody statycznej hasAxis:
C/C++
if( sf::Joystick::hasAxis( 0, sf::Joystick::X ) )
{
    //INFO: oś 'X' dla joysticka o identyfikatorze '0' istnieje
} //if

Aktualny stan osi joysticka

Za pomocą metody getAxisPosition możliwe jest pobranie aktualnego położenia określonej osi dla danego joysticka. Zwracana wartość jest typu float. Przykład:
C/C++
float x = sf::Joystick::getAxisPosition( 0, sf::Joystick::X );
float y = sf::Joystick::getAxisPosition( 0, sf::Joystick::Y );
//...
obiekt.przesun( x, y ); //INFO: przykładowe wywołanie

Podsumowanie

Obsługa bezpośredniego dostępu do urządzeń wejściowych, takich jak klawiatura, mysz oraz joystick jest bardzo prosta w bibliotece SFML 2.0. Pamiętaj, że bezpośredni dostęp do urządzeń jest idealnym rozwiązaniem do realizacji sterowania w grach dynamicznych, w których kluczową rolę odgrywa szybkość reakcji aplikacji na podejmowane działania przez użytkownika.
Poprzedni dokument Następny dokument
Obsługa zdarzeń - klawiatura, mysz i inne Okno renderujące grafikę