Detener movimiento del Actor

Hola, les consulto si habría alguna forma de que, con el actor con capacidad de movimiento sencilla (if self.pilas.control.boton), “perdiera” esa habilidad, o no pudiera usarla al comenzar una funcion.

Los pondré en contexto: Al acercarte a un portal, tu ubicacion cambia al centro del portal, empiezas a girar, y te cambia de posicion. La cosa es que, durante esas acciones, el personaje es capaz de moverse y salir del portal. Alguna idea? gracias desde ya :smiley:

En la función crea una variable de tipo bool(True or False) y que en el if.self.pilas.control.boton pregunte si la variable es verdadera o false, si es falsa que te deje caminar, si es verdadera que no.

Se me ocurre un truco que podría funcionar también:

En un juego llamado “pesadilla de calabazas” tenía un protagonista que se movía con el teclado, de un lado al otro de la pantalla. Pero cuando una calabaza lo golpeaba mi intención era que se mostrara un movimiento chistoso de muerte pero sin permitirle al usuario moverse. Algo así:

Sin embargo hacer que el mismo actor se comporte muy diferente luego de la colisión es un poco difícil. El truco que me sirvió en ese momento consiste en cambiar un actor por otro. En mi caso estába el actor Vampiro (que se podía mover) y el actor VampiroMuriendo, que solamente realizaba la animación.

Armé un ejemplo que reproduce el truco, es mucho mas sencillo de lo que parece. Vas a ver al personaje que se puede mover con el teclado, y si pulsas la tecla “espacio” el personaje muere (realizando el cambio de un actor por otro).

(ah, copiá este archivo en el directorio del juego para que puedas ver el funcionamiento bien, se tiene que llamar protagonista.png)

import pilasengine
pilas = pilasengine.iniciar()

VELOCIDAD = 6

class Vampiro(pilasengine.actores.Actor):

    def iniciar(self):
        self.imagen = pilas.imagenes.cargar_animacion("protagonista.png", 6)
        self.y = -155
        self.escala = 0.75
        self.radio_de_colision = 30

        self.imagen.definir_animacion('parado', [2], 10)
        self.imagen.definir_animacion('caminar', [3, 4, 5, 4], 15)


    def actualizar(self):
        
        if pilas.control.izquierda:
            self.x -= VELOCIDAD
            self.imagen.cargar_animacion('caminar')
            self.espejado = True
        elif pilas.control.derecha:
            self.x += VELOCIDAD
            self.imagen.cargar_animacion('caminar')
            self.espejado = False
        else:
            self.imagen.cargar_animacion('parado')


        self.imagen.avanzar()
        
        # Si pulsa espacio, muere!!!
        if pilas.control.boton:
            self.eliminar()
            actor_nuevo = pilas.actores.VampiroMuriendo()
            actor_nuevo.x = self.x
            actor_nuevo.y = self.y
            actor_nuevo.aprender('rebotarComoPelota')
            actor_nuevo.empujar(-10, 40)
            
            explosion = pilas.actores.Explosion()
            explosion.x = self.x
            explosion.y = self.y
            explosion.escala = 5
            
        
class VampiroMuriendo(pilasengine.actores.Actor):

    def iniciar(self):
        self.imagen = pilas.imagenes.cargar_animacion("imagenes/protagonista.png", 6)
        self.imagen.definir_cuadro(1)
        self.escala = 0.75
        
    def actualizar(self):
        self.rotacion += 10;

class ComportamientoNormal(pilasengine.comportamientos.Comportamiento):

    def iniciar(self, receptor):
        self.receptor = receptor
        self.receptor.imagen.cargar_animacion('parado')

    def actualizar(self):
        if pilas.control.derecha or pilas.control.izquierda:
            self.receptor.hacer_inmediatamente('ComportamientoCaminar')

        if pilas.control.arriba:
            self.receptor.hacer_inmediatamente('ComportamientoSaltar')



pilas.actores.vincular(Vampiro)
pilas.actores.vincular(VampiroMuriendo)

vampiro = pilas.actores.Vampiro()
pilas.avisar("Pulsa espacio para eliminar al actor")
pilas.fisica.eliminar_paredes()
pilas.fisica.eliminar_suelo()
pilas.fisica.definir_gravedad_y(-100)

pilas.ejecutar()

Debería quedarte algo así:

Observá que el truco que te comento está justo debajo del comentario que dice “# Si pulsa espacio, muere!!!”

Con respecto a tu juego, me imagino que podrías tener un actor Protagonista (con la habilidad de moverse) y un actor “ProtagonistaTeletransportándose” que solamente haga una animación. De esa forma, cuando llegas a un portal, simplemente podrías cambiar un actor por otro, es decir, eliminar el Protagonista, crear el actor ProtagonistaTeletransportándose en la misma posición, y luego volver a crear otro actor si hace falta volver al actor que se puede mover.

Ojalá te sirva el truco, cualquier cosa escribinos!

Buena idea, intentaré hacerlo con un segundo actor o “actor falso”, gracias :smiley:
Otra duda… Estoy por terminar mí juego y me gustaría que fuera usado como ejemplo, o subirlo en algún lado, se puede subir aquí?

claro!, subilo aquí directamente!