diff options
Diffstat (limited to 'screen.h')
| -rw-r--r-- | screen.h | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/screen.h b/screen.h new file mode 100644 index 0000000..509e95e --- /dev/null +++ b/screen.h @@ -0,0 +1,200 @@ +/* + * screen.h -- Abstracción sobre SDL para la entrada y salida gráfica. + * Copyright (C) 2018 Juan Marín Noguera + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +/** + * \file screen.h Abstracción sobre SDL para la entrada y salida gráfica. + */ + +#ifndef __SCREEN_H +#define __SCREEN_H + +#include <SDL2/SDL.h> + +/** Representa una imagen. */ +typedef struct Picture *Picture; + +/** + * Representa una ventana de tamaño fijo sobre la que podemos dibujar. + */ +typedef struct Screen *Screen; + +/** Representa el inicio de una pulsación de tecla. Usado en + * screen_get_keyboard_event. + */ +#define SCREEN_KEYDOWN 1 + +/** Representa el final de una pulsación de tecla. Usado en + * screen_get_keyboard_event. + */ +#define SCREEN_KEYUP 2 + +/** Representa una imagen. */ +typedef struct Picture *Picture; + +/** Representa una ventana de tamaño fijo sobre la que podemos dibujar. + */ +typedef struct Screen *Screen; + +/** + * \brief Crea una ventana con la que el usuario puede interactuar. + * \param caption El título de la ventana. + * \param w Ancho de la ventana. + * \param h Alto de la ventana. + * \return La instancia del TDA Screen para manejar la ventana. + */ +Screen screen_create(const char *caption, int w, int h); + +/** + * \brief Libera un objeto Screen y cierra la ventana asociada. + * \param scr El objeto Screen a liberar. + */ +void screen_free(Screen scr); + +/** + * \brief Libera todos los recursos de SDL, que fueron alojados al llamar por + * primera vez a screen_create. + */ +void screen_end(); + +/** + * \brief Devuelve el ancho de la ventana. + * \param scr La ventana en cuestión. + * \return El ancho de la ventana. + */ +int screen_width(Screen scr); + +/** + * \brief Devuelve el alto de la ventana. + * \param src La ventana en cuesti&oactue;n. + * \return El alto de la ventana. + */ +int screen_height(Screen scr); + +/** + * \brief Pausa el programa durante una cantidad de tiempo determinada. + * \param ms La cantidad de tiempo a esperar. + */ +void screen_wait(int ms); + +/** + * \brief Actualiza el contenido de la ventana. Esta funci&oactue;n debe ser + * llamada una vez se ha terminado de dibujar en el objeto Screen para que los + * resultados sean visibles. + * \param scr La ventana en cuestión. + */ +void screen_update(Screen scr); + +/** + * \brief Comprueba si se ha pulsado (o dejado de pulsar) una tecla del + * teclado. + * \param sc Si es no nulo, se guarda qué tecla se ha pulsado. + * \return SCREEN_KEYDOWN si se ha pulsado una tecla, SCREEN_KEYUP si se + * ha dejado de pulsar o 0 si no ha ocurrido ninguna de las dos cosas. + * \remarks Esta función consume (e ignora) el resto de eventos que + * puedan ocurrir hasta dicha pulsación de tecla, salvo la + * notificación de cierre de ventana, que termina la aplicación. + */ +int screen_get_keyboard_event(SDL_Scancode *sc); + +/** + * \brief Comprueba si una tecla del teclado está siendo pulsada. + * \param scancode El código de la tecla en cuestión, véase + * <a href="https://wiki.libsdl.org/SDL_Scancode">SDL_Scancode</a> en la + * documentación de SDL para más información. + */ +int screen_key_pressed(SDL_Scancode scancode); + +/** + * \brief Llena una ventana con un color dado. + * \param scr La ventana en cuestión. + * \param r El componente rojo del color, de 0 a 255. + * \param g El componente verde del color, de 0 a 255. + * \param b El componente azul del color, de 0 a 255. + * \param a El nivel de opacidad, de 0 a 255. + */ +void screen_fill(Screen scr, int r, int g, int b, int a); + +/** + * \brief Copia una imagen (o un trozo de una) en una ventana. + * \param scr La ventana en cuestión. + * \param pict La imagenn en cuestión. + * \param x La coordenada X en la pantalla donde situar la esquina superior + * izquierda del trozo a copiar. + * \param y La coordenada Y en la pantalla donde situar la esquina superior + * izquierda del trozo a copiar. + * \param sx La coordenada X en la imagen de la esquina superior izquierda de + * lo que se ha de copiar. + * \param sy La coordenada Y en la imagen de la esquina superior izquierda de + * lo que se ha de copiar. + * \param w El ancho del trozo de la imagen a copiar. + * \param h El alto del trozo de la imagen a copiar. + * \param flipped Si es distinto de 0, la imagen se copia "en espejo" sobre el + * eje horizontal. De lo contrario se copia "normal". + * \remarks Si el cuadrado donde se ha de copiar la imagen queda fuera del + * área visible, la imagen no se muestra. Parte de la imagen puede salir + * del área visible, y entonces se copia solo la parte visible. + */ +void screen_place(Screen scr, Picture pict, int x, int y, int sx, int sy, + int w, int h, int flipped); + +/** + * \brief Carga una imagen desde un fichero. + * \param file La ruta del fichero. + * \return La imagen leída. + * \remarks El fichero debe ser una imagen BMP no comprimida. + */ +Picture screen_get_picture(const char *file); + +/** + * \brief Libera la memoria ocupada por una imagen. + * \param La imagen en cuestión. + */ +void screen_free_picture(Picture pict); + +/** + * \brief Imprime un texto en pantalla. + * \param scr La ventana en la que imprimir el texto. + * \param x La coordenada X en la pantalla donde irá la esquina superior + * izquierda del texto. + * \param y La coordenada Y en la pantalla donde irá la esquina superior + * izquierda del texto. + * \param w El ancho en número de caracteres del recuadro donde + * irá el texto. Si el texto es más largo que esto, se + * ocuparán más líneas en la pantalla según sea + * necesario. Si este parámetro es 0, se escribirá todo en la + * misma línea. + * \param str El texto a imprimir. + * \remarks El texto puede salir del área visible de la pantalla. El + * caracter . será sustituido por el signo de copyright. Algunos + * caracteres no están soportados. + */ +void screen_text_print(Screen scr, int x, int y, int w, const char *str); + +/** + * \brief Imprime un texto en pantalla, centrado en una cierta área. + * \param scr La ventana en la que imprimir el texto. + * \param x La coordenada horizontal en la que centrar el texto. + * \param y La coordenada vertical de lo que será el borde superior del + * texto en la ventana. + * \param str El texto a imprimir. + * \remarks El texto puede salir del área visible de la pantalla. El + * caracter . será sustituido por el signo de copyright. Algunos + * caracteres no están soportados. + */ +void screen_text_centered(Screen scr, int x, int y, const char *str); +#endif // __SCREEN_H |
