Presionar el botón X para salir de la ventana es solo uno de los eventos que SDL es capaz de manejar. Otro tipo de entrada bastante utilizado en juegos y es el teclado. En esta publicación vamos a presentar diferentes imágenes dependiendo de que tecla hayas presionado.
Justo debajo de la declaración de las constantes de la dimensión de la ventana declaramos una enumeración de las diferentes superficies que tenemos. Los enumeradores son una forma rápida de hacer constantes simbólicas en lugar crear constantes individuales.
Un mal hábito que los programadores principiantes tienen es usar números arbitrarios en lugar de constantes simbólicas. Por ejemplo, definir que "1" significa "menú principal", "2", "opciones", etcétera. Esto está bien para programas pequeños, pero cuando estamos lidiando con miles de líneas de código (que es muy común en videojuegos), tener una línea que utiliza constantes simbólicas resulta más cómodo.
Junto con los prototipos de función usuales, tenemos una nueva función loadSurface. Una regla en general, si estás copiando y pegando código, estás haciendo algo mal. En lugar de copiar y pegar el código de carga todas las veces, vamos a utilizar una función que se encargue de eso.
Lo que importa para este programa en específico es tener un arreglo de punteros a superficies de SDL llamado gKeyboardSurfaces, para contener todas las imágenes que vamos a utilizar. Dependiendo de que tecla presiones el usuario, usaremos gCurrentSurface (La imágen que se le aplicará dibujará en la pantalla) a una superficie.
Esta es la función loadSurface, que carga una imagen y reporta un error si algo sale mal. Es prácticamente lo mismo que antes, pero ahora con el manejo y reporte de errores en una función, lo que hace más fácil agregar y depurar la carga de imágenes.
Esta función no tiene el manejo de recursos dentro de la adquisición de estos. No se encarga de desalojar la memoria una vez que se haya asignado a la imagen. La función que solicito el acceso debe de encargarse de liberar los recursos una vez que haya terminado con la imagen, no al termino del ciclo de vida del archivo. Quizá en otro tiempo hablaremos de punteros inteligentes y RAII.
En esta función loadMedia vamos a cargar todas las imágenes que vamos a renderizar en la pantalla.
En la función principal antes de entrar al ciclo principal, vamos a asignar la imagen predeterminada a la superficie actual.
Aquí se encuentra nuestro ciclo de eventos. Como se vio en el tutorial anterior, Programación Orientada a Eventos, ahora manejaremos el evento SDL_KEYDOWN. Este evento ocurre cuando el usuario presiona una tecla con el teclado.
Dentro de un SDL_Event hay un SDL_Keyboard_event, el cual contiene información del evento de la tecla. Dentro de tal, hay un SDL_Keysym, el cual contiene información sobre que tecla fue presionada.
Como podrás ver, lo que este código hace es establecer las superficies en base a que tecla fue presionada. Puedes buscar en la documentación de SDL para ver cuales son los otros códigos de tecla para las demás teclas.
Después de que las teclas hayan sido manejadas y la superficie se haya establecido, le hacemos blit a la superficie para aplicarla en la pantalla.
¡Descarga el código fuente y los recursos de esta publicación aquí!
Justo debajo de la declaración de las constantes de la dimensión de la ventana declaramos una enumeración de las diferentes superficies que tenemos. Los enumeradores son una forma rápida de hacer constantes simbólicas en lugar crear constantes individuales.
Un mal hábito que los programadores principiantes tienen es usar números arbitrarios en lugar de constantes simbólicas. Por ejemplo, definir que "1" significa "menú principal", "2", "opciones", etcétera. Esto está bien para programas pequeños, pero cuando estamos lidiando con miles de líneas de código (que es muy común en videojuegos), tener una línea que utiliza constantes simbólicas resulta más cómodo.
Junto con los prototipos de función usuales, tenemos una nueva función loadSurface. Una regla en general, si estás copiando y pegando código, estás haciendo algo mal. En lugar de copiar y pegar el código de carga todas las veces, vamos a utilizar una función que se encargue de eso.
Lo que importa para este programa en específico es tener un arreglo de punteros a superficies de SDL llamado gKeyboardSurfaces, para contener todas las imágenes que vamos a utilizar. Dependiendo de que tecla presiones el usuario, usaremos gCurrentSurface (La imágen que se le aplicará dibujará en la pantalla) a una superficie.
Esta es la función loadSurface, que carga una imagen y reporta un error si algo sale mal. Es prácticamente lo mismo que antes, pero ahora con el manejo y reporte de errores en una función, lo que hace más fácil agregar y depurar la carga de imágenes.
Esta función no tiene el manejo de recursos dentro de la adquisición de estos. No se encarga de desalojar la memoria una vez que se haya asignado a la imagen. La función que solicito el acceso debe de encargarse de liberar los recursos una vez que haya terminado con la imagen, no al termino del ciclo de vida del archivo. Quizá en otro tiempo hablaremos de punteros inteligentes y RAII.
En esta función loadMedia vamos a cargar todas las imágenes que vamos a renderizar en la pantalla.
En la función principal antes de entrar al ciclo principal, vamos a asignar la imagen predeterminada a la superficie actual.
Aquí se encuentra nuestro ciclo de eventos. Como se vio en el tutorial anterior, Programación Orientada a Eventos, ahora manejaremos el evento SDL_KEYDOWN. Este evento ocurre cuando el usuario presiona una tecla con el teclado.
Dentro de un SDL_Event hay un SDL_Keyboard_event, el cual contiene información del evento de la tecla. Dentro de tal, hay un SDL_Keysym, el cual contiene información sobre que tecla fue presionada.
Como podrás ver, lo que este código hace es establecer las superficies en base a que tecla fue presionada. Puedes buscar en la documentación de SDL para ver cuales son los otros códigos de tecla para las demás teclas.
Después de que las teclas hayan sido manejadas y la superficie se haya establecido, le hacemos blit a la superficie para aplicarla en la pantalla.
¡Descarga el código fuente y los recursos de esta publicación aquí!
No comments:
Post a Comment