1
2
3
4
5
6
7
8 import math
9
10 from pilas.actores.proyectil import Bala
11 from pilas.actores.proyectil import Misil
12
13
15 """ Clase base para representar un conjunto de proyectiles que pueden
16 ser disparados mediante la habilidad de Disparar.
17 """
18
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
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
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
40 """ Munición que dispara 2 balas paralelas. """
41
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
75 """ Munición que dispara 2 balas en angulos distintos. """
76
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
109 """ Munición que dispara 2 misiles paralelos que aceleran poco a poco. """
110
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