Me preguntaba cómo implementar el viaje en el tiempo en un juego. Nada súper complejo, solo inversión de tiempo como lo que hay en Braid, donde el usuario puede retroceder / adelantar el tiempo en 30 segundos o lo que sea.
Busqué mucho en la web, pero mis resultados generalmente se referían al uso del tiempo como "son las 3:00" o un temporizador y tal.
Lo único que se me ocurrió fue usar 2 matrices, una para la posición x del jugador y la otra para la posición y del jugador, y luego iterar a través de esas matrices y colocar al personaje en esa posición a medida que retroceden / avanzan rápidamente. ¿Eso podría funcionar? Si funcionara, ¿qué tan grande debería ser la matriz y con qué frecuencia debo almacenar las x e y del jugador? Si no funciona, ¿qué más puedo probar?
¡Gracias por adelantado!
fuente
import universal.back2future.FluxCapacitor;
Respuestas:
La idea de matriz es más o menos cómo se implementó en Braid. Cuando las únicas cosas que actúan sobre un personaje son la gravedad, la entrada del teclado / joypad y otros caracteres, solo necesitas almacenar la posición y la velocidad en cada paso para saber todo lo importante sobre ese personaje. Si almacena 10 instantáneas por segundo por personaje, entonces todavía es menos de 50K por un minuto del historial de un personaje, fácilmente manejable en la mayoría de los sistemas, y también puede encontrar formas que son más eficientes.
fuente
Lea sobre el patrón de comando . Proporciona acciones para deshacer (y para volver a hacerlas más tarde). Eso manejaría más que solo la posición de un barco, sino todas las acciones que el jugador realiza.
Pero creo que su idea de matriz también es sólida.
fuente
(x+v)-v
puede no ser igual ax
.En lugar de tener dos matrices separadas, probablemente debería tener una clase que describa la posición del jugador (probablemente ya haya una clase Point en Java ... últimamente soy un tipo C #) y use una matriz única para mantener las posiciones pasadas.
Debe configurar un "anillo de búfer", lo que significa que cuando llegue al final de la matriz, vuelva al principio de la matriz, sobrescribiendo las entradas más antiguas. Si viaja en el tiempo, lo contrario es cierto (cuando llegue al principio, circule hasta el final).
Si desea mantener 30 segundos de datos pasados, debe conocer su velocidad de fotogramas si desea preasignar espacio y usar una matriz de tamaño fijo. Si renderizas el juego a 10 cuadros / segundo, multiplicado por 30 segundos, son 300 elementos.
fuente
GDCVault tiene una conferencia de Jon Blow (el creador de Braid ) en su sitio llamada The Implementation of Rewind in Braid por $ 3.95. Apuesto a que tiene la información que deseas;)
EDITAR: Probablemente no estará en Java, pero las ideas deberían ser válidas.
fuente
Como dijo Erik J , almacenar las posiciones pasadas del jugador como una colección de objetos puntuales en un buffer de anillo suena razonable.
Sin embargo, sugeriría usar una cola para implementar el búfer. Es mucho más barato actualizar que una matriz y no tiene que conocer su velocidad de fotogramas por adelantado:
Esto todavía no considera las velocidades de cuadro variables o lo que debería suceder si realmente viaja en el tiempo, por lo que le sugiero que guarde una marca de tiempo con cada entrada y verifique eso en su lugar:
¡Espero que esto ayude!
fuente
Hay un patrón de diseño llamado Memento , creo que es un punto de partida para un juego como Braid
http://en.wikipedia.org/wiki/Memento_pattern
Información adicional aquí: http://dofactory.com/Patterns/PatternMemento.aspx
fuente
Se lanzó un juego para XBox360 que involucraba la manipulación del tiempo. Era mediocre, así que no puedo recordar el título en este momento. De todos modos, en una entrevista con un desarrollador, describieron cómo manejaron la manipulación del tiempo:
Cada X cuadros (con valores más bajos de X que conducen a una manipulación más precisa), tomas una "instantánea" del mundo del juego en ese punto y lo asocias con un tiempo en el juego.
Mientras se juega a través del juego normalmente, en el tiempo, cada entrada y reacción contribuye al conjunto de instantáneas en algún momento en el futuro.
El mundo del juego luego itera entre la instantánea en el momento actual y la instantánea X fotogramas en el futuro.
Luego, cuando desee invertir el tiempo, simplemente configure la dirección del tiempo para que esté al revés, de modo que esté iterando entre los cuadros X del presente y de la instantánea en el pasado (mientras deshabilita la capacidad de crear instantáneas futuras).
fuente
Simplemente puede tratar el tiempo virtual del juego como otra dimensión similar al espacio. Entonces, ¿qué pasa en el tiempo desde el exterior es un simple movimiento n + 1 dimensional en el universo virtual del juego.
Suponiendo cierta interacción del usuario y algún tipo de sistema de física que determina el comportamiento de su universo cuando no hay entrada del usuario, todo lo que necesita registrar es el efecto de las interacciones del usuario (por ejemplo, cambios en los vectores de velocidad / aceleración de la dimensión n + 1) , ya que tu física debería ser reversible en el tiempo.
De esta forma, necesitarías mucha menos memoria para calcular el estado del universo del juego en cualquier coordenada de tiempo.
fuente
(x+v)-v
podría no ser igual ax
Digamos que una entidad tiene una velocidad, rotación, posición x e y. Estos son, con aceleración, los estados básicos de movimiento, valores, como se llame. Puede guardar los datos de dos maneras:
1. Guardar rotación, posición x e y
2. Guardar rotación, velocidad xy velocidad y
Si tiene una velocidad fija, también podría guardar solo la rotación, o guardar solo una velocidad para ambos ejes.
Es necesario guardar la rotación en los juegos, a menos que su entidad tenga una rotación estática, lo que no es en la mayoría de los casos.
Dicho esto, es necesario usar una lista de objetos para múltiples valores. Si tiene un buen sistema de temporizador, que, por ejemplo, llama a los métodos de actualización 20 veces en un segundo y, por lo tanto, es independiente de fps, puede crear una matriz de 20 * 30 objetos para almacenar los valores de movimiento que necesita durante los últimos 30 segundos . No se recomienda el uso de una matriz simple, ya que tendría que mover cada elemento de un índice a la izquierda de cada llamada de actualización.
Basado en esto, puede revisar la lista o lo que sea para regresar. Si realmente desea obtener un efecto "realista", use esta técnica para todos los objetos en movimiento. Pero esto está relacionado con el diseño del juego.
Si destruye objetos, recuerde agruparlos para asegurarse de no estresar a su amigo ordenado, el Sr. Garbage;)
fuente