PDA

Ver la versión completa : Limites de un Sprite!



A.r.R.c.H.E.r
31/12/2004, 10:22
Buenos días, tengo un pequeño gran problema con una función para dibujar sprites, el problemas es que cuando el sprite se sale parcial o totalmente de la pantalla lo que hace es dibujarlo en la otra página de video. A ver si alguien puede ayudarme porque no soy capaz de arreglarlo. Aquí os dejo la función.

/* DIBUJA SPRITES TRANSPARENTES */
void PutSprite(unsigned char *pix, int x, int y, int w, int h)
{
int i,j;
unsigned char *TFT=Picture+(240-(y+0)+240*(x+0));
for(j=h;j>0;j--,TFT-=240*w+1) for(i=w;i>0;i--) { if(*pix) *TFT=*pix; TFT+=240; pix++; }
}

Muchas gracias de antemano.

Puck2099
31/12/2004, 10:42
Eso seguramente sea porque los dos buffers de pantalla están definidos consecutivamente en la memoria de modo que si te pasas de las direcciones que ocupa uno de los buffers pues los sprites saldrán en el siguiente.

¿Has probado a usar las funciones "oficiales" en lugar de esa propia para los Sprites?

Saludos

Darumo
31/12/2004, 11:42
con limitar la zona de ram sobre la que escribir deberia bastar (y suerte que tienes porque si en vez de la otra pantalla llega a ser la ram del programa tenias cuelgue seguro, o pisotearias datos que a lo mejor te fueran utiles), no te queda mas remedio que poner unos IF extras, asi que controla que no se escriban pixeles con X e Y menores o mayores que la pantalla o tendras estos problemas. (de C no sabre, pero cabeza para estas cosas tengo)

Logann
31/12/2004, 11:45
Tambien podrias aplicar una especie de cliping, o sea modificar los indices i los limites de los for para que nunca pinte fuera de la pantalla.

oankali
03/01/2005, 16:42
Puck tiene razón, utiliza las funciones del SDK oficial.
Pero si quieres hacerlo manualmente, yo haría lo que dice Logann.
Aquí te pongo el código que utilizo para clipear mis gráficos.




// Clipear bitmap
//- Si está completamente fuera de pantalla, salir
if ((x >= clip_x + clip_w) || (y >= clip_y + clip_h))
return;
if ((x + width - 1 < clip_x) || (y + height - 1 < clip_y))
return;

//- Clipear X y Width
if (x < clip_x)
{
width -= clip_x - x;
bitmapx += clip_x - x;
x = clip_x;
}
if (x + width > clip_x + clip_w)
width = clip_x + clip_w - x;

//- Clipear Y y Height
if (y < clip_y)
{
height -= clip_y - y;
bitmapy += clip_y - y;
y = clip_y;
}
if (y + height> clip_y + clip_h)
height = clip_y + clip_h - y;

// A partir de aquí: x, y, width y height tienen valores válidos


Puede parecer mucho código, pero después te ahorras muchos ciclos de reloj al no tratar todos los puntos del gráfico.