Zarządzanie eventami

Czym są eventy?


Eventy, czyli po polsku zdarzenia to czynności, które mógł wykonać użytkownik w naszym programie, a my możemy je obsłużyć w odpowiedni sposób. Eventem może być np wciśnięcie klawisza.

W SFML klasa eventów nazywa się po prostu sf::Event i standardowo są one obsługiwane w pętli z użyciem pollEvent, czy też waitEvent. Przykładowe kod z użyciem eventów:

Ewentualnie można napisać to tak jak poniżej:

 

Event żądania zamknięcia


Jest to event, który się uaktywania w przypadku gdy użytkownik kliknie przycisk X (Zamknij) lub użyje skrótu zamknięcia programu np Alt + F4

 

Event zmiany rozmiaru okna


Ten event jest uaktywaniany gdy użytkownik w sposób manualny zmieni rozmiar okna za pomocą myszy. Dzięki tej informacji możesz np samodzielnie przeskalować textury itp. Event podaje nam rozmiary aktualnego okna:

 

Event sprawdzający czy okno jest aktywne


Czyli sprawdzenie czy okno jest „kliknięte”. Może to nam się przydać gdy chcemy aby podczas gdy okno jest niekatywne gra się spauzowała:

 

Wprowadzanie tekstu


W przypadku gdy chcemy aby użytkownik wprowadził jakiś tekst do programu (np. swój nick) to gdy będziemy się chcieli za to zabrać będzie mogło się okazać, że sprawdzenie jaka litera została wciśnięta może być niewygodne, bo trzeba by było wziąć pod uwagę wszystkie klawisze. N a szczęście istnieje prosta metoda przechwytywania tekstu:

 

Wciśnięcie i puszczenie klawiszy


SFML wyróżnia 2 typy użycia klawiszy: KeyPressed (klawisz wciśnięty) oraz KeyReleased (klawisz puszczono).  Standardowo zdarzenie KeyPressed jest generowane zgodnie z opóźnieniem OS dopóki ten klawisz jest wciśnięty, działa to na tej samej zasadzie co wypisywanie tej samej litery gdy trzymamy wciśnięty klawisz w notatniku. Możemy to wyłączyć używając window.setKeyRepeatEnabled(false), oczywiście KeyReleased nie jest nigdy powtarzany.

Możemy także używać kombinacji klawiszy:

 

Obsługa myszy


Jeżeli chcemy możemy sprawdzać zdarzenia dotyczące rolki (kółka) myszy:

Można także obsługiwać przyciski myszy, SFML obsługuje maksymalnie pięć przycisków: lewy, prawy, środkowy (kółko/rolka) i dwa dodatkowe. Możemy także sprawdzać czy przycisk jest wciśnięty czy puszczony (Event::MouseButtonPressed / Event::MouseBottonReleased).

W przypadku gdy mysz się poruszyła można sprawdzić jej nową (aktualną) pozycję względem okna:

Dosyć przydatną rzeczą może być też sprawdzenie czy mysz jest poza oknem:

 

Joystick


Jeżeli chciałbyś obsługiwać pada w grze to nie ma problemu. SFML wspiera przynajmniej większość kontrolerów. Zanim zaczniesz używać swojego musisz sprawdzić czy kontroler jest podłączony:

Te eventy się uaktywniają gdy pad zostanie podłączony dopiero podczas działania tej pętli. Istnieje jeszcze inny sposób na sprawdzenie tego, ale o tym w innym poradniku.

Tak jak w przypadku innych klawiszy, tak też i tutaj można sprawdzać czy klawisz jest wciśnięty czy puszczony. SFML wspiera maksymalnie do 8 kontrolerów oraz po 32 przyciski na każdy z nich.

Osie joysticków są zazwyczaj bardzo czułe dlatego w SFML stosuje się próg detekcji poruszenia gałką. Możesz go zmienić używajac Window::setJoystickThreshold. Wspierane jest 8 osi joystick’ów: X, Y, Z, R, U, V, POV X i POV Y. Sposób ich mapowania zależy od ich sterownika.

Zdarzenie poruszenia posiada id joysticka, nazwę osi oraz obecną pozycję (w przedziale <-100,100>).

Oryginalny artykuł