conflicto enter getpixel y SDL_SetColorKey

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

conflicto enter getpixel y SDL_SetColorKey

Notapor maije » Jue Abr 10, 2008 12:35 pm

hola a tod@s. mi problema es el siguiente:

he creado una funcion que lo que hace es detectar una colision "tosca" entre dos sprites (con los bordes de anchura y altura de cada sprite), pero se quedaba corta para muchas cosas, porque no eran colisiones "reales" entre los contenidos de los bitmaps, asi que le he añadido un modulo de colision "fina" cuando detecta la otra, lo que hace es comprobar si los pixeles del rectangulo que surge de la superposicion de dos sprites son croma o no son croma y si estan superpuestos (colisionando). entonces eso funciona perfectamente, hago cualquier dibujo, le pongo un fondo croma (255,0,0 por ejemplo) y si le paso a la funcion que me detecte solo la colision fina, pues solo me detecta cuando algun color NO CROMA se superpone a un otro color NO CROMA del otro sprite, entonces, con eso funcionando, uso la funcion para quitar el fondo croma (SDL_SetColorKey), que funciona perfectamente, pero cuando los dos sprites entren en contanto (colision burda) da un error la funcion getpixel, en un else de comprobacion de profundidad de color, que supongo que causara conflicto con la profundidad de color del croma.... bueno, un jaleo, aqui os pego la funcion getpixel que es la "oficial" y la linea donde me da el error con su mensaje:

Código: Seleccionar todo
// Nota, código obtenido del wiki de SDL
// http://www.libsdl.org/cgi/docwiki.cgi/Pixel_20Access
Uint32 getpixel(SDL_Surface *surface, int x, int y)
{
    int bpp = surface->format->BytesPerPixel;
    /* Here p is the address to the pixel we want to retrieve */
    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

    switch(bpp) {
    case 1:
        return *p;

    case 2:
        return *(Uint16 *)p;

    case 3:
        if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
            return p[0] << 16 | p[1] << 8 | p[2];
        else
            return p[0] | p[1] << 8 | p[2] << 16;

    case 4:
        return *(Uint32 *)p;

    default:
        return 0;       /* shouldn't happen, but avoids warnings */
    }
}


me da error en el else del case 3:
Código: Seleccionar todo
First-chance exception at 0x004121d1 in colision.exe: 0xC0000005: Access violation reading location 0x00008020.
Unhandled exception at 0x004121d1 in colision.exe: 0xC0000005: Access violation reading location 0x00008020.


este error solo sale cuando empleo la funcion de colorKey, que me funciona perfectamente por lo general. la llamada a la funcion es esta y repito FUNCIONA:

Código: Seleccionar todo
void CFrame::load(char *path) {
   img = IMG_Load(path);
   // Asignamos el color transparente al color rojo.
   SDL_SetColorKey(img, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB(img->format,255,0,0));
   img=SDL_DisplayFormat(img);
}



espero que alguien pueda ayudarme
muchas gracias por adelantado
atentamente
maije
maije
 
Mensajes: 20
Registrado: Lun Dic 17, 2007 6:20 pm

solucionado

Notapor maije » Jue Abr 10, 2008 1:01 pm

buenas gente, ya encontre el problema y lo posteo por si acaso alguien mas lo tiene alguna vez :-) ya me lo agradecereis :P

cuando no usaba trasparencias, me llegaba la imagen y con un valor de pixels, pero al usar trasparencia, me daba valor al pixel de 0x000000 (null) cosa harto rara. pues bien, el problema se soluciona quitandole la aceleracion RLE a la funcion de trasparencia. asi funciona perfectamente.

entonces, la funcion de trasparencia tendria la siguiente llamanda:

Código: Seleccionar todo
SDL_SetColorKey(img, SDL_SRCCOLORKEY /*| SDL_RLEACCEL*/, SDL_MapRGB(img->format,255,0,0));



gracias maije, de nada maije :P
un saludo a todos
atentamente
maije
maije
 
Mensajes: 20
Registrado: Lun Dic 17, 2007 6:20 pm


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado