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
|
/*
* item_list.h -- Implementa las listas de objetos.
* 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_list.h Implementa las listas de objetos.
*/
#ifndef __ITEM_LIST_H
#define __ITEM_LIST_H
#include "item.h"
#include "screen.h"
/** Representa un nodo de la lista de objetos. Usado para iterar sobre esta. */
typedef struct ItemNode *ItemNode;
/** Representa una lista de objetos. */
typedef struct ItemList *ItemList;
/**
* \brief Crea una lista vacía de objetos.
* \return Una nueva lista vacía de objetos.
*/
ItemList item_list_create();
/**
* \brief Libera una lista de objetos, junto con todos sus elementos.
* \param il La lista de objetos a liberar.
* \remarks Si la lista es liberada, todo iterador sobre ella dejará de
* ser válido (ver item_list_begin).
*/
void item_list_free(ItemList il);
/**
* \brief Devuelve un iterador para la lista, que apunta al primer elemento de
* esta (si existe).
* \param il La lista sobre la que iterar.
* \return Iterador de la lista apuntando al primer elemento. Si la lista
* está vacía, el iterador apunta al final (ver item_list_isend).
*/
ItemNode item_list_begin(ItemList il);
/**
* \brief Devuelve el objeto apuntado por un iterador de lista de objetos.
* \param in El iterador.
* \return El elemento actual al que apunta el iterador.
*/
Item item_list_current(ItemNode in);
/**
* \brief Avanza el iterador para que apunte al elemento siguiente al actual.
* \param in El iterador.
*/
void item_list_advance(ItemNode in);
/**
* \brief Elimina de la lista el elemento actual al que apunta el iterador (el
* devuelto por item_list_current), liberándolo.
* \param in El iterador.
* \remarks Tras llamar a esta función, el iterador apuntará a
* un elemento posterior. No se garantiza que se mantenga el orden de los
* elementos de la lista tras llamar a esta función.
*/
void item_list_delete(ItemNode in);
/**
* \brief Comprueba si el apuntador pasado como parámetro apunta al
* final.
* \param in El iterador.
* \return Un valor distinto de 0 si el elemento es el final, o 0 si no lo es.
* \remarks Es un error llamar a item_list_current, item_list_next o
* item_list_delete con un iterador que apunta al final, pues es como si
* apuntase al elemento posterior al último.
*/
int item_list_isend(ItemNode in);
/**
* \brief Libera de memoria un iterador.
* \param in El iterador a liberar.
*/
void item_list_free_node(ItemNode in);
/**
* \brief Añade un elemento al final de la lista.
* \param il La lista en la que añadir el elemento.
* \param e El elemento a añadir.
*/
void item_list_append(ItemList il, Item e);
/**
* \brief Actualiza los elementos de la lista de objetos, eliminando los que han
* quedado a la izquierda del área visible del mundo y los que han
* dejado de ser visibles por haber caído por debajo de este área,
* y teniendo en cuenta las posibles colisiones.
* \param il La lista de objetos.
* \param scroll La distancia en píxeles desde el borde izquierdo del
* mundo hasta el borde izquierdo del área visible de este.
* \param w El ancho del área visible del mundo, en píxeles.
* \remarks Esta función no tiene en cuenta posibles colisiones, por
* lo que es necesario manejar las colisiones aparte.
*/
void item_list_update(ItemList il, int scroll, int w);
/**
* \brief Dibuja todos los elementos de la lista de objetos.
* \param il La lista de objetos.
* \param scr La ventana sobre la que dibujar los objetos.
* \param scroll La distnacia en píxeles desde la parte izquierda del
* mundo hasta la parte izquierda de la ventana.
*/
void item_list_render(Screen scr, ItemList il, int scroll);
#endif // __ITEM_LIST_H
|