Estructura SDL_Event
Una unión que contiene estructuras para los diferentes tipos de eventos.
typedef union SDL_Event { Uint32 type; /**< Event type, shared with all events */ SDL_CommonEvent common; /**< Common event data */ SDL_DisplayEvent display; /**< Display event data */ SDL_WindowEvent window; /**< Window event data */ SDL_KeyboardEvent key; /**< Keyboard event data */ SDL_TextEditingEvent edit; /**< Text editing event data */ SDL_TextEditingExtEvent editExt; /**< Extended text editing event data */ SDL_TextInputEvent text; /**< Text input event data */ SDL_MouseMotionEvent motion; /**< Mouse motion event data */ SDL_MouseButtonEvent button; /**< Mouse button event data */ SDL_MouseWheelEvent wheel; /**< Mouse wheel event data */ SDL_JoyAxisEvent jaxis; /**< Joystick axis event data */ SDL_JoyBallEvent jball; /**< Joystick ball event data */ SDL_JoyHatEvent jhat; /**< Joystick hat event data */ SDL_JoyButtonEvent jbutton; /**< Joystick button event data */ SDL_JoyDeviceEvent jdevice; /**< Joystick device change event data */ SDL_JoyBatteryEvent jbattery; /**< Joystick battery event data */ SDL_ControllerAxisEvent caxis; /**< Game Controller axis event data */ SDL_ControllerButtonEvent cbutton; /**< Game Controller button event data */ SDL_ControllerDeviceEvent cdevice; /**< Game Controller device event data */ SDL_ControllerTouchpadEvent ctouchpad; /**< Game Controller touchpad event data */ SDL_ControllerSensorEvent csensor; /**< Game Controller sensor event data */ SDL_AudioDeviceEvent adevice; /**< Audio device event data */ SDL_SensorEvent sensor; /**< Sensor event data */ SDL_QuitEvent quit; /**< Quit request event data */ SDL_UserEvent user; /**< Custom event data */ SDL_SysWMEvent syswm; /**< System dependent window event data */ SDL_TouchFingerEvent tfinger; /**< Touch finger event data */ SDL_MultiGestureEvent mgesture; /**< Gesture event data */ SDL_DollarGestureEvent dgesture; /**< Gesture event data */ SDL_DropEvent drop; /**< Drag and drop event data */ /* This is necessary for ABI compatibility between Visual C++ and GCC. Visual C++ will respect the push pack pragma and use 52 bytes (size of SDL_TextEditingEvent, the largest structure for 32-bit and 64-bit architectures) for this union, and GCC will use the alignment of the largest datatype within the union, which is 8 bytes on 64-bit architectures. So... we'll add padding to force the size to be 56 bytes for both. On architectures where pointers are 16 bytes, this needs rounding up to the next multiple of 16, 64, and on architectures where pointers are even larger the size of SDL_UserEvent will dominate as being 3 pointers. */ Uint8 padding[sizeof(void *) <= 8 ? 56 : sizeof(void *) == 16 ? 64 : 3 * sizeof(void *)]; } SDL_Event;
Miembros
- type
- Tipo de evento, compartido por todos los eventos.
- common
- Datos de evento normal, SDL_CommonEvent.
- display
- Datos de evento de display, SDL_DisplayEvent.
- window
- Datos de evento de ventana, SDL_WindowEvent.
- key
- Datos de evento de teclado, SDL_KeyboardEvent
- edit
- Datos de evento de edición de texto, SDL_TextEditingEvent.
- text
- Datos de evento de entrada de texto, SDL_TextInputEvent.
- motion
- Datos de evento de movimiento de ratón, SDL_MouseMotionEvent.
- button
- Datos de evento de botón de ratón, SDL_MouseButtonEvent.
- wheel
- Datos de evento de rueda del ratón. SDL_MouseWheelEvent.
- jaxis
- Datos de evento de eje de joystick, SDL_JoyAxisEvent.
- jball
- Datos de evento de bola de joystick, SDL_JoyBallEvent.
- jhat
- Datos de evento de sombrero de joystick, SDL_JoyHatEvent.
- jbutton
- Datos de evento de botón de joystick, SDL_JoyButtonEvent.
- jdevice
- Datos de evento de dispositivo joystick, SDL_JoyDeviceEvent.
- caxis
- Datos de evento del eje del controlador de juego, SDL_ControllerAxisEvent.
- cbutton
- Datos de evento de botón de controlador de juego, SDL_ControllerButtonEvent.
- cdevice
- Datos de evento de dispositivo de controlador de juego, SDL_ControllerDeviceEvent.
- adevice
- Datos de evento de dispositivo de audio (>= SDL 2.0.4), SDL_AudioDeviceEvent.
- quit
- Datos de evento de petición de salida, SDL_QuitEvent.
- user
- Datos de evento personalizado, SDL_UserEvent.
- syswm
- Datos de evento de ventana propios del sistema, SDL_SysWMEvent.
- tfinger
- Datos de evento táctil, SDL_TouchFingerEvent.
- mgesture
- Datos de evento de gestos táctiles múltiples, SDL_MultiGestureEvent.
- dgesture
- Datos de evento de gestos táctiles múltiples, SDL_DollarGestureEvent.
- drop
- Datos de evento drag & drop, SDL_DropEvent.
Observaciones
La estructura SDL_Event es el núcleo de todo el manejo de eventos en SDL. SDL_Event es una unión de todas las estructuras de eventos utilizadas en SDL. Su uso es una simple cuestión de saber qué tipo de evento corresponde a cada miembro de la unión. La tabla anterior enumera estas relaciones.
La estructura SDL_Event tiene dos usos:
- Leer eventos de la cola de eventos.
- Colocar eventos en la cola de eventos.
Lectura de eventos de la cola de eventos
La lectura de eventos de la cola de eventos se realiza con SDL_PollEvent() o SDL_PeepEvents(). Usaremos SDL_PollEvent() y veremos un ejemplo.
En primer lugar, creamos una estructura SDL_Event vacía.
SDL_Event test_event;
SDL_PollEvent() elimina el siguiente evento de la cola de eventos. Si no hay eventos en la cola devuelve 0, en caso contrario devuelve 1. Usamos un bucle "while" para procesar cada evento sucesivamente.
while (SDL_PollEvent(&test_event)) {
La función SDL_PollEvent() toma un puntero a una estructura SDL_Event que debe ser llenada con la información del evento. Sabemos que si SDL_PollEvent() elimina un evento de la cola entonces la información del evento se colocará en nuestra estructura test_event, pero también sabemos que el tipo de evento se colocará en el miembro type de test_event. Así que para manejar cada tipo de evento por separado usamos una sentencia "switch".
switch (test_event.type) {
Necesitamos saber qué tipo de eventos estamos buscando y los tipos de eventos de esos eventos. Supongamos que queremos detectar dónde mueve el usuario el puntero del ratón dentro de nuestra aplicación. Miramos a través de nuestros tipos de eventos y notamos que SDL_MOUSEMOTION es, más que probablemente, el evento que estamos buscando. Mirando la tabla de abajo nos dice que los eventos SDL_MOUSEMOTION son manejados dentro de la estructura SDL_MouseMotionEvent que es el miembro motion de SDL_Event. Podemos comprobar el tipo de evento SDL_MOUSEMOTION en nuestra sentencia "switch" de la siguiente manera:
case SDL_MOUSEMOTION:
Todo lo que tenemos que hacer ahora es leer la información del miembro motion de 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");
Colocación de eventos en la cola de eventos
También es posible empujar eventos a la cola de eventos y así utilizarla como una vía de comunicación bidireccional. Tanto SDL_PushEvent() como SDL_PeepEvents() permiten colocar eventos en la cola de eventos. Esto se utiliza generalmente para colocar un SDL_USEREVENT en la cola de eventos, sin embargo, se podría utilizar para enviar eventos de entrada falsos si se desea. Crear eventos propios es una simple cuestión de elegir el tipo de evento que se quiere, establecer el miembro type y rellenar la estructura de miembros apropiada con información.
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);
Relaciones entre los tipos de eventos y los miembros de la unión
Tipo de evento | Estructura de evento | Campo 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 |
Other events | SDL_CommonEvent | ninguno, usar ,type |