Digamos que tiene una animación que desea que suceda al disparar una bala. ¿Cómo conseguirías que aparezca la viñeta al final de la animación? Lo único que puedo averiguar es saber la duración de la animación y retrasar la configuración de la posición de las viñetas y activarla hasta que haya transcurrido ese tiempo. Me preguntaba si este es el mejor enfoque, ¿cómo manejan esto los demás?
EDITAR: Creo que estoy teniendo problemas para redactar la pregunta correctamente.
Respuestas:
Básicamente está en el camino correcto: necesita saber cuánto dura una animación para hacer este tipo de cosas. Las animaciones son más que una simple colección de cuadros, hay todo tipo de información a su alrededor que necesita. Por ejemplo, ¿cuántos cuadros hay, se repite la animación, qué tan rápido se reproduce (por ejemplo, 10 cuadros de animación por segundo o 25, o 60?). Cada animación se puede definir en términos de unos pocos datos, que algunos códigos de animación generalizados pueden ver y reproducir. Debería encapsular la parte de animación en su propio código, que no conoce nada excepto estas definiciones de animación y cómo mostrar los cuadros de imagen individuales. Es decir, tenga un objeto de animación que pueda cargar, comenzar a reproducir, detener la reproducción y decirle que renderice en una ubicación particular en la pantalla.
Un enfoque flexible es utilizar una especie de definición de animación para encapsular este tipo de información. Entonces, en lugar de solo decir "la animación X es todos estos cuadros, solo juega a través de ellos", obtienes algo un poco más complejo.
Por ejemplo, con algún tipo de formato de datos simulado
Entonces su código dice algo como:
La forma en que detecta eventos puede ser con el código de animación que le devuelve la llamada (es decir, cuando detecta un nuevo evento porque la animación se ha reproducido en un marco determinado, llama al código de su juego para informarle sobre el nuevo evento) o sondeando el animación así:
Puntos a tener en cuenta:
Si no necesita que se dispare la bala dentro de la animación, pero solo una vez que haya terminado, puede salirse con la suya con un sistema mucho menos complejo sin la noción de eventos. Pero aún querrá un sistema donde las animaciones se reproduzcan por sí mismas, sepan cuánto duran y puedan volver a llamar al código del juego cuando se complete una animación.
fuente
De alguna manera, tendrá que esperar hasta que se complete la animación y crear la viñeta en ese punto.
Solo establecer un temporizador funcionará, si está seguro de que su velocidad de animación es fija. Como una variación menor, podría tener un código interno en la viñeta que lo haga esperar invisible por un momento antes de aparecer y moverse.
Dependiendo de su plataforma de desarrollo, puede tener algún tipo de función de actualización de animación o devolución de llamada que le permitirá responder en el momento exacto en que la animación llega al punto deseado. Así es como lo haría con Flixel, por ejemplo.
fuente
addAnimationCallback
método de Flixel se puede usar en la entidad de disparo. En la función de devolución de llamada, puede ver si el cuadro actual de la animación de disparo es el cuadro que debería crear una entidad de viñeta. Si es así, puede agregar una viñeta en la pantalla.Respuesta directa: suponiendo que tienes una animación que quieres reproducir cuando el jugador presiona el botón 'disparar', y luego sale una bala después de que termine de jugar. Idealmente, debe evitar codificar el tiempo de animación y disparar la bala cuando la animación se complete (usando una función de devolución de llamada o algo, dependiendo de su plataforma). No puedo pensar en ningún otro método para hacer esto que no sea demasiado complejo.
Respuesta alternativa del diseño del juego: a menos que haya un muy, muy buena razón para hacerlo, evitaría tener un retraso al presionar el botón 'disparar' y hacer que aparezca la bala. A menos que la animación sea muy, muy corta (uno o dos cuadros, máximo, básicamente un destello de boca), hará que la respuesta del botón de disparo se sienta lenta, y será molesto para un jugador típico. Incluso si decide utilizar una animación antes de que salgan las balas (los juegos de rol y los juegos tácticos por turnos serían razones aceptables para hacerlo), pensaría en incluir una opción de "desactivar animaciones" en alguna parte, para permitir juego para moverse más rápido si el jugador quiere.
fuente
Como dice MrCranky; Mantenga la animación y la lógica separadas.
Pero lo más importante, la lógica debe seguir siendo la parte maestra .
Tenga en cuenta que controlar la interfaz de usuario desde las lógicas es la única forma de garantizar que podrá mantener, reutilizar y compartir sus lógicas más tarde (nuevo procesador, nuevo juego, versión del servidor sin un procesador ...)
fuente
En primer lugar, usaría un sistema de eventos (¿patrón de observador?) Para desacoplar partes del código. Esto no es solo para la animación, sino que ciertamente se aplica allí. Luego, el código de animación puede simplemente decir dispatchEvent (evento) y alguna otra parte del código escucha ese evento, sin que ninguna parte del código necesite conocerse entre sí.
Ahora, el código de animación debe tener una referencia al despachador de eventos (hecho fácilmente con inyección de dependencia) y debe tener algo de XML o JSON que realmente defina sus animaciones. Algo como:
Lea los datos al cargar la animación y haga que el código de animación envíe el evento cuando esté en ese cuadro durante la reproducción.
fuente