Del traductor:
Esta es una continuación de una serie de traducciones de tutoriales Twinklebear, disponibles en el original aquí . La traducción es en parte gratuita y puede contener pequeñas modificaciones o adiciones del traductor. La traducción de las dos primeras lecciones está escrita por InvalidPointer . Las imágenes del artículo original están localizadas con la máxima preservación del estilo del autor.Lista de lecciones:Manejo de eventos
En esta lección, aprenderemos los conceptos básicos para obtener la entrada del usuario, y por la simplicidad del ejemplo, percibiremos cualquier acción del usuario como un intento de
escape para finalizar el programa. SDL utiliza la estructura SDL_Event y las funciones de extracción de eventos de la cola de eventos, como SDL_PollEvent, para recuperar información sobre eventos. El código escrito como parte de esta lección se basa en los resultados de la
lección anterior .
Pero primero, cambiemos la imagen en el centro de la pantalla para que el usuario que ve por primera vez su programa comprenda lo que hace y lo que se requiere de él.
Autor hombre salvadoEl bucle principal más simple
Agregaremos el
bucle principal al programa, lo que hará que el programa funcione hasta que el usuario quiera salir (y notificar al programa de forma accesible, por supuesto), en lugar de un retraso fijo, como sucedió en las lecciones anteriores. Aquí hay una estructura aproximada de dicho ciclo:
while (!quit)
Cola de eventos SDL
Para utilizar correctamente el sistema de eventos SDL, necesitamos al menos una comprensión mínima de su funcionamiento. Cuando el SDL recibe un evento del sistema operativo, lo coloca al final de la cola, después de todos los demás eventos que se recibieron anteriormente, pero que aún no se han extraído del programa. Si, después de iniciar el programa, cambiamos el tamaño alternativamente de la ventana, hacemos clic en ella y hacemos clic en una tecla, la cola de eventos se vería así:

Cuando llamamos a SDL_PollEvent, obtenemos un evento desde el comienzo de la cola, el más antiguo de los restantes. Recibir eventos de la cola usando SDL_PollEvent los elimina de allí, para evitar esto, puede "espiar" el evento usando la función SDL_PeepEvents con el conjunto de banderas SDL_PEEKEVENT. Puede leer más sobre esta función en la documentación, no será necesaria en el marco de este artículo (y lo más probable es que también lo haga) y, por lo tanto, no será considerada.
Manejo de eventos
En el bucle principal, queremos recibir todos los eventos disponibles que vinieron después de que se dibujó el marco anterior y procesarlos. Para hacer esto, simplemente coloque SDL_PollEvent en la condición del ciclo while, ya que devuelve 1 si recibió el evento y 0 si no hay nada que recibir. Como todo lo que hace el programa es completar su trabajo en ciertos eventos, será suficiente usar una variable booleana (bool quit), que indica si queremos finalizar el programa o no y establecer su valor en verdadero cuando se reciben estos eventos.
Este bucle debe colocarse dentro del bucle principal de la aplicación.
Se produce un evento de tipo SDL_QUIT cuando el usuario cierra la ventana, SDL_KEYDOWN cuando se presiona la tecla en el teclado (y aparece muchas, muchas veces mientras se mantiene presionada, similar a cómo se repiten las letras mientras se mantiene presionada la tecla mientras se imprime el texto), y ocurre un evento de tipo SDL_MOUSEBUTTONDOWN cuando clic del mouse Estos son solo algunos de los eventos que su aplicación puede recibir, y en total, el SDL puede recibir más de 20 tipos de eventos, que este artículo, por supuesto, no puede cubrir, por lo tanto, debe leer sobre ellos en la documentación de
SDL_EventFinalización del ciclo principal.
Hemos terminado el procesamiento del evento, pero en el bucle principal, falta otra parte: la visualización de la escena. Ya hemos considerado este tema en lecciones anteriores, solo queda aplicar este conocimiento, y el ciclo principal tomará la siguiente forma:
Este programa funcionará para siempre. Bueno, o al menos hasta que el usuario le pide
cortésmente que pare. Después de iniciar el programa, presionar el botón con una cruz, presionar cualquier tecla del teclado o hacer clic con el mouse dentro de la ventana debería llevar a la finalización de su trabajo. Y hasta ese momento, ella redibujará constantemente el contenido de la ventana.
Adición del traductor: el programa en la forma en que probablemente consumirá todos los recursos de procesador disponibles, cargando completamente un núcleo. Será racional agregar un pequeño retraso (1-5 ms) al final del ciclo principal usando SDL_Delay, de modo que, en ausencia de eventos, el programa libere el procesador para otros programas. Esto no se aplica a los juegos pesados, que ya requieren todos los recursos disponibles, cuando a 100 fps gastar 100 ms cada segundo en espera es un lujo inadmisible.El final de la cuarta lección.
Así que la siguiente lección llegó a su fin. Nos vemos en la lección 5: Muestreo de un atlas de texturas
Tarea: intente agregar movimiento de imagen, por ejemplo, usando las flechas.