En esta entrada veremos como ejecutar una animación una sola vez, configurando su funcionamiento por código, y cuando esta animación termine, ejecutar otra animación en bucle.
Preparando la animación
Cuando Arthur dispara su lanza este realiza una animación y luego el arma es disparada. Para conseguir este “efecto” crearemos una animación y al terminar esta se lanzará el arma.
Abre la hoja de sprites de Arthur, que creamos en los capítulos anteriores.

En la primera animación, NewAnimation, teníamos todos los sprites. Selecciónala, y luego selecciona las imágenes de Arthur lanzado el arma, pulsa el botón derecho del ratón, y en el menú emergente selecciona Create new animation from selection.

Nombra la nueva animación con Shot

Programando la animación
Para gestionar la animaciones debes añadir dos unidades nuevas a la cláusula uses. Esta son: CastleSceneCore y X3DNodes.

Crea una variable, en la sección private de la clase TmainView, llamada PlayerAnimationToLoop, la será de tipo String, y la usaremos para guardar el nombre la animación actual de Athur. Y que le servirá para luego recuperarla.

Añade un procedimiento a la sección Private que se llama PlayAnimationOnceAndLoop.

Este procedimiento tendrá los siguiente parámetros:
- Scene. Indica la escena a la que pertenece la animación
- AnimationNameToPlayOnce, indica la animación que se ejecutará una vez
- AnimationNameToLoop, indica la animación que se ejecutará una vez termine la animación anterior.
El código de este procedimiento es como sigue:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
procedure TViewMain.PlayAnimationOnceAndLoop(Scene: TCastleScene; const AnimationNameToPlayOnce, AnimationNameToLoop: string); var Parameters: TPlayAnimationParameters; begin Parameters := TPlayAnimationParameters.Create; try Parameters.Loop := False; Parameters.Name := AnimationNameToPlayOnce; Parameters.Forward := True; Parameters.StopNotification := {$IFDEF FPC} @OnAnimationStop; {$ELSE]} OnAnimationStop; {$ENDIF} PlayerAnimationToLoop := AnimationNameToLoop; Scene.PlayAnimation(Parameters); finally FreeAndNil(Parameters); end; end; |
Lo primero es crear un objeto de tipo TPlayAnimationParameters el cual nos sirve para configurar como funcionará la animación. A su propiedad Loop le asignamos el valor False de esta manera la animación solo se ejecutará una vez. Le asignamos el nombre que hemos recibido por parámetros en su propiedad Name. En el evento StopNotification le asignamos un procedimiento llamado OnAnimationStop. Guardamos el nombre de la animación pasada por parámetro en la variable.
PlayerAnimationToLoop. Y por último, a la escena pasada por parámetros le indicamos que ejecute una animación, según los parámetros que hemos preparado.
Por supuesto, al final de todo se libera el objeto.
El procedimiento OnAnimationStop es muy sencillo.
|
1 2 3 4 5 |
procedure TViewMain.OnAnimationStop(const Scene: TCastleSceneCore; const Animation: TTimeSensorNode); begin Scene.PlayAnimation(PlayerAnimationToLoop, True); end; |
Simplemente indicamos a la escena pasada por parámetros, se ejecute la animación PlayerAnimationToLoop, la cual hemos guardado antes en el procedimiento PlayAnimationOnceAndLoop, y que lo haga de modo continuo.
Solo nos queda modificar en la rutina Update, la línea que para la animación de Arthur si velocidad en el eje X es cero o no está en el suelo. Y dentro de este condicional añade la condición que solo detenga la animación si puede disparar.

De otra manera, nunca se podría ver la animación ya que esta línea detendría la animación.
Tienes todo el código fuente en el github.
Saludos
