/* * 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 . */ /** * \file screen.h Abstracción sobre SDL para la entrada y salida gráfica. */ #ifndef __SCREEN_H #define __SCREEN_H #include /** 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 * SDL_Scancode 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