Package pilas :: Module colisiones
[hide private]
[frames] | no frames]

Source Code for Module pilas.colisiones

  1  # -*- encoding: utf-8 -*- 
  2  # pilas engine - a video game framework. 
  3  # 
  4  # copyright 2010 - hugo ruscitti 
  5  # license: lgplv3 (see http://www.gnu.org/licenses/lgpl.html) 
  6  # 
  7  # website - http://www.pilas-engine.com.ar 
  8   
  9  import utils 
 10  import pilas 
 11   
12 -class Colisiones:
13 "Administra todas las colisiones entre actores." 14
15 - def __init__(self):
16 self.colisiones = []
17
18 - def verificar_colisiones(self):
19 for x in self.colisiones: 20 self._verificar_colisiones_en_tupla(x)
21
22 - def _verificar_colisiones_en_tupla(self, tupla):
23 "Toma dos grupos de actores y analiza colisiones entre ellos." 24 (grupo_a, grupo_b, funcion_a_llamar) = tupla 25 26 for a in grupo_a: 27 for b in grupo_b: 28 try: 29 if id(a) != id(b) and utils.colisionan(a, b): 30 funcion_a_llamar(a, b) 31 32 # verifica si alguno de los dos objetos muere en la colision. 33 if a not in pilas.escena_actual().actores: 34 if a in grupo_a: 35 list.remove(grupo_a, a) 36 37 if b not in pilas.escena_actual().actores: 38 if b in grupo_b: 39 list.remove(grupo_b, b) 40 except Exception as e: 41 list.remove(grupo_a, a) 42 raise e
43
44 - def verificar_colisiones_fisicas(self, id_actor_a, id_actor_b):
45 for x in self.colisiones: 46 self._verificar_colisiones_fisicas_en_tupla(x, id_actor_a, id_actor_b)
47
48 - def _verificar_colisiones_fisicas_en_tupla(self, tupla, id_actor_a, id_actor_b):
49 "Toma dos grupos de actores y analiza colisiones entre ellos." 50 (grupo_a, grupo_b, funcion_a_llamar) = tupla 51 52 for a in grupo_a: 53 for b in grupo_b: 54 try: 55 if self._es_objeto_fisico_con_actor_asociado(a): 56 a_id = a.figura.id 57 else: 58 a_id = a.id 59 60 if self._es_objeto_fisico_con_actor_asociado(b): 61 b_id = b.figura.id 62 else: 63 b_id = b.id 64 65 if a_id == id_actor_a and b_id == id_actor_b: 66 funcion_a_llamar(a, b) 67 68 # verifica si alguno de los dos objetos muere en la colision. 69 if (self._es_objeto_fisico_con_actor_asociado(a)): 70 if a not in pilas.escena_actual().actores: 71 if a in grupo_a: 72 list.remove(grupo_a, a) 73 74 if (self._es_objeto_fisico_con_actor_asociado(b)): 75 if b not in pilas.escena_actual().actores: 76 if b in grupo_b: 77 list.remove(grupo_b, b) 78 79 except Exception as e: 80 list.remove(grupo_a, a) 81 raise e
82 83
84 - def _es_objeto_fisico_con_actor_asociado(self, objeto):
85 # Comprobamos si el objeto tiene la propiedad "figura" establecida. 86 # Esta propiedad se establece en la Habilidad de Imitar. 87 return hasattr(objeto, 'figura')
88
89 - def agregar(self, grupo_a, grupo_b, funcion_a_llamar):
90 "Agrega dos listas de actores para analizar colisiones." 91 92 if not isinstance(grupo_a, list): 93 grupo_a = [grupo_a] 94 95 if not isinstance(grupo_b, list): 96 grupo_b = [grupo_b] 97 98 self.colisiones.append((grupo_a, grupo_b, funcion_a_llamar))
99
100 - def eliminar_colisiones_con_actor(self, actor):
101 102 for x in self.colisiones: 103 104 grupo_a = x[0] 105 grupo_b = x[1] 106 fucion_a_llamar = x[2] 107 108 if actor in grupo_a: 109 # Si solo estaba el actor en este grupo eliminamos la colision. 110 if len(grupo_a) == 1: 111 self.colisiones.remove(x) 112 else: 113 # Si hay mas de un actore eliminamos el actor de la lista. 114 grupo_a.remove(x) 115 break 116 117 if actor in grupo_b: 118 # Si solo estaba el actor en este grupo eliminamos la colision. 119 if len(grupo_b) == 1: 120 self.colisiones.remove(x) 121 else: 122 # Si hay mas de un actore eliminamos el actor de la lista. 123 grupo_b.remove(x) 124 break
125
126 - def obtener_colisiones(self, actor, grupo_de_actores):
127 "Retorna una lista de los actores que colisionan con uno en particular." 128 129 lista_de_colisiones = [] 130 131 for a in grupo_de_actores: 132 if id(actor) != id(a) and utils.colisionan(actor, a): 133 lista_de_colisiones.append(a) 134 135 return lista_de_colisiones
136