pilas.estudiante

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

# Source Code for Module pilas.estudiante

      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 pilas.utils
     10
     11 -class Estudiante:
     12      """Componente que permite a los actores aprender habilidades o realizar comportamientos."""
     13
     14 -    def __init__(self):
     15          """Inicializa el componente."""
     16          self._habilidades = []
     17          self.comportamiento_actual = None
     18          self.comportamientos = []
     19          self.repetir_comportamientos_por_siempre = False
     20          self.habilidades = ProxyHabilidades(self._habilidades)
     21
     22 -    def aprender(self, classname, *k, **w):
     23          """Comienza a realizar una habilidad indicada por parametros.
     24
     25          :param classname: Referencia a la clase que representa la habilidad.
     26          """
     27          if self.tiene_habilidad(classname):
     28              self.eliminar_habilidad(classname)
     29              self.agregar_habilidad(classname, *k, **w)
     30          else:
     31              self.agregar_habilidad(classname, *k, **w)
     32
     33 -    def agregar_habilidad(self, classname, *k, **w):
     34          """Agrega una habilidad a la lista de cosas que puede hacer un actor.
     35
     36          :param classname: Referencia a la clase que representa la habilidad.
     37          """
     38          objeto_habilidad = classname(self, *k, **w)
     39          self._habilidades.append(objeto_habilidad)
     40
     41 -    def eliminar_habilidad(self, classname):
     42          """ Elimina una habilidad asociada a un Actor.
     43
     44          :param classname: Referencia a la clase que representa la habilidad.
     45          """
     46          habilidad = self.obtener_habilidad(classname)
     47
     48          if habilidad:
     49              self._habilidades.remove(habilidad)
     50
     51 -    def tiene_habilidad(self, classname):
     52          """Comprueba si el actor ha aprendido la habilidad indicada.
     53
     54          :param classname: Referencia a la clase que representa la habilidad.
     55          """
     56          habilidades_actuales = [habilidad.__class__ for habilidad in self._habilidades]
     57          return (classname in habilidades_actuales)
     58
     59 -    def tiene_comportamiento(self, classname):
     60          """Comprueba si el actor tiene el comportamiento indicado.
     61
     62          :param classname: Referencia a la clase que representa el comportamiento.
     63          """
     64          comportamientos_actuales = [comportamiento.__class__ for comportamiento in self.comportamientos]
     65          return (classname in comportamientos_actuales)
     66
     67 -    def obtener_habilidad(self, classname):
     68          """Obtiene la habilidad asociada a un Actor.
     69
     70          :param classname: Referencia a la clase que representa la habilidad.
     71          :return: Devuelve None si no se encontró.
     72          """
     73          su_habilidad = None
     74
     75          for habilidad in self._habilidades:
     76              if habilidad.__class__ == classname:
     77                  su_habilidad = habilidad
     78                  break
     79
     80          return su_habilidad
     81
     82 -    def hacer_luego(self, comportamiento, repetir_por_siempre=False):
     83          """Define un nuevo comportamiento para realizar al final.
     84
     85          Los actores pueden tener una cadena de comportamientos, este
     86          metodo agrega el comportamiento al final de la cadena.
     87
     88          :param comportamiento: Referencia al comportamiento.
     89          :param repetir_por_siempre: Si el comportamiento se volverá a ejecutar luego de terminar.
     90          """
     91
     92          self.comportamientos.append(comportamiento)
     93          self.repetir_comportamientos_por_siempre = repetir_por_siempre
     94
     95 -    def hacer(self, comportamiento):
     96          """Define el comportamiento para el actor de manera inmediata.
     97
     98          :param comportamiento: Referencia al comportamiento a realizar.
     99          """
    100          self.comportamientos.append(comportamiento)
    101          self._adoptar_el_siguiente_comportamiento()
    102
    103 -    def eliminar_habilidades(self):
    104          "Elimina todas las habilidades asociadas al actor."
    105          for h in self._habilidades:
    106              h.eliminar()
    107
    108 -    def eliminar_comportamientos(self):
    109          "Elimina todos los comportamientos que tiene que hacer el actor."
    110          for c in self.comportamientos:
    111              c.eliminar()
    112
    113 -    def actualizar_habilidades(self):
    114          "Realiza una actualización sobre todas las habilidades."
    115          for h in self._habilidades:
    116              h.actualizar()
    117
    118 -    def actualizar_comportamientos(self):
    119          "Actualiza la lista de comportamientos"
    120          termina = None
    121
    122          if self.comportamiento_actual:
    123              termina = self.comportamiento_actual.actualizar()
    124
    125              if termina:
    126                  if self.repetir_comportamientos_por_siempre:
    127                      self.comportamientos.append(self.comportamiento_actual)
    128                  self._adoptar_el_siguiente_comportamiento()
    129          else:
    130              self._adoptar_el_siguiente_comportamiento()
    131
    132 -    def _adoptar_el_siguiente_comportamiento(self):
    133          if self.comportamientos:
    134              self.comportamiento_actual = self.comportamientos.pop(0)
    135              self.comportamiento_actual.iniciar(self)
    136          else:
    137              self.comportamiento_actual = None
    138
    139
    140 -class ProxyHabilidades(object):
    141      """Implementa un intermediario con todas las habilidades del Actor."""
    142
    143 -    def __init__(self, habilidades):
    144          self.habilidades = habilidades
    145
    146 -    def __getattr__(self, name):
    147          su_habilidad = None
    148
    149          for habilidad in self.habilidades:
    150              if habilidad.__class__.__name__ == name:
    151                  su_habilidad = habilidad
    152                  break
    153
    154          if not su_habilidad:
    155              raise Exception("El actor no tiene asignada la habilidad " + name +
    156                              ".\n No puede acceder mediante actor.habilidades." + name)
    157
    158          return su_habilidad
    159