Detectar zona de "invasión"

Puedo declarar en un actor una zona de acción?. Por ejemplo quiero definir un objeto ventilador… cuando un actor entra en la zona de viento hacer algo

Sí, el atributo “radio_de_colision” se puede usar para eso:

Por ejemplo, podrías crear el actor ventilador, darle un radio de colisión como estoy
haciendo ahí con el mono. Y luego definir qué quieres que haga por medio de una
función y una colisión:

https://pilas.readthedocs.org/en/latest/colisiones.html

Claro, pero si mal no tengo entendido, probocaría una realimentación (una recursividad o algo así) y no logro hacer que “influya” levemente
prueben este código a ver si se entiende:

import pilas
pilas.iniciar()

m=pilas.actores.Mono()
m.radio_de_colision=100
p=pilas.actores.Pelota(70,150)
p.aprender(pilas.habilidades.Arrastrable)
m.aprender(pilas.habilidades.Arrastrable )

def zona(mono,pelota):
----pelota.empujar(0.1,0)

pilas.escena_actual().colisiones.agregar(m,p,zona)
pilas.ejecutar()

ahhh… claro, pasa que en realidad la función “zona” se va muchas veces, hasta que el mono y la pelota dejen de estar en contacto…

Si incluís un “print” justo debajo de la linea “pelota.empujar(0.1, 0)” vas a ver
que se llama muchas veces…

Se me ocurre que una forma de evitarlo es tener una variable que inhabilite las colisiones por unos segundos.

Algo así:

puede_colisionar = True

def zona(mono, pelota):
    if puede_colisionar:
        pelota.empujar(0.1, 0)
        puede_colisionar = False
        regresar_a_true_luego_de_dos_segundos()

def habilitar_colisiones():
    puede_colisionar = True

def regresar_a_true_luego_de_dos_segundos():
    pilas.escena_actual().tareas.una_vez(2, habilitar_colisiones)