Hola resulta que hice un juego de naves tipo asteroid y resulta que hago que de vez en cuando aparezcan ovnis enemigos, el problema es que si pongo para que los ovnis salgan con poca frecuencia aparecen disparos que salen de la nada y no de los ovnis como deberia.
gracias
Hola @Ezequiel_Gaggiotti !!!, ¿podrías adjuntarnos un ejemplo del código?. No me queda muy claro el problema…
# coding: utf-8
import pilasengine
pilas = pilasengine.iniciar()
puntaje = pilas.actores.Puntaje(-280, 200, color=pilas.colores.blanco)
class OvniEnemiga(pilasengine.actores.Ovni):
def iniciar(self):
self.imagen= "Ovni.png"
self.aprender(pilas.habilidades.PuedeExplotar)
self.aprender("disparar", control=None, municion= 'bala', angulo_salida_disparo=pilas.azar(-360,360))
self.y = pilas.azar(-200, 200)
self.x = -290
self.velocidad = pilas.azar(1, 30) / 10.0
self.radio_de_colision=10
self.escala=pilas.azar(5,8)/10.0
self.tarea_disparar= pilas.tareas.siempre(3, self.realizar_disparo)
def actualizar(self):
self.rotacion +=0
self.x += self.velocidad
if self.x > 350:
self.eliminar()
def realizar_disparo(self):
self.aprender("disparar", control=None, municion= 'MiMunicion', angulo_salida_disparo = pilas.azar(-360,360)) #, frecuencia_de_disparo =5)
self.disparar()
class MiMunicion(pilasengine.actores.Actor):
def iniciar(self):
self.imagen = "disparo_laser.png"
self.escala_y = 0.1
self.escala_x = 0.1
self.y = 100
def actualizar(self):
self.escala_x += 0
self.rotacion += 5
class PiedraEnemiga(pilasengine.actores.Piedra):
def iniciar(self):
self.imagen = "piedra_grande.png"
self.aprender( pilas.habilidades.PuedeExplotar )
self.x = pilas.azar(-400, 200)
self.y = 210
self.velocidad = pilas.azar(1, 3) / 10.0
self.radio_de_colision=25
self.escala=pilas.azar(5,15)/10.0
def actualizar(self):
self.rotacion += 3
self.y -= self.velocidad
self.x+=self.velocidad
if self.y < -300:
self.eliminar()
enemigos = pilas.actores.Grupo()
def crear_enemigo1():
actor = PiedraEnemiga(pilas)
enemigos.agregar(actor)
def crear_enemigo():
actor = OvniEnemiga(pilas)
enemigos.agregar(actor)
fondo = pilas.fondos.Espacio()
planeta=pilas.actores.Planeta()
planeta.x=250
planeta.y=180
planeta.escala=3
planeta.transparencia=30
pilas.tareas.siempre(15, crear_enemigo)
pilas.tareas.siempre(3,crear_enemigo1)
nave = pilas.actores.Nave(x=0)
nave.aprender(pilas.habilidades.LimitadoABordesDePantalla)
nave.definir_enemigos(enemigos, puntaje.aumentar)
nave.radio_de_colision=8
pilas.colisiones.agregar(nave, enemigos, nave.eliminar)
pilas.colisiones.agregar("nave","MiMunicion",nave.eliminar)
pilas.actores.vincular(MiMunicion)
pilas.ejecutar()
Lo acavo dr revisar otra vez y lo que pasa en verdad es que cuando mi nave elimina a los ovnis estas siguen disparando por mas que ya no esten, me gustaria saber cual es el error en mi codigo.
gracias
Creo que el error es por que en ningún momento se define que la tarea disparar termine. Por tanto aunque la nave muera la tarea sigue activa y se ejecuta un disparo.
Otra cosa a tener en cuenta, es que yo no soy muy partidario de crear el grupo de enemigos (no hace falta… para que quieres una lista de enemigos???), ni de definir los enemigos de mi nave (aunque es muy práctico para hacer juegos sencillos con poco código, limita la capacidad de programar qué pasa cuando matas un enemigo, como en este caso el OvniEnemiga).
De todas formas, creo recordar que eso mismo me pasó a mi en mi primer juego, en el que se realizaban “disparos fantasma” voy a buscar ese post para ver cómo lo resolvimos allí.
Un saludo!
Aquí encontré el post…
Fíjate sobre todo en estas líneas:
def dispararconclick(self):
#"Se invoca cuando se hace click sobre el ovni."
if self.vida>0:
self.vida -=1
elif self.vida <= 0:
self.eliminar()
self.pilas.camara.vibrar(1, 0.3)
self.tarea_disparar.terminar()
self.pilas.actores.Ovni_Abatido(self.x, self.y)
Como se ve, se da fin a la tarea_disparar cuando se elimina el ovni.
Espero que esto te ayude…
Un saludo!