Necesito Ayuda con las colisiones de disparo de mi nave

Hola que tal, desde ya gracias. estoy teniendo un problema y no logro encontrar la solucion para que el disparo de la nave destruya a los enemigos, y el disparo del ovni tambien destruya la nave.

# coding: utf-8
import pilasengine
import random

pilas = pilasengine.iniciar()


pilas.actores.Sonido()
fin_de_Juego = False


fondo = pilas.fondos.Galaxia()
puntos = pilas.actores.Puntaje( x=-300, y=-200, color= pilas.colores.blanco)

nave = pilas.actores.Nave( y= -200)

nave.aprender(pilas.habilidades.LimitadoABordesDePantalla)

disparo_de_nave = pilasengine.actores.Misil

nave.aprender(pilas.habilidades.Disparar, municion = disparo_de_nave , angulo_salida_disparo = 90, frecuencia_de_disparo = 2)

nave.aprender(pilas.habilidades.PuedeExplotar)

nave.aprender(pilas.habilidades.MoverseConElTeclado)

nave.definir_enemigos

enemigo1 = pilas.actores.Ovni( y = 200)
    
enemigo1.radio_de_colision=25

enemigo1.aprender(pilas.habilidades.PuedeExplotar)

enemigo1.x = [0, -300, 300] *1000, 3
    
disparo_de_enemigo1 = pilasengine.actores.Bomba 
       
enemigo1.aprender(pilas.habilidades.Disparar, control=None, municion = disparo_de_enemigo1 , angulo_salida_disparo = 270, frecuencia_de_disparo = 1, escala = 0.5)   

def dispara():
    enemigo1.disparar()
    return True
    
pilas.tareas.agregar(1, dispara)

def crear_enemigo():
    enemigo2 = pilas.actores.Aceituna()
    enemigo2.aprender(pilas.habilidades.PuedeExplotarConHumo)
    enemigo2.aprender(pilas.habilidades.Disparar, control=None, angulo_salida_disparo = 270, frecuencia_de_disparo = 0.5, escala = 0.5)
    enemigo2.x = random.randrange(-200, 200)
    enemigo2.y = random.randrange(-100, 150)
    enemigos.agregar(enemigo2)
    
    if fin_de_Juego:
        return False
    else: 
        return True
        
pilas.tareas.siempre(1, crear_enemigo)
    
enemigos = pilas.actores.Grupo()    

def destruir(disparo, enem):
    disparo.eliminar()
    enem.eliminar()
    global puntos
    puntos.agregar(cantidad="100")
    
def perder(nav, ene):
    
    global fin_de_Juego
    
    ene.decir("Has Perdido")
    nav.eliminar()
    pilas.tareas.eliminar_todas()
    fin_de_Juego = True
    
    pilas.avisar("GAME OVER")

pilas.escena_actual().colisiones.agregar(nave, enemigo1, nave.eliminar)
pilas.escena_actual().colisiones.agregar(nave, enemigos, nave.eliminar)
pilas.escena_actual().colisiones.agregar(nave, enemigos, perder)
pilas.escena_actual().colisiones.agregar(nave, enemigo1, perder)    

pilas.ejecutar()

No logro hacer la colision de esos y cuando creo una funcion para destruir los parametros de el disparo y lo q quiero destruir no me los toma como valido, me los rechaza

Buenas, @JuanCruz

Deberias editar tu post y colocar esto

` <------esa pequeña tilde, copiala y pegala en tu post

TRES veces antes del código y TRES veces al final. De esta manera tu código quedará bien indexado y podremos comprobar los errores.

Un saludo.

Muchas gracias. Como veras es la primera publicacion q hago. Disculpe.

Buenas @JuanCruz

No problem, a mí tambien me pasaba al principio… :wink:

Una pregunta: Quieres que tu nave tambien destruya al ovni que va de un lado a otro o solo que destruya las aceitunas???

Un saludo.

Buenas, @JuanCruz

Varias cosas que comentar:

Fijate bien en la diferencia entre mis colisiones y las que tu habias programado. En este caso he optado por usar etiquetas. Las colisiones son entre las municiones y los actores, y tambien entre la nave y la aceituna.

Ahora, al destruir el ovni te da 1000 puntos y se crea un nuevo ovni.

Te he cambiado lo del ramdom.randage por una función más de Pilas: pilas.azar(numero 1, numero2) Ahora no hace falta importar random

No hace falta definir un grupo de enemigos, al usar etiquetas en las colisiones cualquier actor con esa etiqueta será colisionado… y si es el caso destruido.

Veo que las aceitunas aprenden a disparar, pero realmente en mis pruebas no disparan, ya que no está programado el método o la tarea que realicen el disparo.

Te he cambiado los pilas.habilidades.aprender por aprender(‘etiqueta de habilidad’)

Y creo que eso es todo. Si hay algo que no hayas entendido o que no te parezca bien no dudes en volver a consultar. :smile:

Un saludo.

#coding: utf-8
import pilasengine
#import random

pilas = pilasengine.iniciar()

pilas.actores.Sonido()
fin_de_Juego = False

fondo = pilas.fondos.Galaxia()
puntos = pilas.actores.Puntaje( x=-300, y=-200, color= pilas.colores.blanco)

nave = pilas.actores.Nave( y= -200)

nave.aprender('limitadoabordesdepantalla')

disparo_de_nave = pilasengine.actores.Misil

nave.aprender('disparar', municion = disparo_de_nave , angulo_salida_disparo = 90, frecuencia_de_disparo = 2)

nave.aprender('puedeexplotar')

nave.aprender('moverseconelteclado')

def crear_ovni():
	enemigo1 = pilas.actores.Ovni( y = 200)
	enemigo1.radio_de_colision=25
	enemigo1.aprender('puedeexplotar')
	disparo_de_enemigo1 = pilasengine.actores.Bomba
	enemigo1.aprender('disparar', control=None, municion = disparo_de_enemigo1 , angulo_salida_disparo = 270, frecuencia_de_disparo = 1, escala = 0.5)
	
	def mover_ovni():	
		enemigo1.x = [0, -300, 300], 3

	pilas.tareas.agregar(0.5, mover_ovni)
	pilas.tareas.siempre(9.5, mover_ovni)

	def dispara():
		enemigo1.disparar()
		return True

	enemigo1.tarea_dispara = pilas.tareas.agregar(1, dispara)

crear_ovni()

#enemigos = pilas.actores.Grupo()
#nave.definir_enemigos(enemigos)


#creacion del enemigo Aceitunas
def crear_enemigo():
	enemigo2 = pilas.actores.Aceituna()
	enemigo2.aprender('puedeexplotarconhumo')
	enemigo2.aprender(pilas.habilidades.Disparar, control=None, angulo_salida_disparo = 270, frecuencia_de_disparo = 0.5, escala = 0.5)
	enemigo2.x = pilas.azar(-200, 200)
	enemigo2.y = pilas.azar(-100, 150)
	#enemigos.agregar(enemigo2)

	if fin_de_Juego:
		return False
	else: 
		return True
pilas.tareas.siempre(1, crear_enemigo)


def destruir(disparo, enem):
	disparo.eliminar()
	enem.eliminar()
	#global puntos
	puntos.aumentar(100)

def destruir_ovni(misil,ovni):
	crear_ovni()
        misil.eliminar()
	ovni.eliminar()
	ovni.tarea_dispara.eliminar()
	puntos.aumentar(1000)

def perder(nav, ene):
	#global fin_de_Juego
	ene.decir("Has Perdido")
	nav.eliminar()
	pilas.tareas.eliminar_todas()
	fin_de_Juego = True

	pilas.avisar("GAME OVER")

#Colisiones
#pilas.escena_actual().colisiones.agregar(nave, enemigo1, nave.eliminar)
pilas.colisiones.agregar('Nave', 'Aceituna', perder)
pilas.colisiones.agregar('Nave', 'Bomba', perder)
pilas.colisiones.agregar('Misil', 'Aceituna', destruir)
pilas.colisiones.agregar('Misil', 'Ovni', destruir_ovni)

pilas.ejecutar()

Genial, estoy tratando de apreder y eso de la etiquetas me quedo medio en el aire, no lo logre entender muy bien incluso usando el manual. Desde ya muchas gracias tengo q seguir agregandole preguntas y si puede ser niveles y menu. :stuck_out_tongue: muchas gracias desde ya seguire programando para ver si lo puedo lograr

Disculpa si soy muy pesado, el tema del uso de etiquetas es una invocacion de como esta escrito dentro de la carpeta pilas?

Buenas, @JuanCruz

En este post doy un ejemplo de colisiones con etiqueta y sin etiqueta.

Si lo haces SIN etiqueta solo colisionan los nombres de las variables que tu le has dado al actor.

Si lo haces CON etiquetas colisionaran todos los actores que tengan esa etiqueta.

la etiqueta de pilas actores.Mono() es ‘Mono’
la etiqueta de pilas.actores.Aceituna es ‘Aceituna’
la etiqueta de class miactorpersonalizado(pilas.actores.Actor) es ‘miactorpersonalizado’
etc. etc. etc…

Un saludo…

http://foro.pilas-engine.com.ar/t/hola-maquinolas-como-puedo-hacer-para-que-un-actor-tenga-3-vidas/861/2