Repeticiones (no es urgente, pero conversemos xD)

Started by HenBanKeN, June 11, 2011, 09:04:46 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

HenBanKeN

Bien, cuando mi juego esté más avanzado, quiero tener un sistema de repeticiones de las mejores jugadas.
Por ejemplo, la partida termina, y muestra algunas repeticiones.

Había pensado en algo así como tener constantemente guardados los últimos 10 segundos de juego, por ejemplo, y si se detecta algun suceso que sea "memorable", esos 10 segundos se guarden en un archivo de video, y que el juego siga adelante.

Piensan que seria la manera correcta? Se apoyarían de algun otro lenguaje o algo asi?
Comparte tus ideas =O
Aún aprendiendo a manejar mis herramientas...

Futu-block

a todo esto y si viene al caso, ¿como puedo sacar un video del juego que estoy jugando??

y para responderte, se podria sacar unos snapshot cada x tiempo del juego que se vaya guardando en el mismo sitio para no ocupar una memoria inmensa

josebita

Sería un método, pero imagino que iría muy mal de rendimiento.
Lo mejor quizás sería ir guardando las cosas que van pasando (el usuario dispara, ...) y luego reejecutarlas, pero la verdad es que tendrás que darle más de una vuelta al tema.

Drumpi

La pregunta es interesante y compleja. Por un lado, podrías hacer lo de los snapshots, pero ocuparía demasiado y sería muy lento. Otra forma es que se pudiera capturar el buffer de pantalla antes de dibujarlo y mandarlo a un fichero, de esta forma se podrían generar videos AVI sin compresión, y al acabar el juego, usar el módulo de VLC para hacer la conversión (no sé si se le puede mandar la imágen directamente a VLC para que se lo añada al video).
En ambos casos el rendimiento es muy malo.

Las opciónes más viables son:

1: Guardar los datos más relevantes (posición, fichero, gráfico...) de todos los elementos que se muevan, a cada frame, en un fichero, y luego los reproduzcas. Siempre serán menos datos que todos los pixels de pantalla.
2: Ir almacenando a cada frame los botones que están pulsados y los que no, y enviárselos al protagonista a la hora de reproducir. Esto no funciona si algún elemento del escenario tiene algún RAND en su comportamiento, por lo que habría que optar por la alternativa anterior.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

la getscreen devuelve la ultima pantalla dibujada, o sea, que no hace procesamiento extra de ningun tipo, ahora si, el almacenarlo en un fichero si consumira.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

HenBanKeN

Vaya. Todas las opciones parecen viables, aunque muy engorrosas.

No conozco bien el funcionamiento de getscreen, intentaré experimentar un poco con ello.

Mi juego al parecer no consumirá muchos recursos, asi que quizás podría permitirme hacer algo así. Habría que probar.
Aún aprendiendo a manejar mis herramientas...

SplinterGU

si pensas salvar a disco cada pantalla, vas a depender de la velocidad del dispositivo, silo vas a hacer en caanoo/wiz, te veo mal... quizas la mejor opcion es salvar un par de frames por segundo y a memoria, consumira memoria dependiendo de la cantidad de frames por segundo que quieras almacenar, la cantidad de segundos y obviamente la resolucion, pero sera mucho mas rapido.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

KeoH

Quote from: Drumpi on June 12, 2011, 12:32:06 AM


1: Guardar los datos más relevantes (posición, fichero, gráfico...) de todos los elementos que se muevan, a cada frame, en un fichero, y luego los reproduzcas. Siempre serán menos datos que todos los pixels de pantalla.


Yo creo q esto es lo mas viable ... guardar las características de los procesos los últimos 5 segundos ... aunq habrá que hacerlo con los procesos mas representativos y no todos ... pero la cosa es probar a ver que sale xD

Va a hacer falta una Estructura/Tabla monumental para hacerlo me temo xDD

SplinterGU

Quote from: KeoH on June 13, 2011, 02:01:18 AM
Quote from: Drumpi on June 12, 2011, 12:32:06 AM


1: Guardar los datos más relevantes (posición, fichero, gráfico...) de todos los elementos que se muevan, a cada frame, en un fichero, y luego los reproduzcas. Siempre serán menos datos que todos los pixels de pantalla.


Yo creo q esto es lo mas viable ... guardar las características de los procesos los últimos 5 segundos ... aunq habrá que hacerlo con los procesos mas representativos y no todos ... pero la cosa es probar a ver que sale xD

Va a hacer falta una Estructura/Tabla monumental para hacerlo me temo xDD

si, es lo mejor, pero hay que guardar muchos datos, yo diria de todos los procesos, incluso si usas scroll, posicion del mismo, etc.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

HenBanKeN

Quote from: SplinterGU on June 12, 2011, 11:30:05 PM
si pensas salvar a disco cada pantalla, vas a depender de la velocidad del dispositivo, silo vas a hacer en caanoo/wiz, te veo mal... quizas la mejor opcion es salvar un par de frames por segundo y a memoria, consumira memoria dependiendo de la cantidad de frames por segundo que quieras almacenar, la cantidad de segundos y obviamente la resolucion, pero sera mucho mas rapido.

Igual eso me convence más, aunque justamente no se puede tomar ese camino para maquinas con consumo limitado de memoria...
Aún aprendiendo a manejar mis herramientas...

Drumpi

Lo de guardar las imágenes en disco, como digo es costoso, ya que como apunta Splinter, guardar en disco es tremendamente lento. Aun en una SD, que es lo más rápido que hay, puede no soportar ese volumen de datos a esa velocidad (sea la que sea), y acortaría su vida notablemente.
Sería más sensato tener las imágenes en memoria y esperar a terminar la partida antes de salvarlo todo tranquilamente en el disco, lo cual requiere una RAM muy generosa, a menos que puedas almacenarlas en memoria pero comprimidas, o bien tener un hilo de ejecución aparte encargada de ir guardando los datos según se pueda.

La solución de guardar los datos relevantes es, en mi opinión, la mejor. Quizás tengas que trabajar con una lista enlazada si no quieres estar escribiendo en un fichero durante la "grabación". En este segundo caso, no necesitas estructuras ni nada: usas GET_ID para crear una lista de los diversos procesos, y luego vas accediendo a sus datos.
El scroll no hace falta: si se mueve de forma manual es que va siempre a una velocidad constante, y si es de forma automática es que sigue a un proceso, y teniendo su X e Y ya se sabe su posición.

Pero bueno, es cuestión de pensar, porque hay muchas formas posibles de hacerlo (incluso teniendo acceso a los dirty_rects se podría encontrar un método).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

HenBanKeN

Huh, hay varias ideas buenas, aunque lamentablemente como no llevo ni una semana en Bennu, hay ciertas cosas que no sé bien cómo implementar. Con el tiempo lo haré, por suerte aprendo rápido, jeje.

Quote from: Drumpi on June 13, 2011, 08:14:36 PM
Sería más sensato tener las imágenes en memoria y esperar a terminar la partida antes de salvarlo todo tranquilamente en el disco, lo cual requiere una RAM muy generosa, a menos que puedas almacenarlas en memoria pero comprimidas, o bien tener un hilo de ejecución aparte encargada de ir guardando los datos según se pueda.

Si uno guarda las imágenes pero cada 2 frames, por ejemplo, quizás se pueda obtener una animación de menor calidad pero que sirva para su cometido... Como ya dijeron antes.

No sé, a mis ojos de novato esta forma me parece más simple xD

Aunque ya que he tenido experiencias anteriores con listas enlazadas, seguro será una buena idea comenzar a indagar respecto a su uso en Bennu. Voy a tomar nota de lo que dices  ;D

En todo caso, yo estoy pensando meramente en un replay de un juego 2D. No tengo mucha idea de cómo funciona el mundo de los juegos 3D (algo he leído... además de todo lo que he jugado claro xD) pero no sé por qué tengo la idea de que es más fácil hacer esto en ese tipo de juegos. Basta con recordar cuando jugaba FIFA '98 y había replays de diversos ángulos... Estoy equivocado respecto a esto?

Saludos!
Aún aprendiendo a manejar mis herramientas...

gecko

Lo que hacen esos juegos es grabar los comportamientos, posiciones, y acciones de los personajes, y despues el mismo motor del juego las reproduce... con la opcion de cambiar camaras, angulos, velocidad de reproduccion, etc...

Creo que seria la mejor forma de hacerlo, pero no es algo facil :P
Torres Baldi Studio
http://torresbaldi.com

JaViS

se me ocurre que podrias tener un proceso generico para reproducir repeticiones, algo asi como:

proccess repeticion()
begin
loop  
  frame;
 end
end

sin nada dentro, para que vos lo controles desde afuera.

luego, te engargas de guardar frame por frame el valor de todas las variables locales predefinidas de cada proceso que quieres repetir despues (x,y,graph,file,region, etc), al fin de cuentas, esas variables son las unicas importantes porque definen como se van a ver los procesos luego.

Para evitar guardar muchos datos, podrias guardar en cada frame solo aquellas variables que cambiaron con respecto al frame anterior.

luego, por cada proceso que grabaste, creas un proceso repeticion, y en cada frame le asignas las variables  locales que guardaste.

y listo!
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

si, la mejor forma es recorrer todos los procesos, guardar sus coordenadas, graficos, angulo, flags, size, size_x, size_y, paleta del grafico si esta cambiada, guardar toda variable importante como ser contadores de tiempo, puntaje, timers, guardar scroll si tienes, guardar valores de tablas blend si usas, guardar posicion de los fade (esta es dificil) y alguna otra cosa que se guro se me escapa.

la verdad que si bien (quizas) ocupara menos memoria, es muy engorroso tener todos los datos.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2