Programación de Sprites

Temas relacionados con la programación y la actualización audiovisual
User avatar
Lenko
Usuario avanzado
Posts: 132
Joined: Fri May 16, 2003 12:14 pm
Location: Tenerife

Programación de Sprites

Postby Lenko » Wed Sep 01, 2004 4:06 pm

Quiero saber de qué manera tratáis los sprites en vuestros juegos 2D para realizar mi propia implementación.

Preguntas:
  1. ¿Cómo guardáis los frames?
    1. ¿En varias imágenes?
    2. ¿En una sola imagen que contenga todos los frames?
    3. ¿En una imagen animada (gif o png)?
    4. ¿En un formato propio?
  2. ¿Dónde guardáis la información adicional como la velocidad (cada cuanto tiempo cambia el frame) o el número de frames?
    1. ¿En un fichero aparte
    2. ¿Dentro del código?
  3. En caso de haber elegido la opción b) en la primera pregunta:
    1. ¿Dónde almacenáis la información del ancho y largo de cada imagen individual?
      • ¿Cómo un array o vector de imágenes (o su equivalente en cada librería como surfaces en SDL)?
      • ¿Cómo una sola imagen de la que se recorta el frame necesario cuando se necesita?
Un saludo.
- Lenko -
User avatar
addax
Administrador
Posts: 905
Joined: Mon Mar 31, 2003 10:17 pm
Location: Madrid
Contact:

Postby addax » Wed Sep 01, 2004 5:16 pm

Ufff qué buena encuesta, ¿por qué no se me habrá ocurrido a mí? :lol:

¿Cómo guardáis los frames?
- En una sola imagen que contiene todos los frames de la dirección concreta (una imagen distinta para cada dirección arriba, abajo, izquierda y derecha).

¿Dónde guardáis la información adicional como la velocidad (cada cuanto tiempo cambia el frame) o el número de frames?
- Dentro del código.

¿Dónde almacenáis la información del ancho y largo de cada imagen individual?
- Como una sola imagen de la que se recorta el frame necesario cuando se necesita.
Salu2,
Alex
User avatar
Lenko
Usuario avanzado
Posts: 132
Joined: Fri May 16, 2003 12:14 pm
Location: Tenerife

Postby Lenko » Fri Sep 03, 2004 1:55 pm

No me creo que nadie más haya tenido programar un sprite. ¿No os da pena que esté parado por vuestra culpa? :)

Muchas gracias addax, es lo que tenía pensado hacer en principio, pero no quiero meterme y que después hayan fórmulas más eficientes.
- Lenko -
User avatar
R Granado
Usuario avanzado
Posts: 124
Joined: Fri Jul 25, 2003 10:39 am

Re: Programación de Sprites

Postby R Granado » Fri Sep 03, 2004 7:39 pm

¿Cómo guardáis los frames?
- En varias imágenes (tantas imágenes como frames)

¿Dónde guardáis la información adicional como la velocidad (cada cuanto tiempo cambia el frame) o el número de frames?
- Dentro del código, aunque reconozco es más útil guardar estas propiedades en un fichero aparte (para reutilizar en otros juegos).

¿Dónde almacenáis la información del ancho y largo de cada imagen individual?
- Cómo un array o vector de imágenes (o su equivalente en cada librería como surfaces en SDL)
No importa cuantas veces fracase, inténtelo de nuevo
User avatar
Lenko
Usuario avanzado
Posts: 132
Joined: Fri May 16, 2003 12:14 pm
Location: Tenerife

Postby Lenko » Fri Sep 03, 2004 8:03 pm

Bien, ese es un punto al que quería llegar.

¿Qué es más rápido? ¿Tener en memoria todos los frames en una sola imagen y seleccionar en cada momento el "recorte" adecuado de la imagen o separar los frames al cargar el fichero y poner cada uno como elemento de un vector?
- Lenko -
User avatar
R Granado
Usuario avanzado
Posts: 124
Joined: Fri Jul 25, 2003 10:39 am

Postby R Granado » Fri Sep 03, 2004 10:02 pm

¿Qué es más rápido?
Depende de como lo organices.

Por ejemplo, si tienes los frames de un personaje en una imágen, no deberías colocar los frames horizontalmente, debes colocarlos verticalmente.

La razón es que al copiar uno de los recortes a la memoria de video, empezará copiando la linea horizontal superior, y depués para acceder a segunda linea horizontal deberá saltar una linea equivalente a todo el ancho de la imágen, repitiendose el proceso hasta acabar copiando la liena inferior del recorte. Haciendo esto te arriesgas a provocar fallos en la cache.

Si ordenas los frames en la imágen verticalmente no tendrás ese problema, ya que las lineas serán contiguas.

También deberías intentar que el acceso a los sprites no sea muy riguido, ya que si más adelante resulta que hay que añadir un sprite extra o has de tener un frame de distinto tamaño, entonces agradecerás haber pensado en ello antes y no tener que modificar código que fácilemte será conflictivo.
No importa cuantas veces fracase, inténtelo de nuevo
User avatar
IPerezG
Usuario avanzado
Posts: 102
Joined: Wed Apr 30, 2003 9:37 pm
Location: Sevilla
Contact:

Re: Programación de Sprites

Postby IPerezG » Sun Sep 05, 2004 11:24 am

  1. ¿Cómo guardáis los frames?
Yo personalmente utilizo una imágen diferente para cada fotograma, y las coloco de forma secuencial dentro de una tabla o similar, en el mismo orden en el que se reproduce la animación. A la hora de dibujarlos me resulta mucho más cómodo así. Eso no quita para que a veces lo guarde todo en una única imágen, y una vez cargada en el juego la divida en trozos, uno por cada imágen individual.
  1. ¿Dónde guardáis la información adicional como la velocidad (cada cuanto tiempo cambia el frame) o el número de frames?
Yo lo guardo dentro del código. A grosso modo, y en pseudocódigo, en cada fotograma de la pantalla (no me refiero aquí a los de la animación), y suponiendo que tenemos 4 fotogramas en la animación, y que el fotograma de la animación cambia cada 3 fotogramas de pantalla, hago más o menos lo siguiente:

datos_animación.fotograma++;
if(datos_animación.fotograma == 4 * 3)
{
datos_animación.fotograma=0;
}
dibujar_sprite(buffer, tabla_de_fotogramas[datos_animación.fotograma / 3], datos_animación.x, datos_animación.y);

Por supuesto, al dibujar el sprite, la división que se utiliza para calcular el índice de la tabla de sprites es una división entera.
  1. ¿Dónde almacenáis la información del ancho y largo de cada imagen individual?
Yo hago todos los fotogramas de una misma animación del mismo ancho y largo, lo que simplifica mucho las cosas. De todas formas, en Allegro (que es lo que yo utilizo) no necesitas saber estos datos para dibujar un sprite. De todas formas, si necesito saberlo, Allegro guarda todas las imágenes en una estructura BITMAP, que tiene las propiedades w y h con dichos valores. De esta manera, si "mapa" es un puntero a una estructura BITMAP, mapa->w me da el ancho de la imágen, y mapa->h la altura.
¡Ché, ché... Ché, documentación!
¡Ché, ché, los papeles del camión!
¡¿Que no de qué?!
User avatar
LordFred
Usuario avanzado
Posts: 175
Joined: Thu Jun 17, 2004 1:51 pm
Location: Barcelona
Contact:

Re: Programación de Sprites

Postby LordFred » Fri Sep 10, 2004 10:08 pm

Hola,
¿Cómo guardáis los frames?
En una sola imagen...
¿Dónde guardáis la información adicional como la velocidad (cada cuanto tiempo cambia el frame) o el número de frames?
Dentro del código. Con el remake del sirfred, la velocidad de cada frame en un array (hasta ahora había utilizado el mismo tiempo para todos los frames) y el número de frames en el código.
¿Dónde almacenáis la información del ancho y largo de cada imagen individual?
También utilizo el mismo ancho y alto para cada frame...
Un saludo...
y visita mi página en http://www.geocities.com/dcelemin
User avatar
exepotes
Usuario habitual
Posts: 16
Joined: Thu Jan 22, 2004 5:21 am
Contact:

Postby exepotes » Wed Nov 03, 2004 4:37 am

¿Cómo guardáis los frames?

En una sola imagen.

¿Dónde guardáis la información adicional como la velocidad (cada cuanto tiempo cambia el frame) o el número de frames?

Código.

¿Dónde almacenáis la información del ancho y largo de cada imagen individual?

Todos los frames del mismo tamaño, pero no creo que sirva para todos los juegos.
User avatar
Popolon
Usuario avanzado
Posts: 474
Joined: Tue May 13, 2003 2:31 pm
Location: Lloret de Mar
Contact:

Postby Popolon » Wed Nov 03, 2004 10:09 am

Pues yo normalmente tengo una función "create_tiles()", donde creo todos los frames, es simplemente una ristra de:

...
popolon_tiles.Add(create_tile("popolon.png",0,0, 32,32, 16,31)); /* x,y, dx,dy, hot_x,hot_y */
...

Que van creando objetos de clase TILE, que guarda toda la información que necesito.

Y sobre las animaciones, suelo crear una clase llamada "Animation" o "TileSequence", y al constructor le paso una cadena de caracteres como ésta: "F1W2F5W3F9W1G1" (que querría decir "frame 1, wait 2, frame 5, wait 3, frame 9, wait 1, goto 1"). Me va bastante bien (tomé la idea prestada del comando "PLAY" del basic).

En el motor para el MoG2, és un poco más complicado de lo que he explicado aquí (hay que añadir las máscaras de colisión, etc.), pero básicamente es parecido pero en lugar de estar la información en el código fuente, está guardada en un fichero .MG2, cuando el juego se inicia, se lee ese fichero y se crean todos los objetos TILE, ANIMATION, etc. que se necesiten.
User avatar
addax
Administrador
Posts: 905
Joined: Mon Mar 31, 2003 10:17 pm
Location: Madrid
Contact:

Postby addax » Wed Nov 03, 2004 10:46 am

¡Cómo se nota que eres un hombre del MSX! ¿El comando PLAY del BASIC? ¡Qué gran commando! Solfeo en una sola cadena 8) (notas, octavas, duraciones, silencios,...) ¿Y qué me dices del SOUND? Esos sonidos de explosiones, de ollas express,... :wink:
¡Qué grande!

(y perdón, creo que con el entusiasmo no me he dado cuenta de que me salía del tema)
Salu2,
Alex
User avatar
Popolon
Usuario avanzado
Posts: 474
Joined: Tue May 13, 2003 2:31 pm
Location: Lloret de Mar
Contact:

Postby Popolon » Thu Nov 04, 2004 11:08 am

jaja, explosión? olla express? no eran esos 2 justo los ejemplos que había en el manual de BASIC que venía con el ordenador sobre el comando sound? jajaja buenísimos!!!
User avatar
addax
Administrador
Posts: 905
Joined: Mon Mar 31, 2003 10:17 pm
Location: Madrid
Contact:

Postby addax » Thu Nov 04, 2004 11:46 am

sip, eran esos ejemplos y venían con dibujito y todo :wink:
Salu2,
Alex
User avatar
Lenko
Usuario avanzado
Posts: 132
Joined: Fri May 16, 2003 12:14 pm
Location: Tenerife

Postby Lenko » Sun Jan 16, 2005 9:32 pm

Para no abrir otro hilo para esto.

Hace unos días han publicado la versión 0.2 de la SDL_Animation, una librería para realizar animaciones de sprites utilizando XML externo.

Por lo que tengo entendido el único "pero" que le veían a la anterior versión es que era un poco lenta con ordenadores antiguos. Creo que en esta no lo han arreglado pero sí que han mejorado otras cosas.
- Lenko -

Return to “Desarrollo”

Who is online

Users browsing this forum: No registered users and 4 guests