PDA

Ver la versión completa : recortar sdl_surface



robloz
13/11/2007, 20:31
Hola tengo una matriz de SDL_Surface la cual la estoy recortando en cuadrados del mismo tamaño pero la función: SDL_SetClipRect, no me recorta. ¿a qué se puede deber?
Gracias
---------------------------------------
img = IMG_Load(file);
for(int i=0; i<num; i++){
// copio la superficie completa
aux[i] = SDL_ConvertSurface(img, img->format, SDL_SRCCOLORKEY|SDL_RLEACCEL);
// recorto
SDL_SetClipRect(aux[i], &dest);// No me recorta
sp.Cargar(aux[i]);
dest.x += ancho;
}

swapd0
13/11/2007, 20:44
Que conste que no se SDL, pero SDL_SetClipRect lo que hace (suponiendolo de su nombre) es cambiar el rectangulo de clip. Asi cuando dibujes algo se recorta (clip) con este rectangulo, para no dibujar lo que quede fuera.

Veo que despues del SDL_SetClipRect, no dibujas nada. Solo llamas a cargar.

robloz
13/11/2007, 21:04
como al crear la superficie la ten&#237;a que crear con el mismo tama&#241;o que img ya que sino no me guarda las propiedades de transparencia de la imagen .png he hecho esto, aunque me parece un poco fullero:


aux[i] = SDL_ConvertSurface(img, img->format, SDL_SRCCOLORKEY|SDL_RLEACCEL);
aux[i]->w = ancho; // :-(
SDL_BlitSurface(img, &dest, aux[i], NULL);

Si se os ocurre algo mejor decidmelo porfi
Hab&#237;a mal interpretrado 'SDL_SetClipRect ' cre&#237;a que lo de clip era otra cosa. Gracias

Aiken
13/11/2007, 21:23
yo no parto la imagen, tengo una surface grande que contiene todos los graficos, y lo unico que a la hora de hacer el blit en pantalla pinto el trozo que me interesa.

para pintar el trozo que te interesa posiblemente lo hagas con blit como tu has puesto el ejemplo, y lo unico que necesitas es tener en algun lado guardado (un array por ejemplo) la informacion de de clip de todos los graficos.

PD. Y como recortarlos del la imagen grande sobre la marcha creo que no relentiza demasiado pues es un forma comoda, y eficiente pues no tienes que tener mogollon de surfaces pequeñitas ;)

Aiken

robloz
13/11/2007, 22:36
Buena idea.
Se me ha ocurrido otra idea para engañar a la función SDL_ConvertSurface, al menos de esta manera no tengo memoria desperdiciada aunque sigue siendo un poquito fullero



int aux_ancho=img->w;
img->w = ancho;
aux[i] = SDL_ConvertSurface(img, img->format, SDL_SRCCOLORKEY|SDL_RLEACCEL);
img->w = aux_ancho;
SDL_BlitSurface(img, &dest, aux[i], NULL);

Aiken
14/11/2007, 00:50
Bueno el convert surface lo que te hace internamente es un blit, y ademas te esta creando una surface nueva, asi que yo creo que tienes la misma memoria "desperdiciada".

por que no haces lo que te decia:

imagengrande = loadimagengrande()

//pinto el grafico uno
src = ancho y alto del grafico uno, y (x,y) de donde se encuentra dentro de imagen grande.
dest = x,y de donde quieres ponerlo en la pantalla
blithaciapantalla(imagengrande,&src,pantalla,&dest);

//pinto el grafico dos
las mismas tres lineas de antes

//pinto el grafico tres
las mismas tres lineas de antes


de esta forma la unica memoria que tienes ocupada es la de imagengrande

PD. como veras me he inventado las funciones porque no me acuerdo de memoria de la sintaxis de las reales ;)

Aiken

robloz
15/11/2007, 21:01
Me has convencido, lo har&#233; asi.
Gracias por todo

Zheo
18/11/2007, 17:43
Tener varias surfaces de blit, no te va a desperdiciar memoria en la mayor parte de los casos.

Si tienes una superficie enorma, ocupara mucho, poco menos que varias superficies más pequeñas que sumadas ocupen lo mismo que la grande. Y además para hacer los blits parciales de la superficie grande, necesitaras datos para saber qué parte has de blitear (posicion y tamaño) por lo que estas igual.
Por no hablar que teniendo varias superficies pequeñas, puedes cargar las que te interesen en cada momento, y sólo en ese momento.
No digo que en ciertos casos no sea útil, pero hay que mirarlo. Por ejemplo, para dibujar fuentes como bitmaps, lo más cómodo si es tener todas las letras en una superficie y ajustar el rectángulo de clip para dibujar sólo la que necesitas en cada momento.

Aiken
19/11/2007, 01:46
Por no hablar que teniendo varias superficies pequeñas, puedes cargar las que te interesen en cada momento, y sólo en ese momento.
No digo que en ciertos casos no sea útil, pero hay que mirarlo. Por ejemplo, para dibujar fuentes como bitmaps, lo más cómodo si es tener todas las letras en una superficie y ajustar el rectángulo de clip para dibujar sólo la que necesitas en cada momento.


hombre aqui estabamos hablando a nivel generico. La idea es saber que se puede tener varios frames en una sola imagen grande. Y tambien saber que lo suyo es dividirlo en varias imagenes grandes, agrupandolo como tu dices segun su uso, para poder cargarlos a necesidad.

lo que estaremos de acuerdo es que tan malo es tener una imagen grande como tener todos los fotogramas sueltos en archivos diferentes.


Yo lo que suelo hacer es que suelo tener cada personaje con todos sus frames de animaciones en una sola imagen. Digamos una imagen "grande" para la animacion de cada personaje ;)

Aiken

joanvr
19/11/2007, 01:54
hombre aqui estabamos hablando a nivel generico. La idea es saber que se puede tener varios frames en una sola imagen grande. Y tambien saber que lo suyo es dividirlo en varias imagenes grandes, agrupandolo como tu dices segun su uso, para poder cargarlos a necesidad.

lo que estaremos de acuerdo es que tan malo es tener una imagen grande como tener todos los fotogramas sueltos en archivos diferentes.


Yo lo que suelo hacer es que suelo tener cada personaje con todos sus frames de animaciones en una sola imagen. Digamos una imagen "grande" para la animacion de cada personaje ;)

Aiken

Más que nada ganas en comodidad a la hora de editar las imagenes, aunque deberas hacer cálculos adicionales para obtener la imagen. No se puede tener todo a la vez :P