pilas.colisiones

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