Momento de Colisión

Buenas! Tengo una duda sobre colisiones, según estuve viendo las colisiones se dan en el momento en que dos objetos se tocan, pero no cuando dos figuras se intersecan o aparecen por defecto en la misma posición. Por ejemplo en el siguiente código, la aceituna solo va a decir ‘Hola, mundo!’ si me muevo en dirección a la banana y mantengo la barra espaciadora presionada, pero si muevo la aceituna hasta que se intersequen y después presiono la barra espaciadora, no pasa nada.

import pilasengine
pilas = pilasengine.iniciar()

p1 = pilas.actores.Actor(x= -50, imagen= 'aceituna.png')
p1.aprender('moverseconelteclado')
b1 = pilas.actores.banana()

def mi_colision(p1, b1):
     if pilas.control.boton:
           p1.decir('Hola, mundo!')

pilas.colisiones.agregar(p1, b1, mi_colision)

pilas.ejecutar()

Hola @giovannirescia, es cierto, las colisiones solo se notifican cuando comienza a producirse el contacto.

Tal vez lo que podrías hacer es crear una variable global para marcar el momento de la colisión, y luego usar esa variable para saber si se había producido el contacto. Algo así:

import pilasengine
en_colision = False

pilas = pilasengine.iniciar()

p1 = pilas.actores.Actor(x= -50, imagen= 'aceituna.png')
p1.aprender('moverseconelteclado')
b1 = pilas.actores.Banana()

def mi_colision(p1, b1):
     #print("inicia colision")
     global en_colision
     en_colision = True

def verificar(evento):
     #print("Pulsa tecla")
     global en_colision
     if en_colision and pilas.control.boton:
         en_colision = False
         p1.decir('Hola, mundo!')

pilas.eventos.pulsa_tecla.conectar(verificar)

pilas.colisiones.agregar(p1, b1, mi_colision)

pilas.ejecutar()

igualmente lo ideal sería que pilas te informe bien el contacto, lo voy a agendar para implementar en una versión futura.

Abrazo!

Perfecto, voy a adaptar eso a lo que necesito y veo cómo se porta…

Muchas gracias!

Saludos,
Giovanni

Como me imaginaba, me anduvo bien para el caso particular pero no puedo generalizarlo para todos los objetos de una clase. Por ejemplo, en el siguiente código cuando colisionan el Alien se centra con la Aceituna, pero solo con la que está definida en la definición del evento ‘verificar’:

    # coding: utf-8
    import pilasengine

    en_colision = False
    pilas = pilasengine.iniciar()

    class AceitunaGigante(pilasengine.actores.Actor):
        def iniciar(self):
            self.imagen = 'aceituna.png'
            self.escala = 3
            self.radio_de_colision = 50

    class ET(pilasengine.actores.Actor):
        def iniciar(self):
            self.imagen = 'alien.png'

    pilas.actores.vincular(AceitunaGigante)
    pilas.actores.vincular(ET)
    ag = AceitunaGigante(pilas)
    et = ET(pilas)
    et.aprender('moverseconelteclado')

    def mi_colision(ag, et):
         global en_colision
         en_colision = True

    def verificar(evento):
        global en_colision
        if en_colision and pilas.control.boton:
            en_colision = False
            ag.decir('Hola, mundo!')
            et.x = ag.x
            et.y = ag.y

    pilas.eventos.pulsa_tecla.conectar(verificar)
    pilas.colisiones.agregar(ag, et, mi_colision)

    pilas.ejecutar()

En las líneas

        et.x = ag.x
        et.y = ag.y

debería poder generalizar el objeto ‘ag’ para que el Alien se centre con cualquier objeto de la clase AceitunaGigante. Pero no sé cómo hacerlo…

Desde ya, muchísimas gracias!

Saludos,
Giovanni

Hola @giovannirescia, fijate que la función mi_colision va a recibir como argumentos los dos actores que entran en contacto. Podrías usar otra variable global, similar a “en_colision” pero para capturar el actor que entra en contacto.