Como crear mas de un disparo

Hola que tal,pues e utilizado la habilidad aprender a disparar y es muy buena porque tiene muchos parametros que te ayudan con el disparo,pero hay un problema y es que no sirven para crear 2 o mas disparos,entonces los he creado manualmente pero no encuentro niguna funcion que haga que vayan para distintos angulos cada disparo de la misma forma que hace el parametro angulo_salida_disparo.

La otra pergunta es que mis enemigos tambien disparan,pero me gustaria que sus disparos fueran directamente a mi nave,pero tampoco encuentro niguna funcion para esto,agradeceria que me explicarais una forma .Yo por ejemplo en bennugd uso esta formula para que el disparo vaya a mi nave => angle = fget_angle(x,y,nave.x,nave.y):sweat:

saludos amigo,
Coloca algo de lo que has hecho para ayudarte, para tener pistas. Mientras voy buscando ideas

Hola Alejandro,reconozco que pilas tienes muchos actores que te ayudan,pero cuando intentas hacer algo fuera de esos actores se complica bastante.

Te pongo lo que llevo hecho hasta ahora,puede que salga mal identado,explicame como hago para que salga bien identado para la proxima vez.

'''
Created on 8 feb. 2018

@author: Hokuto
'''
import pilasengine

pilas = pilasengine.iniciar()
#globales
puntos = 0
vida_jugador = 0

"""
*************************************************************
NIVELES DEL JUEGO
*************************************************************
"""
#creditos---------------------------------------------------
class Creditos(pilasengine.escenas.Escena):
    def iniciar(self):
        pilas.fondos.Color(pilas.colores.negro)
        self.contador = 0
        self.texto = pilas.actores.Texto(x=-50,y=10,magnitud=15,ancho=500)
        self.texto.color = "blanco"
        self.texto.texto = """creado por Hokuto-Hokuto Games con pilasengine
Este software esta bajo licencia de uso por parte de los usuarios bajo las siguientes condiciones: 
-El juego es gratuito y se puede descargar desde el foro de pilasengine.
-Prohibida su venta.
-Si se quiere distribuir en otra pagina que no sea el foro de pilasengine,
se puede hacer siempre y cuando se especifique por quien a sido creado,
en este caso por Hokuto-Hokuto Games.
Para cualquier contacto,podeis contactar conmigo en el foro de pilasengine.
Agradecimiento a la comunidad de pilasengine y especialmente a Hugo.
MEGA HOKUTO 6/02/2018 HOKUTO GAMES.
TODOS LOS DERECHOS RESERVADOS."""
    def actualizar(self):
        #pasar al menu
        self.contador += 1
        if self.contador > 60*10 or pilas.control.boton:
            self.contador = 0
            pilas.escenas.Menu()
#menu-------------------------------------------------------
class Menu(pilasengine.escenas.Escena):
    def iniciar(self):
        pilas.fondos.Espacio()
        self.texto = pilas.actores.Texto("JUGAR")
        self.texto.x = 0
        self.texto.y = 0
        self.texto.color = "amarillo"
        self.texto2 = pilas.actores.Texto("SALIR")
        self.texto2.x = 0
        self.texto2.y = -100
        self.texto2.color = "amarillo"
        self.texto3 = pilas.actores.Texto("MEGA HOKUTO",x=0,y=150,magnitud=50)
        self.texto3.color = "amarillo"
        self.texto4 = pilas.actores.Texto(x=-5,y=-200,ancho=600)
        self.texto4.texto = "Creado por Hokuto-Hokuto Games con PilasEngine"
        self.texto4.color = "verde"
        pilas.actores.ObjetoMenu()
    def actualizar(self):
        pass
#nivel 1-----------------------------------------------------
class Nivel1(pilasengine.escenas.Escena):
    def iniciar(self):
        pilas.fondos.Galaxia(dy=-1)
        pilas.actores.Jugador()
        self.crear_aceitunas(150)
        self.crear_aceitunas(80)
    def crear_aceitunas(self,y):
        pilas.actores.EnemigoAceituna(200,y)
        pilas.actores.EnemigoAceituna(100,y)
        pilas.actores.EnemigoAceituna(0,y)
        pilas.actores.EnemigoAceituna(-100,y)
        pilas.actores.EnemigoAceituna(-200,y)
    def actualizar(self):
        pass

"""
**************************************************************
OBJETOS DEL JUEGO
**************************************************************
"""
#jugador-------------------------------------------------------
class Jugador(pilasengine.actores.Actor):
    def iniciar(self):
        global puntos,vida_jugador
        self.sonido = pilas.sonidos.cargar("audio/laserJugador.wav")
        self.x = 0
        self.y = -190
        self.escala = 0.8
        self.velocidad = 5
        self.aprender("Disparar",municion=DisparoJugador,
        frecuencia_de_disparo=3,angulo_salida_disparo=90,distancia=50,
        control="control.boton",cuando_dispara=self.sonido.reproducir) 
    def actualizar(self):
        #manter siempre esta imagen
        self.imagen = "nave_roja/nave.png"
        #mover y parar
        if pilas.control.derecha and self.x < 270:
            self.x += self.velocidad 
            self.imagen = "nave_roja/nave_derecha.png"
        elif pilas.control.izquierda and self.x > -270:
            self.x -= self.velocidad
            self.imagen = "nave_roja/nave_izquierda.png"
#disparo jugador-----------------------------------------------
class DisparoJugador(pilasengine.actores.Actor):
    def iniciar(self):
        global puntos
        self.imagen = "disparo_laser.png"
        self.escala = 0.7
        def colision_aceituna(disparo,aceituna):
            disparo.eliminar()
            aceituna.eliminar()
        pilas.colisiones.agregar("disparojugador","enemigoaceituna",colision_aceituna)
    def actualizar(self):
        pass
#enemigo aceitune--------------------------------------------------
class EnemigoAceituna(pilasengine.actores.Actor):
    def iniciar(self,x,y):
        self.imagen = "aceituna.png"
        self.x = x
        self.y = y
        self.aprender(pilas.habilidades.PuedeExplotarConHumo)
    def actualizar(self):
        pass
#objeto para menu----------------------------------------------
class ObjetoMenu(pilasengine.actores.Actor):
    def iniciar(self):
        self.sonido = pilas.sonidos.cargar("audio/sonido_selector.wav")
        self.imagen = "nave_roja/nave.png"
        self.x = -74
        self.y = 0
        self.escala = 0.5
        self.selector = 0
    def actualizar(self):
        #mover y seleccionar
        if pilas.control.abajo and self.selector == 0:
            self.y = -100
            self.sonido.reproducir()
            self.selector = 1
        elif pilas.control.arriba and self.selector == 1:
            self.y = 0
            self.sonido.reproducir()
            self.selector = 0 
        if pilas.control.boton and self.selector == 1:
            pilas.terminar()
        elif pilas.control.boton and self.selector == 0:
            pilas.escenas.Nivel1()
            
        
"""
***************************************************************
VINCULAR CLASES
***************************************************************
"""
#objetos-----------------------------------------------------
pilas.actores.vincular(Jugador)
pilas.actores.vincular(DisparoJugador)
pilas.actores.vincular(EnemigoAceituna)
pilas.actores.vincular(ObjetoMenu)
#niveles-----------------------------------------------------
pilas.escenas.vincular(Creditos)
pilas.escenas.Creditos()
pilas.escenas.vincular(Menu)
pilas.escenas.vincular(Nivel1)



    
pilas.ejecutar()
1 Like

Saludos @hokuto,

Que bien tienes bastante, dejame revisar y acomodar el codigo jejeje,
Para identar nunca he tenido problema, solo selcciono el codigo y al pegarlo mantiene la identacion, ya que sin ella el script no funcionara, ah tambien utilizo la opcion “texto preformateado” esta justo al lado de las comillas de este editor de texto, asi queda mejor y resaltado con respecto al texto normal.
Yo recuerdo haber hecho algo que disparaba muchas veces en todas las direcciones, lo encuentro y te lo muestro, dame un tiempito

Saludos, recién hice una corrección para que el código se vea bien. Para colocar código en el foro
lo mejor es poner tres tildes así:

Con respecto a tu pregunta, tal vez te conviene hacer que la nave dispare creando un actor personalizado y especificándolo como “municion”:

1 Like

Me quedé pensando en tu pregunta @hokuto, y creo haber encontrado una forma de hacer que los disparos se dirijan a un actor en particular, pilas incluye una función llamada “pilas.utils.obtener_angulo_entre” que te puede servir.

Este es el código:

# coding: utf-8
import pilasengine

pilas = pilasengine.iniciar()

mono = pilas.actores.Mono()

class GenerarDisparoDirigido(pilasengine.actores.Actor):
    
    def iniciar(self):
        self.imagen = "invisible.png"
        pass
 
    def actualizar(self):
        actor = pilas.actores.MisilDirigido(self.x, self.y)
        self.eliminar()
        
class MisilDirigido(pilasengine.actores.Actor):
    
    def iniciar(self, x, y):
        self.x = x
        self.y = y
        self.imagen = "disparo_laser.png"
        
        self.dx = (mono.x - self.x) / 10.0
        self.dy = (mono.y - self.y) / 10.0
        self.rotacion = pilas.utils.obtener_angulo_entre(( self.x, self.y), (mono.x, mono.y))

        
    def actualizar(self):
        
        self.x += self.dx
        self.y += self.dy
     
    
mono.y = 200
aceituna = pilas.actores.Aceituna(y=-200)
aceituna.aprender("disparar", municion=GenerarDisparoDirigido)
aceituna.aprender('moverseConElTeclado')

def eliminar(mono, misil):
    misil.eliminar()

pilas.colisiones.agregar("mono", 'MisilDirigido', eliminar)
    
pilas.actores.vincular(GenerarDisparoDirigido)
pilas.actores.vincular(MisilDirigido)
mono.aprender('arrastrable')

pilas.ejecutar()
1 Like

Gracias Hugo por la explicacion:wink:

Lo de que el disparo vaya a otro enemigo esta perfecto y me funciona bien,pero lo de crear mas disparos sigo sin verlo.
Yo el disparo como ves en mi codigo esta creado en una clase aparte y lo utilizo como municion pero no veo que la habilidad disparar me permita crear mas disparos

Saludos @hokuto ahora si que no se a que te refieres con mas disparos, danos un ejemplito

Me refiero a que la nave pueda lanzar dos o tres disparos en distintas direcciones.

Un ejemplo lo tienes en el actor pilas.actores.NaveRoja(),esta nave puede lanzar dos disparos,uno en cada lado y lo que yo quiero es igual pero poder crearlo de forma manual

Ah, si, entiendo.

Hay varias formas. Por ejemplo, editando el método “actualizar” de “GenerarDisparoDirigido” se pueden crear todos los actores disparo que quieras.

    def actualizar(self):
        actor = pilas.actores.MisilDirigido(self.x, self.y, "disparo_laser.png", 15)
        actor = pilas.actores.MisilDirigido(self.x, self.y, "disparo_laser.png", -15)
        self.eliminar()

(el último parámetro 15 y -15 lo agregué para que los disparos estén un poquito separados entre sí).

Quedaría algo así:

y el código modificado:

# coding: utf-8
import pilasengine

pilas = pilasengine.iniciar()

mono = pilas.actores.Mono()

class GenerarDisparoDirigido(pilasengine.actores.Actor):
    
    def iniciar(self):
        self.imagen = "invisible.png"
        pass
 
    def actualizar(self):
        actor = pilas.actores.MisilDirigido(self.x, self.y, "disparo_laser.png", 15)
        actor = pilas.actores.MisilDirigido(self.x, self.y, "disparo_laser.png", -15)
        self.eliminar()
        
class MisilDirigido(pilasengine.actores.Actor):
    
    def iniciar(self, x, y, imagen, distancia_x):
        self.x = x + distancia_x
        self.y = y
        self.imagen = imagen
        self.distancia_x = distancia_x
        
        self.dx = (mono.x + distancia_x- self.x) / 10.0
        self.dy = (mono.y + distancia_x - self.y) / 10.0
        self.rotacion = pilas.utils.obtener_angulo_entre(( self.x, self.y), (mono.x, mono.y))

        
    def actualizar(self):
        self.x += self.dx
        self.y += self.dy
     
    
mono.y = 200
aceituna = pilas.actores.Aceituna(y=-200)
aceituna.aprender("disparar", municion=GenerarDisparoDirigido)
aceituna.aprender('moverseConElTeclado')

def eliminar(mono, misil):
    misil.eliminar()

pilas.colisiones.agregar("mono", 'MisilDirigido', eliminar)
    
pilas.actores.vincular(GenerarDisparoDirigido)
pilas.actores.vincular(MisilDirigido)
mono.aprender('arrastrable')

pilas.ejecutar()

Avisanos si te sirve!

1 Like

Excelente ahora si entiendo

Gracias Hugo,ahora ya puedo seguir con mi juego:relaxed:

Espero que no me surjan mas problemas y pueda terminarlo,hasta pronto

1 Like