Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Guardar Replays

Iniciado por ethernet, 01 de Septiembre de 2005, 05:27:31 PM

« anterior - próximo »

ethernet

 Estaba pensando en guardar replays, para ello he pensado en capturar las pulsaciones de teclado en cada frame y reproducirlas después. El problema que me viene a la cabeza es que el tiempo de frame puede que no sea idéntico en el momento de la grabación que en el de la reproducción y exista un offset de teclas (XD). Cómo se os ocurre a vosotros?

CoLSoN2

 Yo era como siempre he pensado que se hacía, guardando pares de .

Luego al reproducirlos, si inicialmente tu sistema de input va por eventos que se llaman en cualquier momento que se presione una tecla, en vez de usar un buffer y procesarlos luego todos, sí que es posible que tengas algún problema, pero supongo que todo depende de si al reproducirlo estás en una máquina muy lenta y ese offset es tan significativo como para que sea visible, no?

EDIT: Mírate el PopCap Framework que tiene un sistema de grabación de demos. Aunque más que replays, simplementa graba todo todo, para reproducir fielmente algunos bugs y tal. Pasándole nosequé parámetro al ejecutable guardaba todo lo que hacías en un fichero, y con otro parámetro lo reproducía.  
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

ethernet

Cita de: "CoLSoN2"Yo era como siempre he pensado que se hacía, guardando pares de .

Luego al reproducirlos, si inicialmente tu sistema de input va por eventos que se llaman en cualquier momento que se presione una tecla, en vez de usar un buffer y procesarlos luego todos, sí que es posible que tengas algún problema, pero supongo que todo depende de si al reproducirlo estás en una máquina muy lenta y ese offset es tan significativo como para que sea visible, no?
No lo he probado, pero ahora mismo lo pruebo. Dame 10 minutos :)

ethernet

 Funcioan asombrosamente bien, eso sí, en la misma máquina, habría que verlo con deltas diferentes.


class KeyBoardController:
def __init__(self,keys = [K_UP,K_DOWN,K_LEFT,K_RIGHT],save_keys= 0):
 self._keys = keys;
 

 self._keys_saved = [];
 self._save_keys = save_keys;
 
 #reproduccion
 self._active_key = 0;
 
 self._replay = 0;

def SaveKeys(self,file):
 packer.save(self._keys_saved,file);
def Replay(self,file):
 self._keys_saved = packer.load(file);
 self._replay = 1;
 
 
def Tick(self,car,delta = 0):

 
   global Gkeys;

   if(self._save_keys):
    k = [Gkeys[self._keys[0]],Gkeys[self._keys[1]],Gkeys[self._keys[2]],Gkeys[self._keys[3]]];
    self._keys_saved.append(k);
 
   if(self._replay):
    Gkeys[self._keys[0]],Gkeys[self._keys[1]],Gkeys[self._keys[2]],Gkeys[self._keys[3]] = self._keys_saved[self._active_key];
   
    self._active_key+=1;
                 # mover el muñeco  con las teclas pulsadas :)




tewe76

 La solución que uso yo en mis juegos es la siguiente:
Coloco un timer con intervalo de 20ms. En cada evento del timer provoco un keydown de la tecla "Impr Pant" ("Imprescindible Pantalones", para el que no lo sepa), con lo que tengo una captura de la pantalla en el portapapeles de Windows. Entonces guardo los datos del portapapeles a disco, usando un formato gráfico propio (".jpg", es posible que lo hayáis visto alguna vez por internet). Cuando ha terminado la captura de todos los frames individuales, llega el momento de unirlos en un solo archivo de vídeo. Para ello, he encapsulado una DLL de edición de vídeo (también creada por mi, "premiere.dll") en el ".frm" principal del juego (es importante que sea en el principal). Haciendo una llamada a la función "Arrejúntalos()" de dicha DLL, pasándole como parámetro una matriz con las rutas de los archivos ".jpg", consigo un vídeo en formato ".wmv". Cuando quieras replayear la escena, simplemente usas DirectVideo para reproducir el archivo ".wmv" y ya está. Todo ésto es transparente al usuario.

PS: si te interesa, te puedo pasar código comentado de todo lo que te digo.
PS2: lo he testeado sobre Windows y Linux y funciona. En Mac no lo he probado, pero no hay motivos para que no funcione. Después de todo, está programado con java, html y mdb, todo es estandar, vamos.
Nota: alguno puede pensar "en Linux no existe el portapapeles de Windows". Efectivamente, así es. Para solucionarlo, lo que hace mi código es, si comprueba que el SO no es Windows, abrir el puerto 6661 y enviar a través de él los datos de la captura al servidor de "www.microsoft.com\tewe76" (gracias Guillermo por cederme espacio en tu web, saludos a tu mujer). Todo ésto sigue siendo transparente para el usuario, por supuesto.
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

ethernet

 tewe, no me refiero a guardar el replay en video, me refiero a guardar los datos imprescindibles para que el motor reproduzca lo que hizo el user. No obstante tu técnica es curiosa de cojones XDD.

tewe76

 
Citarno me refiero a guardar el replay en video, me refiero a guardar los datos imprescindibles para que el motor reproduzca lo que hizo el user
Ya, ya lo sé. Te he dicho que es transparente al usuario.
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

Ray

 Dado que los frames y los tiempos de ejecución no se repiten exactamente igual (ni en la misma maquina), y cualquier diferencia de tiempo por mínima que sea en la pulsación puede modificar completamente todo el desarrollo (suponiendo que se trate de un juego), la verdad me parece imposible que se pueda hacer así.

Creo que deberías hacer una grabación larga cuando lo consigas para asegurarte.

Grugnorr

 Apostaría por que la IA sea independiente del framerate:

Jare y su Fixed Time Stamp Loop

En Gamasutra apareció un artículo sobre Replays en juegos, échale un ojo.

hat the hells!

samsaga2

 No tienes unicamente el problema del tiempo cualquier uso de una funcion random lo echaria abajo. Creo que la mejor forma es ir guardando cada cierto tiempo la posicion y velocidad/aceleracion (o las propiedades que hagan falta) de cada objeto.

senior wapo

 El tema de los rands no es problema alguno, lo que haces es usar en tu juego una función propia de random (aunque sea una tabla circular precalculada) y simplemente guardar en la demo el estado actual de la semilla.

El par (evento+frame_number) y simulación por pasos fijos debería ser lo mas fiable. Durante el juego normal no proceses los eventos de teclado cuando te los manda el Sistema Operativo, sino que los encolas y que sean procesados en el siguiente paso de simulación.

La cosa es elegir bien los pasos de simulación por segundo, creo que DOOM1 usaba 30Hz y DOOM3.... ¿ 60 ?

NOTA: Donde pongo numero de frame se entiende frame de simulación, no de rendering...

ethernet

Cita de: "Grugnorr"Apostaría por que la IA sea independiente del framerate:

Jare y su Fixed Time Stamp Loop

En Gamasutra apareció un artículo sobre Replays en juegos, échale un ojo.
Venía pensando en ese artículo en el autobús :)

Grugnorr

Cita de: "senior wapo"El tema de los rands no es problema alguno, lo que haces es usar en tu juego una función propia de random (aunque sea una tabla circular precalculada) y simplemente guardar en la demo el estado actual de la semilla.

Basta con usar la función standard guardando su semilla, o me pierdo algo?  :huh:  
hat the hells!

samsaga2

Cita de: "Grugnorr"
Cita de: "senior wapo"El tema de los rands no es problema alguno, lo que haces es usar en tu juego una función propia de random (aunque sea una tabla circular precalculada) y simplemente guardar en la demo el estado actual de la semilla.

Basta con usar la función standard guardando su semilla, o me pierdo algo?  :huh:
Ricemos el rizo (mas que nada por putear :P) y si entre version y version del juego cambias la funcion rand? Los relplays no serian compatibles.

CoLSoN2

Cita de: "samsaga2"Ricemos el rizo (mas que nada por putear :P) y si entre version y version del juego cambias la funcion rand? Los relplays no serian compatibles.
¿Qué función rand? Se supone que usas la de la librería estándar de C, y sólo guardas la semilla.

Aunque lo de que en diferentes versiones dejen de funcionar las replays antiguas no es nada nuevo, en según qué parches de WarCraft3 pasa esto, no estoy seguro si en otros juegos como AoE 2 o StarCraft también. Aunque en el SC lo que sí pasa es que a veces las replays se "estropean" o algo, y no muestran lo que realmente pasó en la partida, suelen acabar en el tiempo que toca, pero las unidades no hacen lo mismo. Y hablo de reproducir replays que se grabaron en el mismo PC. Raro, eh? XD  
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.