1
2
3
4
5
6
7
8
9 import math
10 import pilas
11
13 "Representa un comportamiento (estrategia) que se puede anexar a un actor."
14
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
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
31
32
33 -class Girar(Comportamiento):
34 "Hace girar constantemente al actor respecto de su eje de forma relativa."
35
37 self.delta = delta
38
39 if delta > 0:
40 self.velocidad = velocidad
41 else:
42 self.velocidad = -velocidad
43
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
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
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
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
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
89 self.receptor.y = self.suelo
90 if self.cuando_termina:
91 self.cuando_termina()
92 return True
93
94
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
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
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
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
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
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