SDL_events.h

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 eventoEstructura de eventoCampo SDL_Event
SDL_AUDIODEVICEADDED
SDL_AUDIODEVICEREMOVED
SDL_AudioDeviceEventadevice
SDL_CONTROLLERAXISMOTION SDL_ControllerAxisEventcaxis
SDL_CONTROLLERBUTTONDOWN
SDL_CONTROLLERBUTTONUP
SDL_ControllerButtonEventcbutton
SDL_CONTROLLERDEVICEADDED
SDL_CONTROLLERDEVICEREMOVED
SDL_CONTROLLERDEVICEREMAPPED
SDL_ControllerDeviceEventcdevice
SDL_DOLLARGESTURE
SDL_DOLLARRECORD
SDL_DollarGestureEventdgesture
SDL_DROPFILE
SDL_DROPTEXT
SDL_DROPBEGIN
SDL_DROPCOMPLETE
SDL_DropEventdrop
SDL_FINGERMOTION
SDL_FINGERDOWN
SDL_FINGERUP
SDL_TouchFingerEventtfinger
SDL_KEYDOWN
SDL_KEYUP
SDL_KeyboardEventkey
SDL_JOYAXISMOTION SDL_JoyAxisEventjaxis
SDL_JOYBALLMOTION SDL_JoyBallEventjball
SDL_JOYHATMOTION SDL_JoyHatEventjhat
SDL_JOYBUTTONDOWN
SDL_JOYBUTTONUP
SDL_JoyButtonEventjbutton
SDL_JOYDEVICEADDED
SDL_JOYDEVICEREMOVED
SDL_JoyDeviceEventjdevice
SDL_MOUSEMOTION SDL_MouseMotionEventmotion
SDL_MOUSEBUTTONDOWN
SDL_MOUSEBUTTONUP
SDL_MouseButtonEventbutton
SDL_MOUSEWHEEL SDL_MouseWheelEventwheel
SDL_MULTIGESTURE SDL_MultiGestureEventmgesture
SDL_QUIT SDL_QuitEventquit
SDL_SYSWMEVENT SDL_SysWMEventsyswm
SDL_TEXTEDITING SDL_TextEditingEventedit
SDL_TEXTINPUT SDL_TextInputEventtext
SDL_USEREVENT SDL_UserEventuser
SDL_WINDOWEVENT SDL_WindowEventwindow
Other events SDL_CommonEventninguno, usar ,type