1
2
3
4
5
6
7
8
9 import pilas
10 from pilas.actores import Mapa
11 from xml.dom import minidom
12
14 """Representa mapas creados a partir de imagenes mas pequeñas.
15
16 Este actor te permite crear escenarios tipo ``tiles``, a partir
17 de archivos .tmx, creados con el programa **tiled** (ver http://www.mapeditor.org).
18
19 Por ejemplo, para crear un mapa desde un archivo del programa
20 **tiled** puedes escribir:
21
22 >>> mapa = pilas.actores.MapaTiled('untitled2.tmx')
23
24 Tiled trabaja con capas, así que cuando pilas carga las capas las interpreta
25 de la siguiente manera:
26
27 - La capa 0 define los bloques no sólidos, generalmente fondos o decoración.
28 - La capa 1 define bloques sólidos, útiles para hacer suelos o paredes.
29 - Las siguientes capas solo se almacenan, pero no se dibujan. Se pueden acceder con ``mapa.capas``.
30 """
31
32 - def __init__(self, ruta_mapa, x=0, y=0, restitucion=0.56):
37
39 """Retorna el ancho de un bloque del mapa"""
40 return self.ancho_cuadro
41
43 """Retorna el alto de un bloque del mapa"""
44 return self.alto_cuadro
45
66
68 nodo = makeRootNode(archivo)
69 layers = nodo.getChild('map').getChildren('layer')
70
71 if len(layers) == 0:
72 raise Exception("Debe tener al menos una capa (layer).")
73
74 self.capas = {}
75
76
77 bloques = self._pintar_bloques(layers[0], solidos=False)
78 self.capas[0] = bloques
79
80
81 if len(layers) > 1:
82 bloques = self._pintar_bloques(layers[1], solidos=True)
83 self.capas[1] = bloques
84
85
86
87 for (indice, layer) in enumerate(layers[2:]):
88 self.capas[indice + 2] = self._convertir_capa_en_bloques_enteros(layer)
89
91 """Genera actores que representan los bloques del escenario.
92
93 Retorna una lista de los bloques convertidos a numeros.
94 """
95
96
97 bloques = self._convertir_capa_en_bloques_enteros(capa)
98
99 for (y, fila) in enumerate(bloques):
100 for (x, bloque) in enumerate(fila):
101 if bloque:
102 self.pintar_bloque(y, x, bloque -1, solidos)
103
104 return bloques
105
107 datos = capa.getChild('data').getData()
108 return [[int(x) for x in x.split(',') if x] for x in datos.split()]
109
110
111
113 """Representa un nodo XML."""
114
116 """Construstor del nodo desde un elemento dom.
117
118 :param domElement: Elemento de DOM a convertir.
119 """
120 self.elem = domElement
121
123 """Extrae datos desde un nodo del DOM."""
124 for child in self.elem.childNodes:
125 if child.nodeType == child.TEXT_NODE:
126 return str(child.data)
127 return None
128
130 """Returns the value of the attribute having the specified name."""
131 return str(self.elem.attributes[name].value)
132
134 """Retorna el primer nodo hijo que contenga el tag especificado."""
135 return XmlNode(self.elem.getElementsByTagName(tag)[0])
136
138 """Retorna una lista de todos los nodos hijos que tienen el tag especificado."""
139 return [XmlNode(x) for x in self.elem.getElementsByTagName(tag)]
140
142 """Genera un nodo XML dado un archivo.
143
144 :param xmlFileName: El nombre del archivo .xml"""
145 return XmlNode(minidom.parse(xmlFileName))
146