diff options
Diffstat (limited to 'block.h')
| -rw-r--r-- | block.h | 153 |
1 files changed, 153 insertions, 0 deletions
@@ -0,0 +1,153 @@ +/* + * block.h -- Implementa los bloques que aparecen en el juego. + * 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 block.h Implementa los bloques que aparecen en el juego. + */ + +#ifndef __BLOCK_H +#define __BLOCK_H +#include "collision_type.h" +#include "item.h" +#include "player.h" +#include "screen.h" + +/** El tamaño de un bloque en píxeles. */ +#define BLOCK_SIZE 16 + +/** Representa un tipo de bloque. */ +typedef enum BlockType { + /** Indica que se trata de decoración de fondo, por tanto + * atravesable sin ningún efecto. + */ + BLOCK_TYPE_PASSTHROUGH, + + /** Indica un bloque opaco, no atravesable pero que no hace nada. */ + BLOCK_TYPE_OPAQUE, + + /** Indica un bloque que al golpearlo devuelve una moneda y se + * convierte en opaco. + */ + BLOCK_TYPE_COIN, + + /** Indica un bloque que al golpearlo devuelve una moneda y al hacerlo + * es destruído. + */ + BLOCK_TYPE_DESTROYCOIN, + + /** Indica un bloque que devuelve una moneda y después sigue + * devolviendo monedas durante un intervalo aproximado de tiempo, tras + * el cual se convierte en bloque opaco normal. + */ + BLOCK_TYPE_MULTICOIN, + + /** Indica un bloque del tipo BLOCK_TYPE_MULTICOIN que ya ha sido + * golpeado. + */ + BLOCK_TYPE_HIT_MULTICOIN, + + /** Indica un bloque que devuelve un champiñón, o una + * flor si el personaje que lo golpea ya está en estado + * "grande" o "flor". + */ + BLOCK_TYPE_UPGRADE +} BlockType; + +/** Representa un bloque (fijo) del mundo. */ +typedef struct Block *Block; + +/** + * \brief Crea un bloque del mapa. + * \param type El tipo de bloque. + * \param x La posición X del bloque, en bloques desde la izquierda del + * mundo. + * \param y La posición Y del bloque, en bloques desde la parte inferior + * del mundo. + * \param ix La coordenada X en la imagen de bloques en la que se encuentra el + * bloque, en bloques. + * \param iy La coordenada Y en la imagen de bloques en la que se encuentra el + * bloque, en bloques. + * \param nanim El número de pasos de la animación del bloque, que + * en la imagen de bloques se almacenan de forma consecutiva en horizontal a + * partir de las coordenadas dadas. Si el bloque no tiene animación, este + * valor debe ser 1. + * \return El bloque creado. + */ +Block block_create(BlockType type, int x, int y, int ix, int iy, int nanim); + +/** + * \brief Libera un bloque. + * \param b El bloque a liberar. + */ +void block_free(Block b); + +/** + * \brief Libera los recursos ocupados por el módulo que no pertenecen a ningún bloque en concreto, como son las imágenes de + * estos. + * \remarks Debe ser llamada antes que a screen_end. + */ +void block_end(); + +/** + * \brief Obtiene la coordenada X del bloque. + * \param b El bloque. + * \return La coordenada X del bloque, en bloques desde la parte izquierda del + * mundo. + */ +int block_x(Block b); + +/** + * \brief Obtiene la coordenada Y del bloque. + * \param b El bloque. + * \return La coordenada Y del bloque, en bloques desde la parte inferior del + * mundo. + */ +int block_y(Block b); + +/** + * \brief Dibuja un bloque en la pantalla. + * \param scr La ventana donde dibujar el bloque. + * \param b El bloque a dibujar. + * \param scroll La distancia en píxeles desde la parte izquierda del + * mundo hasta la parte izquierda de la ventana. + * \return Un valor distinto de 0 si el bloque está dentro del + * área visible del mundo (solo comprueba la coordenada horizontal), + * o 0 si queda fuera de dicha área. + */ +int block_render(Screen scr, Block b, int scroll); + +/** + * \brief Compruba si el bloque es atravesable (por objetos o personajes). + * \param b El bloque. + * \return Un valor distinto de 0 si el bloque es atravesable, o 0 si no lo es. + */ +int block_can_pass_through(Block b); + +/** + * \brief Realiza las acciones necesiarias cuando un personaje golpea un bloque. + * \param p El personaje. + * \param b El bloque golpeado por el personaje. + * \param item Parámetro de salida. Si no es NULL, la función + * deposita aquí el objeto devuelto por el bloque al ser golpeado, o + * NULL si no devuelve ningún objeto. + * \return Un valor distinto de 0 si el bloque debe ser eliminado, o 0 si no + * debe serlo. + */ +int block_hit(Player p, Block b, Item *item); + +#endif // __BLOCK_H |
