1
2
3
4
5
6
7
8
9 import random
10 import pilas
11 import math
12
14 """Representa una habilidad que un actor puede aprender."""
15
17 self.receptor = receptor
18
21
24
25
27 """Le indica al actor que rebote y colisiones como una pelota.
28
29 >>> un_actor = pilas.actores.Aceituna()
30 >>> un_actor.aprender(pilas.habilidades.RebotarComoPelota)
31 """
32
44
47
50
53
54
56 """Le indica al actor que rebote y colisiones como una caja cuadrada.
57
58 >>> un_actor = pilas.actores.Aceituna()
59 >>> un_actor.aprender(pilas.habilidades.RebotarComoPelota)
60 """
61
72
75
76
78 """Le indica al actor que colisione como una pelota, pero que no rebote.
79
80 >>> un_actor = pilas.actores.Aceituna()
81 >>> un_actor.aprender(pilas.habilidades.ColisionableComoPelota)
82 """
83
86
88 self.figura.body.position.x = self.receptor.x
89 self.figura.body.position.y = self.receptor.y
90
93
94
96 "Hace que un actor siga la posición del mouse en todo momento."
97
101
102 - def mover(self, evento):
105
106
108 """"Hace que un actor rote con respecto a la posicion del mouse.
109
110 Ejemplo:
111
112 >>> actor.aprender(pilas.habilidades.RotarConMouse,
113 lado_seguimiento=pilas.habilidades.RotarConMouse.ABAJO)
114
115 """
116 ARRIBA = 270
117 ABAJO = 90
118 IZQUIERDA = 180
119 DERECHA = 0
120
134
138
139 - def rotar(self, evento):
140
141 receptor = (self.receptor.x, self.receptor.y)
142 raton = (self.raton_x, self.raton_y)
143
144 angulo = pilas.utils.obtener_angulo_entre(receptor, raton)
145
146 self.receptor.rotacion = -(angulo) - self.lado_seguimiento
147
148
150 """"Hace que un actor rote para mirar hacia otro actor.
151 """
152 ARRIBA = 270
153 ABAJO = 90
154 IZQUIERDA = 180
155 DERECHA = 0
156
157 - def __init__(self, receptor, actor_a_seguir, lado_seguimiento=ARRIBA):
158 """Inicializa la habilidad.
159
160 :param receptor: Actor que aprenderá la habilidad.
161 :param actor_a_seguir : Actor al que se desea seguir con la mirada.
162 :param lado_seguimiento: Establece el lado del actor que rotará para estar encarado hacia el actor que desea vigilar.
163 """
164 Habilidad.__init__(self, receptor)
165 pilas.escena_actual().actualizar.conectar(self.rotar)
166 self.lado_seguimiento = lado_seguimiento
167
168 self.actor_a_seguir = actor_a_seguir
169
170 - def rotar(self, evento):
171 receptor = (self.receptor.x, self.receptor.y)
172 actor_a_seguir = (self.actor_a_seguir.x, self.actor_a_seguir.y)
173
174 angulo = pilas.utils.obtener_angulo_entre(receptor, actor_a_seguir)
175
176 self.receptor.rotacion = -(angulo) - self.lado_seguimiento
177
178
180 "Permite cambiar el tamaño de un actor usando la ruedita scroll del mouse."
181
185
188
189
191 "Hace que el actor se coloque la posición del cursor cuando se hace click."
192
196
201
202
204 """Hace que un objeto se pueda arrastrar con el puntero del mouse.
205
206 Cuando comienza a mover al actor se llama al metodo ''comienza_a_arrastrar''
207 y cuando termina llama a ''termina_de_arrastrar''. Estos nombres
208 de metodos se llaman para que puedas personalizar estos eventos, dado
209 que puedes usar polimorfismo para redefinir el comportamiento
210 de estos dos metodos. Observa un ejemplo de esto en
211 el ejemplo ``pilas.ejemplos.Piezas``.
212
213 """
214
218
226
234
240
244
248
250 return hasattr(self.receptor, 'figura')
251
252
254 """Hace que un actor cambie de posición con pulsar el teclado."""
255 CUATRO_DIRECCIONES = 4
256 OCHO_DIRECCIONES = 8
257
258
259 - def __init__(self, receptor, control=None, direcciones=OCHO_DIRECCIONES, velocidad_maxima=4,
260 aceleracion=1, deceleracion=0.1, con_rotacion=False, velocidad_rotacion=1, marcha_atras=True):
261 """Inicializa la habilidad.
262
263 :param receptor: Referencia al actor que aprenderá la habilidad.
264 :param control: Control al que va a responder para mover el Actor.
265 :param direcciones: Establece si puede mover en cualquier direccion o unicamente en 4 direcciones arriba, abajo, izquierda y derecha. El parametro con_rotacion establece las direcciones a OCHO_DIRECCIONES siempre.
266 :param velocidad_maxima: Velocidad maxima en pixeles a la que se moverá el Actor.
267 :param aceleracion: Indica lo rapido que acelera el actor hasta su velocidad máxima.
268 :param deceleracion: Indica lo rapido que decelera el actor hasta parar.
269 :param con_rotacion: Si deseas que el actor rote pulsando las teclas de izquierda y derecha.
270 :param velocidad_rotacion: Indica lo rapido que rota un actor sobre si mismo.
271 :param marcha_atras: Posibilidad de ir hacia atrás. (True o False)
272 """
273
274 Habilidad.__init__(self, receptor)
275 pilas.escena_actual().actualizar.conectar(self.on_key_press)
276
277 if control == None:
278 self.control = self.receptor.escena.control
279 else:
280 self.control = control
281
282 self.direcciones = direcciones
283
284 self.velocidad = 0
285 self.deceleracion = deceleracion
286 self._velocidad_maxima = velocidad_maxima
287 self._aceleracion = aceleracion
288 self.con_rotacion = con_rotacion
289 self.velocidad_rotacion = velocidad_rotacion
290 self.marcha_atras = marcha_atras
291
293 self._velocidad_maxima = velocidad
294
296 return self._velocidad_maxima
297
299 return self._aceleracion
300
303
304 velocidad_maxima = property(get_velocidad_maxima, set_velocidad_maxima, doc="Define la velocidad maxima.")
305 aceleracion = property(get_aceleracion, set_aceleracion, doc="Define la acelaracion.")
306
357
359 if self.velocidad > self.deceleracion:
360 self.velocidad -= self.deceleracion
361 elif self.velocidad < -self.deceleracion:
362 self.velocidad += self.deceleracion
363 else:
364 self.velocidad = 0
365
373
374
376 "Hace que un actor se mueva como un coche."
377
378 - def __init__(self, receptor, control=None, velocidad_maxima=4,
379 aceleracion=0.06, deceleracion=0.1, rozamiento=0):
389
391 self._rozamiento = nivel_rozamiento
392 self.velocidad_maxima = self._velocidad_maxima_aux - self._rozamiento
393
395 return self._rozamiento
396
398 self._velocidad_maxima = velocidad
399 self._velocidad_maxima_aux = self._velocidad_maxima
400
403
404 rozamiento = property(get_rozamiento, set_rozamiento, doc="Define el rozamiento del coche con la superficie por donde circula.")
405
406
408 "Hace que un actor se pueda hacer explotar invocando al metodo eliminar."
409
413
420
422 """Hace que un actor siempre esté en el centro de la camara y la desplace
423 cuando el actor se desplaza."""
424
427
431
432
434 """Se asegura de que el actor regrese a la pantalla si sale o que no
435 salga en nigún momento de la pantalla.
436
437 Si el actor sale por la derecha de la pantalla, entonces regresa
438 por la izquiera. Si sale por arriba regresa por abajo y asi...
439
440 """
441 - def __init__(self, receptor, permitir_salida=True):
442 """Inicializa la habilidad.
443
444 :param receptor: El actor que aprenderá la habilidad.
445 :param permitir_salida: Valor booleano que establece si el actor puede salir por los lados de la ventana y regresar por el lado opuesto. Si se establece a False, el actor no puede salir de la ventana en ningún momento.
446 """
447 Habilidad.__init__(self, receptor)
448 self.ancho, self.alto = pilas.mundo.motor.obtener_area()
449 self.permitir_salida = permitir_salida
450
474
475
499
500
502 "Logra que el actor imite las propiedades de otro."
503
504 - def __init__(self, receptor, objeto_a_imitar, con_rotacion=True):
505 """Inicializa la habilidad.
506
507 :param receptor: Referencia al actor.
508 :param objeto_a_imitar: Cualquier objeto con atributos rotacion, x e y (por ejemplo otro actor).
509 :param con_rotacion: Si debe imitar o no la rotación.
510 """
511 Habilidad.__init__(self, receptor)
512 self.objeto_a_imitar = objeto_a_imitar
513
514
515
516
517 receptor.id = objeto_a_imitar.id
518
519
520
521
522
523 receptor.figura = objeto_a_imitar
524
525 self.con_rotacion = con_rotacion
526
528 self.receptor.x = self.objeto_a_imitar.x
529 self.receptor.y = self.objeto_a_imitar.y
530 if (self.con_rotacion):
531 self.receptor.rotacion = self.objeto_a_imitar.rotacion
532
536
537
539 """Establece la habilidad de poder disparar un Actor o un objeto de tipo
540 pilas.municion.Municion."""
541
542 - def __init__(self, receptor,
543 municion = pilas.actores.Bala,
544 parametros_municion = {},
545 grupo_enemigos=[],
546 cuando_elimina_enemigo=None,
547 frecuencia_de_disparo=10,
548 angulo_salida_disparo=0,
549 offset_disparo=(0,0),
550 offset_origen_actor=(0,0),
551 cuando_dispara=None,
552 escala=1):
553 """
554 Construye la habilidad.
555
556 :param municion: Municion o Actor que se disparará.
557 :param grupo_enemigos: Actores que son considerados enemigos y con los que colisionará la munición disparada.
558 :param cuando_elimina_enemigo: Método que será llamado cuando se produzca un impacto con un enemigo.
559 :param frecuencia_de_disparo: El número de disparos por segundo que realizará.
560 :param angulo_salida_disparo: Especifica el angulo por donde saldrá el disparo efectuado por el Actor.
561 :param offset_disparo: Separación en pixeles (x,y) del disparo con respecto al centro del Actor.
562 :param offset_origen_actor: Si el Actor no tiene su origen en el centro, con este parametro podremos colocar correctamente el disparo.
563 :param cuando_dispara: Metodo que será llamado cuando se produzca un disparo.
564 :param escala: Escala de los actores que serán disparados.
565
566 :example:
567
568 >>> mono = pilas.actores.Mono()
569 >>> mono.aprender(pilas.habilidades.Disparar,
570 >>> municion=pilas.actores.proyectil.Bala,
571 >>> grupo_enemigos=enemigos,
572 >>> cuando_elimina_enemigo=eliminar_enemigo)
573
574 ..
575 """
576
577 Habilidad.__init__(self, receptor)
578 self.receptor = receptor
579
580 self._municion = municion
581 self.parametros_municion = parametros_municion
582
583 self.offset_disparo_x = offset_disparo[0]
584 self.offset_disparo_y = offset_disparo[1]
585
586 self.offset_origen_actor_x = offset_origen_actor[0]
587 self.offset_origen_actor_y = offset_origen_actor[1]
588
589 self.angulo_salida_disparo = angulo_salida_disparo
590 self.frecuencia_de_disparo = frecuencia_de_disparo
591 self.contador_frecuencia_disparo = 0
592 self.proyectiles = []
593
594 self.grupo_enemigos = grupo_enemigos
595
596 self.definir_colision(self.grupo_enemigos, cuando_elimina_enemigo)
597
598 self.cuando_dispara = cuando_dispara
599
600 self.escala = escala
601
603 self._frecuencia_de_disparo = 60 / valor
604
606 return self._frecuencia_de_disparo
607
609 self._municion = valor
610 self.parametros_municion = {}
611
613 return self._municion
614
615 frecuencia_de_disparo = property(get_frecuencia_de_disparo, set_frecuencia_de_disparo, doc="Número de disparos por segundo.")
616 municion = property(get_municion, set_municion, doc="Establece el tipo de municion que dispara.")
617
631
636
642
644 rotacion_en_radianes = math.radians(-proyectil.rotacion)
645 dx = math.cos(rotacion_en_radianes)
646 dy = math.sin(rotacion_en_radianes)
647
648 proyectil.x += dx * offset_x
649 proyectil.y += dy * offset_y
650
652 if (self.receptor.espejado):
653 offset_origen_actor_x = -self.offset_origen_actor_x
654 else:
655 offset_origen_actor_x = self.offset_origen_actor_x
656
657 if issubclass(self.municion, pilas.municion.Municion):
658
659 objeto_a_disparar = self.municion(**self.parametros_municion)
660
661 objeto_a_disparar.disparar(x=self.receptor.x+offset_origen_actor_x,
662 y=self.receptor.y+self.offset_origen_actor_y,
663 angulo_de_movimiento=self.receptor.rotacion + -(self.angulo_salida_disparo),
664 rotacion=self.receptor.rotacion - 90,
665 offset_disparo_x=self.offset_disparo_x,
666 offset_disparo_y=self.offset_disparo_y)
667
668 for disparo in objeto_a_disparar.proyectiles:
669 self._agregar_disparo(disparo)
670
671 elif issubclass(self.municion, pilas.actores.Actor):
672
673 objeto_a_disparar = self.municion(x=self.receptor.x+offset_origen_actor_x,
674 y=self.receptor.y+self.offset_origen_actor_y,
675 rotacion=self.receptor.rotacion - 90,
676 angulo_de_movimiento=self.receptor.rotacion + -(self.angulo_salida_disparo))
677
678 self._agregar_disparo(objeto_a_disparar)
679
680 else:
681 raise "No se puede disparar este objeto."
682
683 if self.cuando_dispara:
684 self.cuando_dispara()
685
686
689
692
693
695 """Establece la habilidad de poder disparar un Actor o un objeto de tipo
696 pilas.municion.Municion pulsando el boton izquierdo del ratón."""
697
703
705 if evento.boton == 1:
706 self.boton_pulsado = True
707
709 if evento.boton == 1:
710 self.boton_pulsado = False
711
713 return self.boton_pulsado
714