Hola, de vuelta los molesto, estoy queriendo agregar un actor, que sufra una colision cuando choca con otro y este explote
Se crean los dos actores pero no hacen colision, no se que estoy haciendo mal
Les dejo la parte del codigo:
import pilasengine
pilas=pilasengine.iniciar()
###############################################
class Actor1(pilasengine.actores.Actor):
def iniciar(self):
self.x = 400 # desde donde empieza
self.velocidad = self.pilas.azar(2, 12) # velocidad
self.imagen = "imagen-1.png"
self.y = self.pilas.azar(-230, 230) # rangoaltura
self.z = 1
self.figura_de_colision = pilas.fisica.Rectangulo(0, 0, 200, 82, sensor=True)
self.etiquetas.agregar('uno')
def actualizar(self):
self.x -= self.velocidad
if self.x < -400: # Elimina al actor si sale de la pantalla
self.eliminar()
###############################################
class Actor2(pilasengine.actores.Actor):
def iniciar(self):
self.imagen = "imagen-2.png"
self.aprender(pilas.habilidades.LimitadoABordesDePantalla)
self.aprender(pilas.habilidades.MoverseConElTeclado)
self.figura_de_colision = pilas.fisica.Rectangulo(0, 0, 135, 45, sensor=True)
self.etiquetas.agregar('dos')
###############################################
class EscenaJuego(pilasengine.escenas.Escena): # juego
def inicio(self):
pilas.escenas.EscenaMenu()
def iniciar(self, nombre): # recoges el nombre pasado de la escena anterior
texto_Hola = pilas.actores.Texto(' ')
texto_Hola.color = pilas.colores.amarillo
texto_Hola.x =-390
texto_Hola.y = 225
texto_nombre = pilas.actores.Texto(nombre)
texto_nombre.color = pilas.colores.amarillo
texto_nombre.x =-310
texto_nombre.y=225
self.pilas.tareas.siempre(2, self._crear_un_actor_2)
self.dos = Actor2(pilas)
def actualizar(self):
self.fondoespacial.desplazar(1)
def _crear_un_actor_1(self):
self.pilas.actores.Actor1()
def choque(actor1, actor2):
actor2.eliminar()
###############################################
pilas.escenas.vincular(EscenaJuego)
pilas.actores.vincular(Actor1)
pilas.actores.vincular(Actor2)
pilas.colisiones.agregar("Actor1", "Actor2", choque)
pilas.escenas.EscenaMenu()
pilas.ejecutar()
A primera vista y sin probar el código veo varias cosas que a mi parecer o son innecesarias o podrian mejorarse.
Vamos por partes:
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.
Lo de agregarle a tus actores una figura de colisión y una etiqueta, no sé si es por necesidades de tu juego o es que has estado probando cosas a la desesperada. Realmente, para colisionar un actor no hace falta todo eso.
pilas.colisiones.agregar(“Actor1”, “Actor2”, choque) Esta linea deberia estar en la def iniciar de la EscenaJuego.
def choque(): No veo si está dentro o fuera de la escenaJuego, pero deberia estar dentro.
Prueba estas dos cosas y nos dices si te funcionó, ok?
Muchas gracias @jordinur, me sirvio de mucho tu ayuda, con eso anduvo perfecto.
Ya lo edite como me dijiste. Habia puesto otras comillas.
Que mas podria mejorarse?
Todos los consejos son bien recibidos, ante mi falta de conocimiento.
Saludos.
Me alegro mucho que esos dos consejos te fueran bien.
Ahora que está correctamente expuesto el código veo varios fallos de indexación, como funciones que no están donde deberian… Pero como es el mismo código que pusiste al inicio, no sé qué has corregido y qué no.
Podrias editar y poner el código nuevo, o incluirlo en una respuesta? Así todos aprendemos y no confundimos a nadie que busque la misma respuesta que tu.
@jordinur ahi agregue como quedaron las partes involucradas
ahora despues de probarlo varias veces, me doy cuenta que si el actor dos se encuentra en el punto (0,0) explota cuando aparece algun actor uno, calculo que debe ser por la figura de colision ( lo deje porque necesito que tenga ese tamaño la figura) tal vez esta mal implementado
Tal vez me este abusando , pero te hago otras consultas, que tienen que ver con las consecuencias de las colisiones
cuando explota el actor dos, no aparece el texto “game over”
cuando termina el juego y se pierde como podria hacer que se detenga la pantalla como quedo?
import pilasengine
pilas=pilasengine.iniciar()
###############################################
class Actor1(pilasengine.actores.Actor):
def iniciar(self):
self.x = 400 # desde donde empieza
self.velocidad = self.pilas.azar(2, 12) # velocidad
self.imagen = "imagen-1.png"
self.y = self.pilas.azar(-230, 230) # rangoaltura
self.z = 1
self.figura_de_colision = pilas.fisica.Rectangulo(0, 0, 200, 82, sensor=True)
def actualizar(self):
self.x -= self.velocidad
if self.x < -400: # Elimina al actor si sale de la pantalla
self.eliminar()
###############################################
class Actor2(pilasengine.actores.Actor):
def iniciar(self):
self.imagen = "imagen-2.png"
self.aprender(pilas.habilidades.LimitadoABordesDePantalla)
self.aprender(pilas.habilidades.MoverseConElTeclado)
self.figura_de_colision = pilas.fisica.Rectangulo(0, 0, 135, 45, sensor=True)
###############################################
class EscenaJuego(pilasengine.escenas.Escena): # juego
def inicio(self):
pilas.escenas.EscenaMenu()
#############
def choque(actor1, actor2):
texto = pilas.actores.Texto("GAME OVER", y=100) # ESTO NO APARECE
actor2.eliminar()
#############
def iniciar(self, nombre): # recoges el nombre pasado de la escena anterior
texto_Hola = pilas.actores.Texto(' ')
texto_Hola.color = pilas.colores.amarillo
texto_Hola.x =-390
texto_Hola.y = 225
texto_nombre = pilas.actores.Texto(nombre)
texto_nombre.color = pilas.colores.amarillo
texto_nombre.x =-310
texto_nombre.y=225
#############
pilas.colisiones.agregar("Actor1", "Actor2", choque)
#############
self.pilas.tareas.siempre(2, self._crear_un_actor_2)
self.dos = Actor2(pilas)
def actualizar(self):
self.fondoespacial.desplazar(1)
def _crear_un_actor_1(self):
self.pilas.actores.Actor1()
###############################################
pilas.escenas.vincular(EscenaJuego)
pilas.actores.vincular(Actor1)
pilas.actores.vincular(Actor2)
pilas.escenas.EscenaMenu()
pilas.ejecutar()
No te haces una idea de los problemas que me ha dado tu código. Estaba lleno de mezclas de espacios y tabulaciones, por lo que no habia manera de que funcionara nada. He tenido que rehacer linea por linea, hasta que todo ha funcionado.
Hay varias cosas que me gustaria comentarte:
Lo de la figura de colisión, como ya te dije, no te hace falta. Si quieres que el radio de colisión sea más grande, usa esto en la def iniciar de tus actores:
self.radio_de_colision = 80 # este número indica los pixels de radio de colision.
Estaria bonito que al morir el actor explotara, para eso añadele esto en su def iniciar:
self.aprender(‘puedeexplotar’)
Lo del texto “GAME OVER” si que sale, lo que pasa es que seguramente queda detrás del fondo que usas. Si quitas el fondo lo verás. Hablando del fondo, veo que lo pones en la def actualizar() de la escena, pero no veo que lo hayas inicializado en la def iniciar() de la escena. Quizás deberias hacer algo así en la def iniciar() de la escena:
mi_fondo = pilas.fondos.Galaxia()
y quitas eso que has puesto en la def actualizar() de la escena.
Si usas ese fondo verás que si sale el texto “game over”.
Lo de que se quede todo parado… bueno yo solo veo que las aceitunas siguen saliendo, o sea que simplemente deberian de quedarse quietas las que haya en pantalla y dejar de salir aceitunas nuevas.