Colision actores - escenas

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()

Buenas, @Rober

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? :wink:

Un saludo.

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.

Buenas, @Rober

Me alegro mucho que esos dos consejos te fueran bien. :smile:

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.

Un saludo :wink:

@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 :blush:, 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()

Buenas, @Rober

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.

Espero que esto te haya ayudado. :cold_sweat:

Un saludo.