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

Source Code for Module pilas.comportamientos

  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 math 
 10  import pilas 
 11   
12 -class Comportamiento(object):
13 "Representa un comportamiento (estrategia) que se puede anexar a un actor." 14
15 - def iniciar(self, receptor):
16 """Se invoca cuando se anexa el comportamiento a un actor. 17 18 :param receptor: El actor que comenzará a ejecutar este comportamiento. 19 """ 20 self.receptor = receptor
21
22 - def actualizar(self):
23 """Actualiza el comportamiento en un instante dado. 24 25 Si este metodo retorna True entonces el actor dejará 26 de ejecutar este comportamiento.""" 27 pass
28
29 - def terminar(self):
30 pass
31 32
33 -class Girar(Comportamiento):
34 "Hace girar constantemente al actor respecto de su eje de forma relativa." 35
36 - def __init__(self, delta, velocidad):
37 self.delta = delta 38 39 if delta > 0: 40 self.velocidad = velocidad 41 else: 42 self.velocidad = -velocidad
43
44 - def iniciar(self, receptor):
45 """Se invoca cuando se anexa el comportamiento a un actor. 46 47 :param receptor: El actor que comenzará a ejecutar este comportamiento. 48 """ 49 self.receptor = receptor 50 self.angulo_final = (receptor.rotacion + self.delta) % 360
51
52 - def actualizar(self):
53 self.receptor.rotacion += self.velocidad 54 55 delta = abs(self.receptor.rotacion - self.angulo_final) 56 57 if delta <= abs(self.velocidad): 58 self.receptor.rotacion = self.angulo_final 59 return True
60
61 -class Saltar(Comportamiento):
62 """Realiza un salto, cambiando los atributos 'y'.""" 63
64 - def __init__(self, velocidad_inicial=10, cuando_termina=None):
65 self.velocidad_inicial = velocidad_inicial 66 self.cuando_termina = cuando_termina 67 self.sonido_saltar = pilas.sonidos.cargar("saltar.wav")
68
69 - def iniciar(self, receptor):
70 """Se invoca cuando se anexa el comportamiento a un actor. 71 72 :param receptor: El actor que comenzará a ejecutar este comportamiento. 73 """ 74 self.receptor = receptor 75 self.suelo = int(self.receptor.y) 76 self.velocidad = self.velocidad_inicial 77 self.sonido_saltar.reproducir()
78
79 - def actualizar(self):
80 self.receptor.y += self.velocidad 81 self.velocidad -= 0.3 82 83 if self.receptor.y <= self.suelo: 84 self.velocidad_inicial /= 2.0 85 self.velocidad = self.velocidad_inicial 86 87 if self.velocidad_inicial <= 1: 88 # Si toca el suelo 89 self.receptor.y = self.suelo 90 if self.cuando_termina: 91 self.cuando_termina() 92 return True
93 94
95 -class Avanzar(Comportamiento):
96 "Desplaza al actor en la dirección y sentido indicado por una rotación." 97
98 - def __init__(self, pasos=0, velocidad=5):
99 if pasos < 0: 100 self.pasos = abs(pasos) 101 else: 102 self.pasos = pasos 103 104 self.velocidad = velocidad
105
106 - def iniciar(self, receptor):
107 """Se invoca cuando se anexa el comportamiento a un actor. 108 109 :param receptor: El actor que comenzará a ejecutar este comportamiento. 110 """ 111 self.receptor = receptor 112 rotacion_en_radianes = math.radians(-receptor.rotacion) 113 self.dx = math.cos(rotacion_en_radianes) 114 self.dy = math.sin(rotacion_en_radianes)
115
116 - def actualizar(self):
117 salir = False 118 119 if self.pasos > 0: 120 if self.pasos - self.velocidad < 0: 121 avance = self.pasos 122 else: 123 avance = self.velocidad 124 self.pasos -= avance 125 self.receptor.x += self.dx * avance 126 self.receptor.y += self.dy * avance 127 else: 128 salir = True 129 130 if salir: 131 return True
132
133 -class Proyectil(Comportamiento):
134 "Hace que un actor se comporte como un proyectil." 135
136 - def __init__(self, velocidad_maxima=5, aceleracion=1, 137 angulo_de_movimiento=90, gravedad=0):
138 """ 139 Construye el comportamiento. 140 141 :param velocidad_maxima: Velocidad máxima que alcanzará el proyectil. 142 :param aceleracion: Valor entre 0 y 1 para indicar lo rápido que acelerará el actor. 143 :param angulo_de_movimiento: Angulo en que se moverá el Actor. 144 :param gravedad: La velocidad vertical con la que caerá el actor. 145 146 """ 147 self._velocidad_maxima = velocidad_maxima 148 self._aceleracion = aceleracion 149 self._angulo_de_movimiento = angulo_de_movimiento 150 self._gravedad = gravedad 151 self._vy = self._gravedad 152 153 if (self._aceleracion == 1): 154 self._velocidad = self._velocidad_maxima 155 else: 156 self._velocidad = 0
157
158 - def iniciar(self, receptor):
159 """Se invoca cuando se anexa el comportamiento a un actor. 160 161 :param receptor: El actor que comenzará a ejecutar este comportamiento. 162 """ 163 self.receptor = receptor
164
165 - def actualizar(self):
166 self._velocidad += self._aceleracion 167 168 if self._velocidad > self._velocidad_maxima: 169 self._velocidad = self._velocidad_maxima 170 171 self.mover_respecto_angulo_movimiento()
172
174 """Mueve el actor hacia adelante respecto a su angulo de movimiento.""" 175 rotacion_en_radianes = math.radians(-self._angulo_de_movimiento + 90) 176 dx = math.cos(rotacion_en_radianes) * self._velocidad 177 dy = math.sin(rotacion_en_radianes) * self._velocidad 178 self.receptor.x += dx 179 180 if self._gravedad > 0: 181 self.receptor.y += dy + self._vy 182 self._vy -= 0.1 183 else: 184 self.receptor.y += dy
185