Ver la versión completa : Sobre sprites
Hola a todos de nuevo...
como tengo unos días de vacaciones, pues me he puesto de nuevo con la GP2X y SDL. Ya he hecho algunos esqueletos de programa, y van bien, cargando imagenes, y todo eso.
El tema ahora es que no se donde crear sprites. ¿Hay algún programita especializado para esto que utiliceis vosotr@s para vuestros juegos?
Otra preguntita, para ir haciendo alguna cosa, he encontrado páginas de "Sprites Sheets". Algunas de las que me he bajado son bmps, pngs,... y el tema es como saco de ahí los sprites???? Se debe utilizar otro tipo de programa???
Si me podeis orientar, os lo agradecería mucho.
Bueno, me despido, y Feliz salida y entrada de año 2008!!!!
Jorge.
[wei2]
loixartx
30/12/2007, 19:36
Los sprites los puedes crear pixel a pixel, los puedes crear con alguna herramienta tipo FreeHand; el caso es que como tengas la misma soltura que yo dibujando vas apañao. :D
Algunas de las que me he bajado son bmps, pngs,... y el tema es como saco de ahí los sprites???? Se debe utilizar otro tipo de programa???
puedes programar tu codigo para que los lea directamente del spritesheet o recortarlos manualmente con cualquier programa de dibujo y ponerlos como necesites.
que yo sepa no hay dos spritesheets iguales, cada una va a su bola asi que es dificil que haya programas para "sacarlo".
Aiken
charlyBaby
03/01/2008, 12:13
Aiken, conoces algún juego sobre gp2x que tenga el código abierto en el que se carguen directamente los spritesheet sin necesidad de ir cortándolos uno a uno?
Me vendría de perlas ya que estoy precisamente metiendo los sprites en un juego que estoy programando.
Saludos.
^MiSaTo^
03/01/2008, 13:17
Aiken, conoces algún juego sobre gp2x que tenga el código abierto en el que se carguen directamente los spritesheet sin necesidad de ir cortándolos uno a uno?
Me vendría de perlas ya que estoy precisamente metiendo los sprites en un juego que estoy programando.
Saludos.
Por spritesheet entendemos que es una imagen con toda la animación? Porque si es así es simplemente haciendo una funcion que muestre un trozo de esa imagen para cada "paso" de la animación
Ok, gracias a tod@s por las respuestas.
El tema es que estoy comenzando con todo esto, y parece que me viene un poco grande. Os comentaba lo de los "sprite sheets" porque no soy muy mañoso haciendo dibujos y por la net he encontrado algunos, y me gustaría saber como sacarlos.
Por lo que comenta MiSaTo hay que sacar los sprites uno a uno de la página con una función. Entiendo que el ancho y el alto es el mismo para todas? Es que hay "sprites sheets" que tienen a veces unos tamaños diferentes en las secuencias, por eso era la pregunta de si habia que sacarlos de ahí uno a uno o bien existia algún tipo de programa.
Bueno, voy a continuar con el tema... :-)
Gracias a tod@s de nuevoooo!!!
^MiSaTo^
05/01/2008, 20:41
Ok, gracias a tod@s por las respuestas.
El tema es que estoy comenzando con todo esto, y parece que me viene un poco grande. Os comentaba lo de los "sprite sheets" porque no soy muy mañoso haciendo dibujos y por la net he encontrado algunos, y me gustaría saber como sacarlos.
Por lo que comenta MiSaTo hay que sacar los sprites uno a uno de la página con una función. Entiendo que el ancho y el alto es el mismo para todas? Es que hay "sprites sheets" que tienen a veces unos tamaños diferentes en las secuencias, por eso era la pregunta de si habia que sacarlos de ahí uno a uno o bien existia algún tipo de programa.
Bueno, voy a continuar con el tema... :-)
Gracias a tod@s de nuevoooo!!!
yo lo que he hecho es coger una imagen entera con toda la animacion y cargarla en memoria y luego pintar el trocito que me hace falta en cada momento. No se si me he explicado. Claro que cada trocito tenia el mismo tamaño.
Lo normal es que tengan los tamaños iguales, pero si es un sprite sheet como los que hago yo, pueden haber varios tamaños de sprite en el mismo sprite sheet... Para esto solo necesitas un contador que sepa cuando va a variar el tamaño.
Me explico fatal, es la hora de la birra xD :brindis:
En la mayoria de spriteshets q vas a encontrar los ponen a boleo y hacer una funcion q los recorte me parece bastante caotico, yo suelo ir recortandolos y poniendolos en una imagen nueva, a distancia centrada, asi la funcion que tengo recorta el ancho y alto sin problemas pq son todos iguales y no tengo q perder el tiempo contando si este se desplaza 10 pixels a la derecha, si el otro frame baja 4 pixels, etc,etc.
Hola a tod@s de nuevo...
como siempre gracias por vuestras sugerencias, así da gusto ir aprendiendo :rever:
Bueno, en la tarde de ayer, pues me dediqué a sacar los sprites de la "sprite sheet" y sacarlos a ficheritos BMP. El tema es que ya cargo una secuencia de imágenes, y las añado a un array dentro de una estrutura y el sprite muestra toda la secuencia de movimientos pero parpadea y va super deprisa, con lo que le puse un retardo (SDL_Delay) pero aún así parpadea un poco.
Os muestro un fragmento de mi código por si algo alguna cosa mal, y si me podeis indicar alguna sugerencia.
La estructura donde guardo la información del sprite es la siguiente:
#ifndef _spriteConejo_H
#define _spriteConejo_H
#include <SDL/SDL.h>
/************************************************** ****************************/
/* Estructura de datos */
/************************************************** ****************************/
#define MAX_IMG_CONEJO 7
typedef struct
{
int estado; //Estado en el que se encuentra el sprite (0=inicial|1=activo).
int x,y; //Posiciones x e y del conejo.
int posSpt; //Posición de sprite (que sprite se está dibujando).
SDL_Surface* imagen[MAX_IMG_CONEJO]; //Imagen actual que se está procesando.
}SptConejo;
/************************************************** ****************************/
/* Prototipos de funciones */
/************************************************** ****************************/
int cargarSpriteConejo(SptConejo*);
void dibujarSpriteConejo(SptConejo*, SDL_Surface*);
void liberarRecursos(SptConejo*);
#endif /* _spriteConejo_H */
En la función main tengo definido el bucle de programa de la siguiente forma:
...
//Blucle de programa.
int done = 0;
while (!done)
{
//Procesamos los eventos que se produzcan.
done = procesarEventos();
//Pintamos el sprite.
dibujarSpriteConejo(&sptConejo, pantalla);
//Actualizamos la pantalla.:)
SDL_Flip(pantalla);
}
//Fin While.
...
y la función de dibujo del sprite que le da movimiento es la siguiente:
/*================================================= ===========================*/
/* Función: dibujarSpriteConejo */
/* Desc : Se encarga de dibujar el sprite en la pantalla y asignar el si- */
/* guiente sprite a pintar. */
/*================================================= ===========================*/
void dibujarSpriteConejo(SptConejo* sptConejo, SDL_Surface* pantalla)
{
//Cogemos el sprite actual.
int posSpt = sptConejo->posSpt;
if(sptConejo->estado>0)
{
//Quitamos el sprite anterior.
SDL_Rect dstrectAnt;
dstrectAnt.x = sptConejo->x;
dstrectAnt.y = sptConejo->y;
dstrectAnt.w = sptConejo->imagen[posSpt]->w;
dstrectAnt.h = sptConejo->imagen[posSpt]->h;
SDL_FillRect(pantalla,&dstrectAnt,SDL_MapRGB(pantalla->format,0,255,0));
//Movemos el conejo por la pantalla.
if(sptConejo->x < pantalla->w)
{
sptConejo->x+=sptConejo->imagen[posSpt]->w/MAX_IMG_CONEJO;
sptConejo->posSpt++;
if(sptConejo->posSpt>=MAX_IMG_CONEJO)
sptConejo->posSpt=0;
//Fin If.
}
else
sptConejo->x=0-sptConejo->imagen[posSpt]->w;
//Fin If.
}
//Fin If.
SDL_Rect dstrect;
dstrect.x = sptConejo->x;
dstrect.y = sptConejo->y;
//Dibujamos el mapa de bits.
SDL_BlitSurface(sptConejo->imagen[posSpt], NULL, pantalla, &dstrect);
sptConejo->estado=1;
//Indicamos que haga una pausita. Esto va a depender de cada pc.
SDL_Delay(150);
}
Yo creo que he entendido bien el proceso de pintado, pero por lo visto no es así. Si me podeis dar alguna sugerencia bajo vuestra experiencia os lo agradecería.
Muchas gracias a tod@s,
Jorge.
charlyBaby
07/01/2008, 16:04
A ver si te puedo echar un cable. Yo el método que empleo para pintar es el siguiente:
/**************************************/
void Draw(SDL_Surface *screen, GAMEManager &gm, SDL_Surface *background)
{
Uint32 color;
SDL_Rect dest;
dest = (SDL_Rect) {0,0,SCREEN_WIDTH,SCREEN_HEIGHT};
if (background == NULL)
{
/* Borramos la pantalla*/
color = SDL_MapRGB(screen->format, 0, 0, 0);
SDL_FillRect(screen, &dest, color);
}
else
{
SDL_BlitSurface(background, NULL, screen, &dest);
}
/* Pintamos los sprites */
gm.M_pintaMANAGERS();
/* Volcamos la pantalla auxiliar sobre la que se muestra */
SDL_Flip (screen);
}
....
....
....
Uint32 milliseconds;
milliseconds=SDL_GetTicks();
bool salir = false;
while (!salir)
{
if (SDL_GetTicks()-milliseconds > TIEMPO_REFRESCO)
{
salir = HandleInput(gm);
Update(gm);
Draw(screen, gm, background);
milliseconds=SDL_GetTicks();
}
}
A su vez dentro del la invocación a:
gm.M_pintaMANAGERS();
lo que acabo haciendo es:
...
SDL_Rect dstRect;
dstRect.x = A_posx;
dstRect.y = A_posy;
dstRect.w = A_ancho;
dstRect.h = A_alto;
SDL_BlitSurface(A_bitmap, NULL, A_pantalla, &dstRect);
...
Bueno a ver si te vale esto. Suerte :-)
Muchas gracias CharlyBaby, me has dado una orientación que no tenia bien cogida. He dedicado un tiempito a mi demo, y ahora si que sale bien con tus indicaciones.
Ahora a continuar ampliando un poco más mis conocimientos en SDL.
Muchas gracias!
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.