Ver la versión completa : recortar sdl_surface
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;
}
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.
como al crear la superficie la tenía que crear con el mismo tamañ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ía mal interpretrado 'SDL_SetClipRect ' creía que lo de clip era otra cosa. Gracias
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
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);
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
Me has convencido, lo haré asi.
Gracias por todo
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.
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
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
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.