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