Problema con colisiones...(resubido) [SOLUCIONADO]

Hola de vuelta comunidad!, hoy tengo una duda sobre las colisiones en pilas. En mi código he intentado hacer que al momento de la colisión de una bala y un actor, estos se eliminen, lo cual he conseguido. Pero mi problema surge cuando creo de vuelta el actor que anteriormente elimine… la verdad es que he intentado de todo pero no encuentro el error. Para mi el error esta en que el actor se vuelve a crear antes de que la bala se elimine, lo que crea un bucle de colisión infinito(SE TRABA TODO Y SE CRASHEA EL PILAS, solo aviso…). Aca dejo una carpeta de mi juego:

[Carpeta del proyecto](###########################(link caido))

ojala a alguien se le ocurra alguna solución, o si me puede aportar alguna idea para tratar de solucionar este problema.

Francesco.

Buenas, @francesco

Puedo ver muchas carpetas y proyectos, cual es? No sé si es lo que pretendias, pero está TODO disponible a cualquiera que acceda a tu unidad.

Un abrazo.

Muchas gracias por avisar, la verdad que me confundí al elegir la carpeta del Google Drive. ya corregí el link: ########################################(link caido)

Buenas…

Ahora me pide permiso para entrar…

Mira quizas seria mejor que publicaras aqui tu código, para que todos lo podamos ver y sirva de ejemplo a otros…

Un abrazo.

###########################################(link caido)

Prueba con ese link, igualmente ya subo mi codigo aui. igualmente muchas gracias!

Aqui esta mi codigo hasta el momento, esta un poco mas actualizado que el de Google Drive, sin embargo, sigo sin poder solucionar mi problema…

#! -*-coding: utf-8-*-

import pilasengine
import time

pilas = pilasengine.iniciar()
teclas = {
        pilas.simbolos.a: 'izquierda',
        pilas.simbolos.d: 'derecha',
        pilas.simbolos.w: 'arriba',
        pilas.simbolos.s: 'abajo',
        pilas.simbolos.j: 'boton',
}

#mapa = pilas.actores.MapaTiled("/home/francesco/Colegio/Programacion/Python/Juego Pilas/Actores Personalizados/mapa_desde_archivo.tmx")

#fondo = pilas.fondos.Fondo()
#fondo.imagen = pilas.imagenes.cargar('mapa_desde_archivo2.png')

mi_control = pilas.control.Control(teclas)

camara = pilas.camara

camara.escala = 1

balas = pilas.actores.Grupo()


class Bala_K(pilasengine.actores.Actor):
    """ Representa una bala que va en línea recta. """
    global balas

    def __init__(self, pilas, x=0, y=0, rotacion=0, velocidad_maxima=9,
                 angulo_de_movimiento=180):
 
        """
        Construye la Bala.

        :param x: Posición x del proyectil.
        :param y: Posición y del proyectil.
        :param velocidad_maxima: Velocidad máxima que alcanzará el proyectil.
        :param angulo_de_movimiento: Angulo en que se moverá el Actor..

        """
        super(Bala_K, self).__init__(pilas=pilas, x=x, y=y)
        self.imagen = pilas.imagenes.cargar('disparos/bola_amarilla.png')
        self.rotacion = rotacion

        self.radio_de_colision = 5

        self.hacer(pilas.comportamientos.Proyectil,
                   velocidad_maxima=velocidad_maxima,
                   aceleracion=1,
                   angulo_de_movimiento=angulo_de_movimiento,
                   gravedad=0)

        self.aprender(self.pilas.habilidades.EliminarseSiSaleDePantalla)
        self.cuando_se_elimina = None
        
        balas.agregar(self)


    def eliminar(self):
        if self.cuando_se_elimina:
            self.cuando_se_elimina(self)

        super(Bala_K, self).eliminar() 

class Bala_S(pilasengine.actores.Actor):
    """ Representa una bala que va en línea recta. """

    global balas

    def __init__(self, pilas, x=0, y=0, rotacion=180, velocidad_maxima=9,
                 angulo_de_movimiento=0):

        """
        Construye la Bala.

        :param x: Posición x del proyectil.
        :param y: Posición y del proyectil.
        :param velocidad_maxima: Velocidad máxima que alcanzará el proyectil.
        :param angulo_de_movimiento: Angulo en que se moverá el Actor..

        """
        super(Bala_S, self).__init__(pilas=pilas, x=x, y=y)
        self.imagen = pilas.imagenes.cargar('disparos/bola_amarilla.png')
        self.rotacion = rotacion

        self.radio_de_colision = 5

        self.hacer(pilas.comportamientos.Proyectil,
                   velocidad_maxima=velocidad_maxima,
                   aceleracion=1,
                   angulo_de_movimiento=angulo_de_movimiento,
                   gravedad=0)

        self.aprender(self.pilas.habilidades.EliminarseSiSaleDePantalla)
        self.cuando_se_elimina = None
        
        balas.agregar(self)        

    def eliminar(self):
        if self.cuando_se_elimina:
            self.cuando_se_elimina(self)

        super(Bala_S, self).eliminar() 

    def actualizar(self):
        pass
           

pilas.actores.vincular(Bala_K)
pilas.actores.vincular(Bala_S)                     
                             
class KennyS(pilasengine.actores.Actor):
    global camara
    def iniciar(self):
        global Bala_K
        self.x = 200
        self.imagen = pilas.imagenes.cargar("aceituna.png")
        self.aprender('disparar', municion='Bala_K', angulo_salida_disparo=180, frecuencia_de_disparo = 1.5, control = mi_control)
        self.aprender('moversecomocoche')
        self.aprender(pilas.habilidades.LimitadoABordesDePantalla)

    def actualizar(self):
        pass
            
class ScreaMy(pilasengine.actores.Actor):

    def iniciar(self):
        global Bala_S
        self.x = -200
        self.imagen = pilas.imagenes.cargar("aceituna.png")
        self.aprender('disparar', municion='Bala_S', angulo_salida_disparo=180,  frecuencia_de_disparo = 1.5)
        self.aprender("moversecomocoche",control=mi_control)
        self.aprender(pilas.habilidades.LimitadoABordesDePantalla)

        #self.aprender(pilas.habilidades.MoverseConElTeclado, control=mi_control) 

    def actualizar(self):
        pass

puntaje_kenny = pilas.actores.Puntaje(x = 200, y = 150)
puntaje_scream = pilas.actores.Puntaje(x = -200, y = 150)

pilas.actores.vincular(ScreaMy)
pilas.actores.vincular(KennyS)


def crear_Kenny():
    KennyS = pilas.actores.KennyS()
    KennyS.etiquetas.agregar("kenny")
    pilas.colisiones.agregar("Bala_S", "kenny", al_colisionar_K)
    
def crear_ScreaMy():
    ScreaM = pilas.actores.ScreaMy()
    ScreaM.etiquetas.agregar("scream")
    pilas.colisiones.agregar("Bala_K", "scream", al_colisionar_S)
 
def limpiar(lista): 
    """Elimina a todos los actores dentro del grupo.""" 
    eliminar = list(lista) 
    for e in eliminar: 
        e.eliminar() 

def al_colisionar_S(Bala_K, ScreaM):
    limpiar(balas)
    puntaje_kenny.aumentar(1)
    print ("1")
    ronda()
 
def al_colisionar_K(Bala_S, KennyS):
    limpiar(balas)    
    puntaje_scream.aumentar(1)
    print ("1")
    ronda()

def ronda():
    try:
        KennyS.eliminar()
    except:
        pass

    try:
        ScreaMy.eliminar()
    except:
        pass
    
    crear_ScreaMy()
    crear_Kenny()
    
ronda()


pilas.ejecutar() # Necesario al ejecutar en scripts.

Lo primero que veo es que has copiado e intentado adaptar la clase bala o munición de PilasEngine… eso está bien, pero no hacia falta hacerlo…

Cualquier actor puede servir como proyectil, tan solo hace falta que tenga como mínimo una imagen. Por tanto bastaria con

class Bala_K(pilasengine.actores.Actor):
    def iniciar(self):
        self.imagen = ('disparos/bola_amarilla.png')
        self.radio_de_colision = 5
        self.aprender('eliminarsesisaledepantalla')

Por cierto, NO SABIA que existia esa habilidad de eliminarse si sale de pantalla… es muy útil! Gracias por enseñarmela :smile:

Lo de hacer un grupo con las balas y eliminarlas todas no entiendo para qué lo necesitas… francamente me parece que has tenido problemas y te has puesto a probar cosas a la desesperada :yum:

Mira te paso tu código SIMPLIFICADO todo lo que he podido, a ver si te sirve (es que ya me lo habia bajado en tu primer post… pero no sabia si era ese).

#! -*-coding: utf-8-*-

import pilasengine
#import time

pilas = pilasengine.iniciar()
teclas = {
        pilas.simbolos.a: 'izquierda',
        pilas.simbolos.d: 'derecha',
        pilas.simbolos.w: 'arriba',
        pilas.simbolos.s: 'abajo',
        pilas.simbolos.j: 'boton',
}

#mapa = pilas.actores.MapaTiled("/home/francesco/Colegio/Programacion/Python/Juego Pilas/Actores Personalizados/mapa_desde_archivo.tmx")

fondo = pilas.fondos.Fondo('mapa_desde_archivo2.png')

camara = pilas.camara

camara.escala = 1

mi_control = pilas.control.Control(teclas)

class Bala_K(pilasengine.actores.Actor):
    def iniciar(self):
        self.imagen = ('disparos/bola_amarilla.png')
        self.radio_de_colision = 5
        self.aprender('eliminarsesisaledepantalla') ##(self.pilas.habilidades.EliminarseSiSaleDePantalla)
            
class Bala_S(pilasengine.actores.Actor):
    def iniciar(self):
        self.imagen = ('disparos/bola_amarilla.png')
        self.radio_de_colision = 5
        self.aprender('eliminarsesisaledepantalla') ##(self.pilas.habilidades.EliminarseSiSaleDePantalla)
        

                             
class KennyS(pilasengine.actores.Actor):
    def iniciar(self):
        self.x = 200
        self.imagen = pilas.imagenes.cargar("aceituna.png")
        self.aprender('disparar', municion='Bala_K', angulo_salida_disparo=90, frecuencia_de_disparo = 1.5, control = mi_control)
        self.aprender('moversecomocoche',control=mi_control)
        self.aprender('limitadoabordesdepantalla')

    def actualizar(self):
        pass
            
class ScreaMy(pilasengine.actores.Actor):

    def iniciar(self):
        self.x = -200
        self.imagen = pilas.imagenes.cargar("aceituna.png")
        self.aprender('disparar', municion='Bala_S', angulo_salida_disparo=90,  frecuencia_de_disparo = 1.5)
        self.aprender("moversecomocoche")
        self.aprender('limitadoabordesdepantalla')

        #self.aprender(pilas.habilidades.MoverseConElTeclado, control=mi_control) 

    def actualizar(self):
        pass

puntaje_kenny = pilas.actores.Puntaje(x = 200, y = 150)
puntaje_scream = pilas.actores.Puntaje(x = -200, y = 150)

pilas.actores.vincular(ScreaMy)
pilas.actores.vincular(KennyS)


def crear_Kenny():
    KennyS = pilas.actores.KennyS()
    
def crear_ScreaMy():
    ScreaM = pilas.actores.ScreaMy()

def al_colisionar_S(bala, scream):
    puntaje_kenny.aumentar(1)
    scream.eliminar()
    bala.eliminar()
    crear_ScreaMy()
 
def al_colisionar_K(bala, kenny):
    puntaje_scream.aumentar(1)
    kenny.eliminar() 
    bala.eliminar()
    crear_Kenny() 


pilas.colisiones.agregar("Bala_S", "kennyS", al_colisionar_K)
pilas.colisiones.agregar("Bala_K", "screaMy", al_colisionar_S)



pilas.actores.vincular(Bala_K)
pilas.actores.vincular(Bala_S)                     

crear_ScreaMy()
crear_Kenny()


pilas.ejecutar() # Necesario al ejecutar en scripts.

Un abrazo.

Muchisimas gracias @jordinur!!! no puedo creer que ande! La verdad es que mirando el source code de la habilidad disparar he aprendido un monton de otras que estaban en la misma pagina web. Ahora voy a ver que es lo que les has cambiado al codigo por que al parecer le has sacado casi 100 lineas de codigo que estaban al vicio. Gracias de vuelta!!