Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/pilas/comportamientos.py
diff options
context:
space:
mode:
Diffstat (limited to 'pilas/comportamientos.py')
-rw-r--r--pilas/comportamientos.py107
1 files changed, 107 insertions, 0 deletions
diff --git a/pilas/comportamientos.py b/pilas/comportamientos.py
new file mode 100644
index 0000000..7fb486e
--- /dev/null
+++ b/pilas/comportamientos.py
@@ -0,0 +1,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