Ayuda SDL surfaces y getpixel

Hola a todos, perdón por estar siempre por aquí dando la lata con dudas ein? , estoy desarrollando un juego de plataformas en SDL con C y ya tengo las colisiones con el escenario, sólo que me surge un problema:


En mi código declaro dos surfaces: (todo fragmentos dentro del main)

SDL_Surface *screen;
SDL_Surface *subfondo;
SDL_Surface *fondo;
...
screen = SDL_SetVideoMode(480, 272, 8, SDL_HWSURFACE);
subfondo = SDL_SetVideoMode(480, 272, 8, SDL_HWSURFACE);
...

luego lo renderizo

Renderiza(&pfondodurezas, subfondo); //esta en memoria y la bliteo en la surface subfondo

imprimir(screen, fondo, 0, 0); //esta es un IMG_Load que bliteo en screen
RenderizaAnimacion(&jugador, screen); //esta esta en memoria que se blitea en screen

y al final detecto si el color es amarillo ( y lo uso en las funciones de movimiento):
unsigned char r, g, b;
GetPixel(subfondo, jugador.x + jugador.ancho / 2, jugador.y + jugador.alto, r, g, b);



El problema está en que si no renderizo el fondo "imprimir(screen, fondo, 0, 0)" va todo bien, pero si lo hago se van a tomar por saco las colisiones (detecta el color del pixel de screen y no de subfondo)

La idea es que cargue primero el subfondo con colores primarios de las colisiones, luego encima cargar el fondo bonito que se va a ver y al final la imagen del jugador, y que siga detectando el color de la surface inferior.

¿Alguien me puede decir qué hago mal? (y cómo solucionarlo también si puede ser)

Saludos y muchas gracias!

PD: La función que uso en mi código para detectar el pixel es ésta:
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 */
}
}
// Decodificamos el color en sus 3 componentes R, G y B
SDL_GetRGB(color,pantalla->format,&r,&g,&b);
}

-------------------------------------------------------------------------------------------------------------------

bueno, como nadie me responde me respondo yo, aunque sea sólo por si alguien necesita esta información alguna vez:

El error se soluciona sustituyendo ésto:

subfondo = SDL_SetVideoMode(480, 272, 8, SDL_HWSURFACE);

por ésto otro:

subfondo=SDL_DisplayFormat(screen);


y ya funciona perfectamente mi sistema.

Aunque querría hacer una anotación a pie de página: éste método de colisiones hace que pierda velocidad el juego (y aún no lo he visto en una portatil... ) y sólo con las colisiones, ya que aún no he programado enemigos ni items ni paridas.

Supongo que lo suyo sería un sistema de tiles... ummmm, se me ocurre la idea de hacer las colisiones por tiles detectando su color y así ahorrar memoria en cargar la imágen (a expensas de perder algo de suavidad en el movimiento, aunque si hiciera los tiles de 5x5 pixels o incluso menos... habrá que probar )


Y una pregunta de esas sin respuesta en el universo ¿como puñetas lo hicieron el equipo que hizo Metal SLug xq menos ram que yo seguro que tenian... ?
Venga saludos a todo el mundo!




Edito de nuevo:
He recuperado la velocidad cargándolo todo desde memoria, ahora voy a portarlo a la PSP a ver si es verdad... ahora edito y pongo mis conclusones


Conclusión: pantallazo negro en psp al portarlo, algo abré hecho mal [mamaaaaa] [qmparto] ... sigo intentando
Saludos!
0 respuestas