Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/pilas/actores/nave.py
blob: b2ac3bba6255fee3678c00b945cad9ae2536b4fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# -*- 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 pilas
from pilas.actores import Animacion
import math

class Nave(Animacion):
    "Representa una nave que puede disparar."

    def __init__(self, x=0, y=0, velocidad=2):
        self.velocidad = velocidad
        grilla = pilas.imagenes.cargar_grilla("nave.png", 2)
        Animacion.__init__(self, grilla, ciclica=True, x=x, y=y)
        self.radio_de_colision = 20
        self.aprender(pilas.habilidades.PuedeExplotar)
        self.contador_frecuencia_disparo = 0
        self.disparos = []

    def actualizar(self):
        Animacion.actualizar(self)

        if pilas.mundo.control.izquierda:
            self.rotacion -= self.velocidad
        elif pilas.mundo.control.derecha:
            self.rotacion += self.velocidad

        if pilas.mundo.control.arriba:
            self.avanzar()

        self.contador_frecuencia_disparo += 1

        if pilas.mundo.control.boton:
            if self.contador_frecuencia_disparo > 10:
                self.contador_frecuencia_disparo = 0
                self.disparar()
        
        self.eliminar_disparos_innecesarios()

    def eliminar_disparos_innecesarios(self):
        for d in list(self.disparos):
            if d.x < -320 or d.x > 320 or d.y < -240 or d.y > 240:
                d.eliminar()
                self.disparos.remove(d)


    def disparar(self):
        "Hace que la nave dispare."
        disparo_nuevo = pilas.actores.Disparo(self.x, self.y, self.rotacion, 4)
        self.disparos.append(disparo_nuevo)

    def avanzar(self):
        "Hace avanzar la nave en direccion a su angulo."
        rotacion_en_radianes = math.radians(-self.rotacion + 90)
        dx = math.cos(rotacion_en_radianes) * self.velocidad
        dy = math.sin(rotacion_en_radianes) * self.velocidad
        self.x += dx
        self.y += dy

    def definir_enemigos(self, grupo, cuando_elimina_enemigo=None):
        """hace que una nave tenga como enemigos a todos los actores del grupo.

        El argumento cuando_elimina_enemigo tiene que ser una funcion que
        se ejecutara cuando se produzca la colision."""
        self.cuando_elimina_enemigo = cuando_elimina_enemigo
        pilas.mundo.colisiones.agregar(self.disparos, grupo, self.hacer_explotar_al_enemigo)

    def hacer_explotar_al_enemigo(self, mi_disparo, el_enemigo):
        "Es el método que se invoca cuando se produce una colisión 'tiro <-> enemigo'"
        mi_disparo.eliminar()
        el_enemigo.eliminar()

        if self.cuando_elimina_enemigo:
            self.cuando_elimina_enemigo()