blob: 7fb486e85eed6a4cfad3953c21cdde89b0f3f2b3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
# -*- encoding: utf-8 -*-
# Pilas engine - A video game framework.
#
# Copyright 2010 - Hugo Ruscitti
# License: LGPLv3 (see http://www.gnu.org/licenses/lgpl.html)
#
# Website - http://www.pilas-engine.com.ar
import math
import pilas
class Comportamiento(object):
"Representa un comportamiento (estrategia) que se puede anexar a un actor."
def iniciar(self, receptor):
"Se invoca cuando se anexa el comportamiento a un actor."
self.receptor = receptor
def actualizar(self):
"""Actualiza el comportamiento en un instante dado.
Si este metodo retorna True entonces el actor dejará
de ejecutar este comportamiento."""
pass
def terminar(self):
pass
class Girar(Comportamiento):
"Hace girar constantemente al actor respecto de su eje de forma relativa."
def __init__(self, delta, velocidad):
self.delta = delta
if delta > 0:
self.velocidad = velocidad
else:
self.velocidad = -velocidad
def iniciar(self, receptor):
"Define el angulo inicial."
self.receptor = receptor
self.angulo_final = (receptor.rotacion + self.delta) % 360
def actualizar(self):
self.receptor.rotacion += self.velocidad
delta = abs(self.receptor.rotacion - self.angulo_final)
if delta <= abs(self.velocidad):
self.receptor.rotacion = self.angulo_final
return True
class Saltar(Comportamiento):
def __init__(self, velocidad_inicial=10):
self.velocidad_inicial = velocidad_inicial
def iniciar(self, receptor):
self.receptor = receptor
self.suelo = int(self.receptor.y)
self.velocidad = self.velocidad_inicial
def actualizar(self):
self.receptor.y += self.velocidad
self.velocidad -= 0.3
if self.receptor.y <= self.suelo:
self.velocidad_inicial /= 2.0
self.velocidad = self.velocidad_inicial
if self.velocidad_inicial <= 1:
# Si toca el suelo
self.receptor.y = self.suelo
return True
class Avanzar(Comportamiento):
"Desplaza al actor en la dirección y sentido indicado por una rotación."
def __init__(self, pasos, velocidad=5):
self.pasos = abs(pasos)
self.velocidad = velocidad
def iniciar(self, receptor):
self.receptor = receptor
rotacion_en_radianes = math.radians(-receptor.rotacion)
self.dx = math.cos(rotacion_en_radianes)
self.dy = math.sin(rotacion_en_radianes)
def actualizar(self):
salir = False
if self.pasos - self.velocidad < 0:
avance = self.pasos
salir = True
else:
avance = self.velocidad
self.pasos -= avance
self.receptor.x += self.dx * avance
self.receptor.y += self.dy * avance
if salir:
return True
|