Serwis Edukacyjny
Nauczycieli
w I-LO w Tarnowie

obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek

©2021 mgr Jerzy Wałaszek
I LO w Tarnowie

SDL2

Interfejs SDL2:

SDL_Event

SPIS TREŚCI

Rozdział jest tłumaczeniem oryginalnej instrukcji dla biblioteki SDL2. Oryginał znajdziesz pod tym adresem: https://wiki.libsdl.org/CategoryAPI.

SDL_Event

Unia zawierająca struktury dla różnych rodzajów zdarzeń.

Pola danych

Uint32 type typ zdarzenia, wspólne dla wszystkich zdarzeń.
SDL_CommonEvent common dane wspólne.
SDL_WindowEvent window dane zdarzenia okna.
SDL_KeyboardEvent key dane zdarzenia klawiatury.
SDL_TextEditingEvent edit dane zdarzenia edycji.
SDL_TextInputEvent text dane zdarzenia wprowadzania tekstu.
SDL_MouseMotionEvent motion dane zdarzenia ruchu myszki.
SDL_MouseButtonEvent button dane zdarzenia przycisku myszki.
SDL_MouseWheelEvent wheel dane zdarzenia kółka myszki.
SDL_JoyAxisEvent jaxis dane zdarzenia ruchu joysticka.
SDL_JoyBallEvent jball dane zdarzenia ruchu kulką joysticka.
SDL_JoyHatEvent jhat dane zdarzenia ruchu kursorem joysticka.
SDL_JoyButtonEvent jbutton dane zdarzenia przycisku joysticka.
SDL_JoyDeviceEvent jdevice dane zdarzenia urządzenia joysticka.
SDL_ControllerAxisEvent caxis dane zdarzenia ruchu manetką kontrolera gier.
SDL_ControllerButtonEvent cbutton dane zdarzenia przycisku kontrolera gier.
SDL_ControllerDeviceEvent cdevice dane zdarzenia urządzenia kontrolera gier.
SDL_AudioDeviceEvent adevice dane zdarzenia urządzenia audio (>= SDL 2.0.4).
SDL_QuitEvent quit dane zdarzenia zakończenia aplikacji.
SDL_UserEvent user dane zdarzenia zdefiniowanego przez użytkownika.
SDL_SysWMEvent syswm dane zdarzenia systemowego okna.
SDL_TouchFingerEvent tfinger dane zdarzenia dotknięcia palcem.
SDL_MultiGestureEvent mgesture dane gestu wielopalcowego.
SDL_DollarGestureEvent dgesture dane gestu wielopalcowego.
SDL_DropEvent drop dane zdarzenia przeciągania i upuszczania.

Uwagi

Struktura SDL_Event stanowi rdzeń obsługi zdarzeń w SDL. SDL_Event jest unią wszystkich struktur zdarzeń używanych w SDL. Wykorzystanie jej polega jedynie na znajomości, które zdarzenie odpowiada której strukturze składowej unii. Tablica ponizej przedstawia te powiązania.

Struktura SDL_Event posiada dwa zastosowania:

  • Odczytywanie zdarzeń z kolejki zdarzeń.
  • Umieszczanie zdarzeń w kolejce zdarzeń.

Odczytywanie zdarzeń z kolejki zdarzeń

Dokonywane jest to albo za pomocą SDL_PollEvent(), albo SDL_PeepEvents(). Użyjemy SDL_PollEvent() i przejdziemy krok po kroku przez przykład.

Najpierw tworzymy pustą strukturę SDL_Event.

SDL_Event test_event; 

SDL_PollEvent() usuwa kolejne zdarzenie z kolejki zdarzeń. Jeśli w kolejce nie ma zdarzeń, zwraca 0, w przeciwnym razie zwraca 1. Do przetwarzania zdarzeń po kolei używamy pętli while.

while (SDL_PollEvent(&test_event)) { 

Funkcja SDL_PollEvent() przyjmuje jako parametr wskaźnik do struktury SDL_Event, która ma zostać wypełniona informacjami o zdarzeniu. Wiemy, że przy usunięciu przez SDL_PollEvent() zdarzenia z kolejki, informacja o nim zostanie umieszczona w naszej strukturze test_event, wiemy również, że rodzaj zdarzenia zostanie umieszczony w polu type struktury test_event. Zatem do osobnej obsługi każdego zdarzenia, stosujemy polecenie switch.

switch (test_event.type) { 

Musimy wiedzieć, jakiego rodzaju zdarzeń poszukujemy oraz musimy znać ich typ. Zatem załóżmy, że chcemy wykryć, gdzie użytkownik przesunął kursor myszki w aplikacji. Przeglądamy typy zdarzeń i zauważamy, że SDL_MOUSEMOTION jest prawdopodobnie tym zdarzeniem, którego szukamy. Spojrzenie na tabelę poniżej mówi nam, że zdarzenia SDL_MOUSEMOTION są obsługiwane wewnątrz struktury SDL_MouseMotionEvent, która należy do unii SDL_Event. Możemy sprawdzić wystąpienie zdarzenia typu SDL_MOUSEMOTION wewnątrz polecenia switch w sposób następujący:

case SDL_MOUSEMOTION:  

Teraz wystarczy nam odczytać informację z pola motion struktury test_event.

      printf("We got a motion event.\n");
      printf("Current mouse position is: (%d, %d)\n", test_event.motion.x, test_event.motion.y);
      break;
    default:
      printf("Unhandled Event!\n");
      break;
  }
}
printf("Event queue empty.\n");

Umieszczanie zdarzeń w kolejce zdarzeń

Możliwe jest również wstawianie zdarzeń do kolejki zdarzeń i wykorzystywanie jej w ten sposób do obustronnej komunikacji. Obie funkcje SDL_PushEvent() i SDL_PeepEvents() pozwalają ci na umieszczanie zdarzeń w kolejce. Zwykle używa się ich ze zdarzeniem SDL_USEREVENT, jednakże możesz również wstawiać fałszywe zdarzenia, jeśli chcesz. Tworzenie własnych zdarzeń polega po prostu na wybraniu pożądanego rodzaju zdarzenia, ustawieniu pola type oraz wypełnienia odpowiednich pól struktury informacjami.

SDL_Event user_event;

user_event.type = SDL_USEREVENT;
user_event.user.code = 2;
user_event.user.data1 = NULL;
user_event.user.data2 = NULL;
SDL_PushEvent(&user_event);

Związek pomiędzy rodzajami zdarzeń a polami unii

Rodzaj zdarzenia Struktura zdarzenia Pole SDL_Event
SDL_AUDIODEVICEADDED
SDL_AUDIODEVICEREMOVED
SDL_AudioDeviceEvent adevice
SDL_CONTROLLERAXISMOTION SDL_ControllerAxisEvent caxis
SDL_CONTROLLERBUTTONDOWN
SDL_CONTROLLERBUTTONUP
SDL_ControllerButtonEvent cbutton
SDL_CONTROLLERDEVICEADDED
SDL_CONTROLLERDEVICEREMOVED
SDL_CONTROLLERDEVICEREMAPPED
SDL_ControllerDeviceEvent cdevice
SDL_DOLLARGESTURE
SDL_DOLLARRECORD
SDL_DollarGestureEvent dgesture
SDL_DROPFILE
SDL_DROPTEXT
SDL_DROPBEGIN
SDL_DROPCOMPLETE
SDL_DropEvent drop
SDL_FINGERMOTION
SDL_FINGERDOWN
SDL_FINGERUP
SDL_TouchFingerEvent tfinger
SDL_KEYDOWN
SDL_KEYUP
SDL_KeyboardEvent key
SDL_JOYAXISMOTION SDL_JoyAxisEvent jaxis
SDL_JOYBALLMOTION SDL_JoyBallEvent jball
SDL_JOYHATMOTION SDL_JoyHatEvent jhat
SDL_JOYBUTTONDOWN
SDL_JOYBUTTONUP
SDL_JoyButtonEvent jbutton
SDL_JOYDEVICEADDED
SDL_JOYDEVICEREMOVED
SDL_JoyDeviceEvent jdevice
SDL_MOUSEMOTION SDL_MouseMotionEvent motion
SDL_MOUSEBUTTONDOWN
SDL_MOUSEBUTTONUP
SDL_MouseButtonEvent button
SDL_MOUSEWHEEL SDL_MouseWheelEvent wheel
SDL_MULTIGESTURE SDL_MultiGestureEvent mgesture
SDL_QUIT SDL_QuitEvent quit
SDL_SYSWMEVENT SDL_SysWMEvent syswm
SDL_TEXTEDITING SDL_TextEditingEvent edit
SDL_TEXTINPUT SDL_TextInputEvent text
SDL_USEREVENT SDL_UserEvent user
SDL_WINDOWEVENT SDL_WindowEvent window
Inne zdarzenia SDL_CommonEvent brak, użyj SDL_EventType

Powiązane enumeracje

Powiązane struktury

Powiązane funkcje

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2021 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.