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!