pilas.comportamientos

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
    173 -    def mover_respecto_angulo_movimiento(self):
    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