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
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
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):
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