Estoy haciendo un juego estilo Mario con SDL, empece en Junio se puso peleón y lo dejé ahora lo he retomado, siempre que he buscado algo referente a SDL (desde como instalarlo para Devc++, hasta algunas dudas) el resultado estaba en esta pagina por eso he decidido formar parte de ella.
Bien ahora mi duda/trauma/frustración (porque me frustra... en serio) el Juego gráficamente consta de tres capas (SDL_Surface) una es el fondo, la segunda es el "nivel", que se construye a partir de un fichero de texto con tiles de 16*16px, y la tercera son los "objetos", es decir aquello con lo que interactuas también construida de la misma forma que el nivel.
El fondo es una imagen cargada directamente con IMG_Load().
Para el Nivel y los Objetos creo dos superficies con SDL_CreateRGBSurface() sobre las cuales voy poniendo las tiles.
El Nivel una vez creado no cambia para nada, pero en cambio los objetos si lo hacen y ademas resulta que es la capa de mas al frente (la puedo poner detras del nivel pero no detrás del fondo) para cambiarlo lo borro con SDL_FillRect() con un color negro puro y después vuelvo a dibujar las tiles con los cambios realizados, así una vez hecho esto hago SDL_SetColorKey() con el mismo negro, la misma profundidad... y se supone que debería hacerlo transparente, pero no, lo deja negro así que no veo el fondo ni el nivel.
Con la desesperación he intentado copiar la superficie, crearla de nuevo y después liberar la copia (no es copia profunda sino la copia de la dirección mediante los punteros) pero al hacer SDL_FreeSurface() me peta (en windows... en linux no aunque en linux tengo otros problemas.... XD)
Para ayudar un poco hago un "croquis" del codigo:
- Código: Seleccionar todo
- void CNivel::CargarObjetos(char *ObjFile){
 //....
 //leo un fichero y lo cargo en memoria TxtObjetos[y][x]
 //....
 //Creo la Superficie de los objetos
 ImgObjetos = SDL_CreateRGBSurface(SDL_SWSURFACE, 16*ANivel, 272, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);
 DibujarObjetos();
 }
 void CNivel::DibujarObjetos(){
 int i, j;
 SDL_FillRect(ImgObjetos, NULL, SDL_MapRGB(ImgObjetos->format,0,0,0));
 for(i=0;i<17;i++){//Doble bucle for que se encarga de leer TxtObjetos de memoria y dibujar en ImgObjetos
 for(j=0;j<ANivel;j++){
 switch(TxtObjetos[i][j]){
 case 'a':
 Objetos[0].SetX(j*16);
 Objetos[0].SetY(i*16);
 Objetos[0].Mostrar(ImgObjetos);
 break;
 case 'b':
 Objetos[1].SetX(j*16);
 Objetos[1].SetY(i*16);
 Objetos[1].Mostrar(ImgObjetos);
 break;
 case 'c':
 Objetos[2].SetX(j*16);
 Objetos[2].SetY(i*16);
 Objetos[2].Mostrar(ImgObjetos);
 break;
 case 'd':
 Objetos[3].SetX(j*16);
 Objetos[3].SetY(i*16);
 Objetos[3].Mostrar(ImgObjetos);
 break;
 case 'e':
 Objetos[4].SetX(j*16);
 Objetos[4].SetY(i*16);
 Objetos[4].Mostrar(ImgObjetos);
 break;
 default:
 break;
 }
 }
 }
 if(SDL_SetColorKey(ImgObjetos, SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(ImgObjetos->format,0,0,0))==-1){
 printf("Error al aplicar Transparencias.\n");
 }
 }
 //Funcion que se llama cada vez que se toca un objeto y se tiene que "quitar"
 void CNivel::QuitarObjeto(int x, int y){
 TxtObjetos[y][x]=0; //Pone a 0 el punto donde a partir de ahora no se dibujara nada
 DibujarObjetos(x, y); //Vuelvo a redibujar la superficie
 }
¿Hay algun tipo de incompatibilidad entre SDL_CreateRGBSurface() y SDL_SetColorKey()?
Todas las superficies tienen una profundidad de 32bpp ya que uso png's por tanto no creo que sea problema de la profundidad del color...
¿Me proponeis alguna alternativa?
Gracias.
DEW



 tengo que mirar porqué, pero supongo que una superficie de unos 272 * 1000 px será muy pesada de hay lo de la RAM...
 tengo que mirar porqué, pero supongo que una superficie de unos 272 * 1000 px será muy pesada de hay lo de la RAM...