pilas.municion

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

# Source Code for Module pilas.municion

      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  import math
      9
     10  from pilas.actores.proyectil import Bala
     11  from pilas.actores.proyectil import Misil
     12
     13
     14 -class Municion(object):
     15      """ Clase base para representar un conjunto de proyectiles que pueden
     16      ser disparados mediante la habilidad de Disparar.
     17      """
     18
     19 -    def __init__(self):
     20          self._proyectiles = []
     21
     22 -    def disparar(self, x, y, rotacion, angulo_de_movimiento, offset_disparo_x, offset_disparo_y):
     23          """ Este método debe ser sobreescrito."""
     24          raise Exception("No ha sobreescrito el metodo disparar.")
     25
     26 -    def agregar_proyectil(self, proyectil):
     27          """ Agrega un proyectil a la lista de proyectiles de la munición.
     28
     29          :param proyectil: Actor que se añadirá a la lista de proyectiles."""
     30          self._proyectiles.append(proyectil)
     31
     32 -    def get_proyectiles(self):
     33          """ Obtiene los proyectiles que acaba de disparar la munición. """
     34          return self._proyectiles
     35
     36      proyectiles = property(get_proyectiles, None, doc="Obtiene los proyectiles de la munición.")
     37
     38
     39 -class BalaDoble(Municion):
     40      """ Munición que dispara 2 balas paralelas. """
     41
     42 -    def __init__(self, separacion=10):
     43          """
     44          Construye la Munición.
     45
     46          :param separacion: Separación en pixeles entre los dos proyectiles.
     47          """
     48
     49          Municion.__init__(self)
     50          self.separacion = separacion
     51
     52 -    def disparar(self, x, y, rotacion, angulo_de_movimiento, offset_disparo_x, offset_disparo_y):
     53          """Realiza un disparo.
     54
     55          :param x: Posición horizontal desde donde comenzará a disparar.
     56          :param y: Posición vertical desde donde comenzará a disparar.
     57          :param angulo_de_movimiento: Angulo de inclinación inicial del disparo.
     58          :param offset_disparo_x: Desplazamiento del disparo horizontal.
     59          :param offset_disparo_y: Desplazamiento del disparo vertical.
     60          """
     61          angulo = math.radians(angulo_de_movimiento)
     62
     63          self.agregar_proyectil(Bala(x=x + math.cos(angulo) * self.separacion,
     64                                      y=y - math.sin(angulo) * self.separacion,
     65                                      angulo_de_movimiento=angulo_de_movimiento,
     66                                      rotacion=rotacion))
     67
     68          self.agregar_proyectil(Bala(x=x - math.cos(angulo) * self.separacion,
     69                                      y=y + math.sin(angulo) * self.separacion,
     70                                      angulo_de_movimiento=angulo_de_movimiento,
     71                                      rotacion=rotacion))
     72
     73
     74 -class BalasDoblesDesviadas(Municion):
     75      """ Munición que dispara 2 balas en angulos distintos. """
     76
     77 -    def __init__(self, angulo_desvio=5):
     78          """
     79          Construye la Munición.
     80
     81          :param angulo_desvio: Angulo que formarán los dos proyectiles.
     82          """
     83
     84          Municion.__init__(self)
     85          self.angulo_desvio = angulo_desvio
     86
     87 -    def disparar(self, x, y, rotacion, angulo_de_movimiento, offset_disparo_x, offset_disparo_y):
     88          """Realiza un disparo.
     89
     90          :param x: Posición horizontal desde donde comenzará a disparar.
     91          :param y: Posición vertical desde donde comenzará a disparar.
     92          :param angulo_de_movimiento: Angulo de inclinación inicial del disparo.
     93          :param offset_disparo_x: Desplazamiento del disparo horizontal.
     94          :param offset_disparo_y: Desplazamiento del disparo vertical.
     95          """
     96
     97          self.agregar_proyectil(Bala(x=x,
     98                                    y=y,
     99                                    angulo_de_movimiento=angulo_de_movimiento+self.angulo_desvio,
    100                                    rotacion=rotacion))
    101
    102          self.agregar_proyectil(Bala(x=x,
    103                                    y=y,
    104                                    angulo_de_movimiento=angulo_de_movimiento-self.angulo_desvio,
    105                                    rotacion=rotacion))
    106
    107
    108 -class MisilDoble(Municion):
    109      """ Munición que dispara 2 misiles paralelos que aceleran poco a poco. """
    110
    111 -    def __init__(self, separacion=10):
    112          """
    113          Construye la Munición.
    114
    115          :param separacion: Separación en pixeles entre los dos proyectiles.
    116          """
    117          Municion.__init__(self)
    118          self.separacion = separacion
    119
    120 -    def disparar(self, x, y, rotacion, angulo_de_movimiento, offset_disparo_x, offset_disparo_y):
    121          """Realiza un disparo.
    122
    123          :param x: Posición horizontal desde donde comenzará a disparar.
    124          :param y: Posición vertical desde donde comenzará a disparar.
    125          :param angulo_de_movimiento: Angulo de inclinación inicial del disparo.
    126          :param offset_disparo_x: Desplazamiento del disparo horizontal.
    127          :param offset_disparo_y: Desplazamiento del disparo vertical.
    128          """
    129
    130          angulo = math.radians(angulo_de_movimiento)
    131
    132          self.agregar_proyectil(Misil(x=x + math.cos(angulo) * self.separacion,
    133                                      y=y - math.sin(angulo) * self.separacion,
    134                                      angulo_de_movimiento=angulo_de_movimiento,
    135                                      rotacion=rotacion))
    136
    137          self.agregar_proyectil(Misil(x=x - math.cos(angulo) * self.separacion,
    138                                      y=y + math.sin(angulo) * self.separacion,
    139                                      angulo_de_movimiento=angulo_de_movimiento,
    140                                      rotacion=rotacion))
    141