aboutsummaryrefslogtreecommitdiff
path: root/item.h
blob: 64cbad827c4157fe45c77ce0443ed466791a2133 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/*
 * item.h -- Implementa los objetos (y enemigos) 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 item.h Implementa los objetos (y enemigos) que aparecen en el juego.
 */

#ifndef __ITEM_H
#define __ITEM_H
#include "collision_type.h"
#include "player.h"
#include "screen.h"

/** Representa un tipo de objeto. */
typedef enum ItemType {
	/** Indica que el objeto es un goomba. */
	ITEM_TYPE_GOOMBA,

	/** Indica que el objeto es un koopa. */
	ITEM_TYPE_KOOPA,

	/** Indica que el objeto es un champi&ntilde;&oacute;n. */
	ITEM_TYPE_MUSHROOM,

	/** Indica que el objeto es una flor. */
	ITEM_TYPE_FLOWER,

	/** Indica que el objeto es una moneda. */
	ITEM_TYPE_COIN,

	/** Indica que el objeto es una "moneda temporal", es decir, una que
	 * se muestra al golpear un bloque que devuelve una moneda pero que se
	 * contabiliza en el momento de golpear el bloque, y no al coger la
	 * moneda.
	 */
	ITEM_TYPE_TEMPCOIN
} ItemType;

/** Tipo de dato objeto. */
typedef struct Item *Item;

/**
 * \brief Crea un objeto.
 * \param type Tipo de objeto, uno de los definidos como ITEM_TYPE_*.
 * \param x Coordenada X de la posici&oacute;n inicial del objeto, en
 * p&iacute;xeles respecto del borde izquierdo del mundo.
 * \param y Coordenada Y de la posici&oacute;n inicial del objeto, en
 * p&iacute;xeles respecto de la parte inferior del mundo.
 */
Item item_create(ItemType type, double x, double y);

/**
 * \brief Libera un objeto.
 * \param i El objeto a liberar.
 */
void item_free(Item i);

/**
 * \brief Libera los recursos utilizados por el TDA de forma global (las
 * im&aacute;genes.
 */
void item_end();

/**
 * \brief Obtiene la coordenada X del objeto.
 * \param i El objeto.
 * \return La coordenada X del objeto, en p&iacute;xeles desde la parte
 * izquierda del mundo.
 */
double item_x(Item i);

/**
 * \brief Obtiene la coordenada Y del objeto.
 * \param i El objeto.
 * \return La coordenada Y del objeto, en p&iacute;xeles desde la parte inferior
 * del mundo.
 */
double item_y(Item i);

/**
 * \brief Devuelve la velocidad horizontal del objeto.
 * \param i El objeto.
 * \return La velocidad horizontal del objeto (hacia la derecha) en
 * p&iacute;xeles por frame.
 */
double item_vx(Item i);

/**
 * \brief Devuelve la velocidad vertical del objeto.
 * \param i El objeto.
 * \return La velocidad vertical del objeto (hacia arriba) en p&iacute;xeles
 * por frame.
 */
double item_vy(Item i);

/**
 * \brief Devuelve el ancho del objeto.
 * \param i El objeto.
 * \return El ancho del objeto en p&iacute;xeles.
 */
int item_width(Item i);

/**
 * \brief Devuelve el alto del objeto.
 * \param i El objeto.
 * \return El alto del objeto en p&iacute;xeles.
 */
int item_height(Item i);

/**
 * \brief Actualiza la posici&oacute;n y propiedades de un objeto despu&eacute;s
 * de un frame.
 * \param i El objeto en cuesti&oacute;n.
 * \return Un valor distinto de 0 si el objeto debe ser eliminado, o 0 si no
 * debe serlo.
 * \remarks Esta funci&oacute;n act&uacute;a como si el objeto no chocara con
 * nada. Puede ser necesario llamar posteriormente a
 * item_correct_on_block_collision o a item_player_collide.
 */
int item_update(Item i);

/**
 * \brief Corrige la posici&oacute;n de un objeto tras colisionar con un bloque.
 * \param i El objeto en cuesti&oacute;n.
 * \param dir La direcci&oacute;n relativa del bloque con el que choca el objeto
 * respecto de la posici&oacute;n del objeto.
 */
void item_correct_on_block_collision(Item i, CollisionType dir);

/**
 * \brief Realiza las acciones necesarias cuando el objeto colisiona con el
 * personaje.
 * \param i El objeto en cuesti&oacute;n.
 * \param p El personaje.
 * \param dir La posici&oacute;n relativa del objeto respecto del personaje.
 * \return Valor distinto de 0 si deber&iacute;a liberarse y eliminarse el
 * objeto, o 0 si no deber&iacute;a.
 */
int item_player_collide(Item i, Player p, CollisionType dir);

/**
 * \brief Dibuja el objeto en la pantalla, siempre que est&eacute; en el
 * &aacute;rea visible.
 * \param scr La ventana donde dibujar el objeto.
 * \param i El objeto.
 * \param scroll La distancia en p&iacute;xeles desde la parte izquierda del
 * mundo hasta la parte izquierda de la ventana.
 */
void item_render(Screen scr, Item i, int scroll);

#endif // __ITEM_H