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.