1
2
3
4
5
6
7
8
9 import copy
10 import math
11
12 import pilas
13 from pilas.actores import Actor
14
16 """Representa una mapa de bloques rectangulares, ideal para crear escenarios de plataformas
17 y mapas.
18 """
19
20
21 - def __init__(self, grilla=None, x=0, y=0, filas=20, columnas=20):
22 """Inicializa el mapa.
23
24 :param grilla: La imagen a utilizar cómo grilla con los bloques del escenario.
25 :param x: Posición horizontal del mapa.
26 :param y: Posición vertical del mapa.
27 :param filas: Cantidad de filas que tendrá el mapa.
28 :param columnas: Cantidad de columnas que tendrá el mapa.
29 """
30 Actor.__init__(self, 'invisible.png', x, y)
31
32 self.filas = filas
33 self.columnas = columnas
34
35
36 self.matriz_de_bloques = self._generar_matriz_de_bloques(filas, columnas)
37
38 if not grilla:
39 grilla = pilas.imagenes.cargar_grilla("grillas/plataformas_10_10.png", 10, 10)
40
41 self.grilla = grilla
42 self.superficie = pilas.imagenes.cargar_superficie(columnas * self.grilla.cuadro_ancho, filas * self.grilla.cuadro_alto)
43 self.imagen = self.superficie
44
46 cols = copy.copy([False] * columnas)
47 matriz_de_bloques = []
48
49 for indice_fila in range(filas):
50 matriz_de_bloques.append(copy.copy(cols))
51
52 return matriz_de_bloques
53
54 - def pintar_bloque(self, fila, columna, indice, es_bloque_solido=True):
55 """Define un bloque de la grilla.
56
57 :param fila: La fila que se definirá (comenzando desde 0).
58 :param columna: La columna que se definirá (comenzando desde 0).
59 :param indice: El número de cuadro referente a la grilla (comenzando desde 0).
60 :param es_bloque_solido: True o False para indicar si los objetos físicos deberán colisionar con este bloque.
61 """
62
63 self.matriz_de_bloques[fila][columna] = es_bloque_solido
64
65
66 self.grilla.definir_cuadro(indice)
67
68
69 ancho = self.grilla.cuadro_ancho
70 alto = self.grilla.cuadro_alto
71
72 x = columna * ancho
73 y = fila * alto
74
75 self.grilla.dibujarse_sobre_una_pizarra(self.superficie, x, y)
76
85
96
98 """Retorna la distancia en pixels desde un punto del mundo al suelo.
99
100 Es importante mostrar que las coordenadas x e y son coordenadas del
101 mundo, no coordenadas de mouse o relativas al mapa.
102
103 El argumento maximo es la cantidad de pixels que tomaremos como
104 valor limite de la busqueda. Por ejemplo, si colocamos 100 como
105 limite y la funcion nos retorna 100 es porque no encontró un suelo
106 a menos de 100 pixels. Este límite existe por una cuestión de
107 eficiencia.
108
109 :param x: Posición horizontal de referencia.
110 :param y: Posición vertical de referencia.
111 :param maximo: Cantidad máxima de pixels a leer.
112 """
113
114
115
116
117 try:
118 x, y = self.convertir_de_coordenada_absoluta_a_coordenada_mapa(x, y)
119
120
121
122 resto = int(y % self.grilla.cuadro_alto)
123
124 if not resto and self.es_punto_solido_coordenada_mapa(x, y):
125 return 0
126
127
128
129 inicial = self.grilla.cuadro_alto - resto
130
131
132
133
134 for distancia in range(inicial, maximo, self.grilla.cuadro_alto):
135 if self.es_punto_solido_coordenada_mapa(x, y+distancia):
136 return distancia
137
138 except Exception:
139 return maximo
140
141 return maximo
142
144 """Indica si un determinado bloque es solido.
145
146 Los bloques sólidos se utilizan para marcar paredes y plataformas, es
147 decir que son bloques que generalmente no se pueden sobrepasar.
148
149 :param fila: La fila que se observará.
150 :param columna: La columna que se observará.
151 """
152 if not 0 <= fila < self.filas or not 0 <= columna < self.columnas:
153 raise Exception("La fila y columna consultadas estan fuera del area del mapa.")
154
155 return self.matriz_de_bloques[fila][columna]
156
172
174 """Toma un punto de pantalla y lo convierte a una coordenada dentro del mapa.
175
176 :param x: Coordenada horizontal de pantalla.
177 :param y: Coordenada vertical de pantalla.
178 """
179 dx, dy = self.centro
180 x = x + dx - self.x
181 y = -y + dy + self.y
182 return x, y
183
193
195 """Retorna el número de fila correspondiente a una coordenada vertical.
196
197 :param y: La coordenada vertical (relativa al mapa, no a la pantalla).
198 """
199
200 return self._convertir_en_int(y / self.grilla.cuadro_alto)
201
203 """Retorna el número de columna correspondiente a una coordenada horizontal.
204
205 :param x: La coordenada horizontal (relativa al mapa, no a la pantalla).
206 """
207
208 return self._convertir_en_int(x / self.grilla.cuadro_ancho)
209
211 return int(math.floor(valor))
212