Buenas, que tal?
Estoy creando mi primer juego con pilasengine, y tengo un pequeño problema con el disparo de los enemigos, que quiero que sea cada n segundos. He probado todo lo que he podido encontrar por los ejemplos y por google, pero no consigo crear esa tarea de manera satisfactoria. Si coloco la tarea en def iniciar(self): los enemigos siguen disparando aún despues de ser eliminados (!!!???). Si coloco esa tarea en la def actualizar(self): el disparo es continuo tipo metralleta (!!!???). Lo he solucionado como he podido con una chapucilla, pero no creo que sea lo correcto.
Otro problema es que el juego se ralentiza casi de inmediato, cayendo de 60 a 2 fps a la que hay 2 o 3 actores en escena. (No creo que tenga que ver, pero lo menciono por si acaso: mi SO es LinuxMint)
Les agradeceria mucho me ayudaran con estos dos problemas. Gracias de antemano.
agrego el codigo para que puedan revisar posibles fallos.
# -*- encoding: utf-8 -*-
#OVNIGUNNER. v 1.0
import pilasengine
#import sys
#sys.path.insert(0, "..")
pilas = pilasengine.iniciar()
class Ovnis_Enemigos(pilasengine.actores.Actor):
vida=10 #tenemos que clicarle 10 veces para matarlo
def iniciar(self):
self.x = self.pilas.azar(-280, 280)
self.altura = self.pilas.azar(50, 200)
self.imagen = "ovni.png"
self.y = self.pilas.azar(-50, 0)
self.z = 1
self.escala = 0.1
self.aprender("puedeexplotar")
self.aprender("disparar", control=None, municion= 'MiMunicion', angulo_salida_disparo=pilas.azar(250,290)) #, frecuencia_de_disparo =1)
#pilas.tareas.siempre(3,self.disparar) #Si uso esto sigue disparando despues de ser eliminado
def actualizar(self):
pilas.utils.interpolar(self,'rotacion', 360, duracion=3)
pilas.utils.interpolar(self, 'escala', 1.5, duracion=20)
pilas.utils.interpolar(self, 'y', self.altura, duracion=15)
if self.escala >= 0.7:
self.imagen = "ovni2.png"
#Esta es la unica manera que he encontrado de disparar
#pero no es lo que necesito:
if self.escala >= 0.899 and self.escala < 0.900:
self.disparar()
elif self.escala >= 1.189 and self.escala < 1.190:
self.disparar()
elif self.escala >= 1.489 and self.escala < 1.490:
self.disparar()
# Elimina al actor si sale de la pantalla
if self.y > 250 or self.y < -150:
self.eliminar()
# El ovni intenta evitar nuestros disparos
if self.vida < 7 and self.vida >2:
pilas.utils.interpolar(self,'y', pilas.azar(-160,240), duracion =2)
pilas.utils.interpolar(self,'x', pilas.azar(-250,250), duracion =2)
def dispararconclick(self):
#"Se invoca cuando se hace click sobre el ovni."
self.vida -=1
#print(self.vida)
if self.vida == 0:
self.eliminar()
self.pilas.camara.vibrar(1, 0.3)
self.pilas.actores.Ovni_Abatido(self.x, self.y)
class MiMunicion(pilasengine.actores.Actor):
def iniciar(self):
self.imagen = "disparos/bola_amarilla.png"
self.escala= 0.1
self.aprender("puedeexplotar")
def actualizar(self):
self.escala_y += 0.1
if self.y == -140:
self.eliminar()
class Ovni_Abatido(pilasengine.actores.Actor):
def iniciar(self, x, y):
self.imagen = "ovni.png"
self.x = x
self.y = y
self.transparencia = [10]
self.dx = self.pilas.azar(-3, 3)
self.escala = 1.2
self.aprender("puedeexplotar")
def actualizar(self):
self.x += self.dx
self.y -= 3
self.rotacion += 5
if self.y < -180:
self.pilas.camara.vibrar(2, 0.3)
self.eliminar()
class EscenaMenu(pilasengine.escenas.Escena):
def iniciar(self):
self.pilas.fondos.FondoMozaico('azul.png')
actor_texto = self.pilas.actores.Actor()
actor_texto.imagen = "click.png"
self._aplicar_animacion(actor_texto)
self.pilas.eventos.click_de_mouse.conectar(self._iniciar_el_juego)
self._crear_el_titulo_del_juego()
self._crear_indicador_creditos()
def _aplicar_animacion(self, texto):
texto.y = -500
texto.escala = 4
texto.escala = [1], 1.5
texto.y = [-100], 1
def _iniciar_el_juego(self, evento):
self.pilas.escenas.EscenaJuego()
def _crear_el_titulo_del_juego(self):
titulo = self.pilas.actores.Actor()
titulo.imagen = "titulo.png"
titulo.y = 300
titulo.rotacion = 30
titulo.y = [100], 1
titulo.rotacion = [0], 1.2
def _crear_indicador_creditos(self):
actor = self.pilas.actores.Actor()
actor.imagen = "creditos.png"
actor.x = 400
actor.y = -200
actor.x = [400, 400, 270], 0.5
class BotonVolver(pilasengine.actores.Actor):
def iniciar(self):
self.imagen = "boton_volver.png"
self.cuando_hace_click = self._volver_a_la_escena_inicial
self.y = [230]
self.x = -270
self.escala =0.5
def _volver_a_la_escena_inicial(self, evento):
self.pilas.escenas.EscenaMenu()
class EscenaPerdido(pilasengine.escenas.Escena):
def iniciar(self):
self.pilas.fondos.FondoMozaico('azul.png')
self.pilas.eventos.click_de_mouse.conectar(self._ir_al_menu)
#falta cargar una imagen y un texto
def _ir_al_menu(self):
self.pilas.escenas.EscenaMenu()
class EscenaJuego(pilasengine.escenas.Escena):
def _crear_un_ovni(self):
self.pilas.actores.Ovnis_Enemigos()
#pilas.avisar("Enemigo localizado")
def _cuando_hace_click(self, evento):
explosion = pilas.actores.Animacion(imagen_explosion)
explosion.escala = 0.5
explosion.x = evento.x
explosion.y = evento.y
sonido_explosion.reproducir()
#obtenemos las colisiones con el mouse
colisiona = self.obtener_actores_en(evento.x, evento.y)
for actor in colisiona:
if isinstance(actor, Ovnis_Enemigos):
if actor.escala >= 0.7:
actor.dispararconclick()
else:
None
#print("No se puede")
def findejuego(self):
self.pilas.escenas.EscenaPerdido()
def iniciar(self):
self.fondo = pilas.fondos.Noche()
self._crear_boton_volver()
pingu = pilas.actores.Pingu(y= -240)
pingu.escala =0.5
pingu.aprender('limitadoabordesdepantalla')
#fondo.imagen = pilas.imagenes.cargar('snow2.png')
pilas.tareas.siempre(3, self._crear_un_ovni)
pilas.eventos.click_de_mouse.conectar(self._cuando_hace_click)
pilas.colisiones.agregar('pingu','MiMunicion',self.findejuego)
def _crear_boton_volver(self):
pilas.actores.BotonVolver()
imagen_explosion = pilas.imagenes.cargar_grilla("explosion.png", 7)
sonido_explosion = pilas.sonidos.cargar("explosion.wav")
## Vinculamos todas las escenas.
pilas.escenas.vincular(EscenaMenu)
pilas.escenas.vincular(EscenaJuego)
pilas.escenas.vincular(EscenaPerdido)
## Vinculamos los actores Personalizados
pilas.actores.vincular(BotonVolver)
pilas.actores.vincular(MiMunicion)
pilas.actores.vincular(Ovnis_Enemigos)
pilas.actores.vincular(Ovni_Abatido)
# Se inicia la escena principal.
pilas.escenas.EscenaMenu()
#pilas.escenas.EscenaJuego()
pilas.ejecutar()