PDA

Ver la versión completa : Ayuda con SDL



ArChEr
11/10/2007, 17:56
Muy buenas, estoy trasteando un poco con SDL para ver que tal va, y he echo una pequeña prueba, en windows me funciona perfectamente pero cuando lo pongo en la GP2X se queda la pantalla en negro y no hace nada... :S

Pongo el codigo aqui a ver si encontrais algun error o algo que no funcione en la gp2x, asias por adelantado.

int main(int argc, char *argv[])
{

SDL_Surface *fondo;
SDL_Rect fondorect = { 0, 0, 320, 240 };

// Inicializa el modo grafico a 320x240,, 16bpp, doble buffer y pantalla completa
screen = SDL_SetVideoMode(320, 240, 16, SDL_SWSURFACE | SDL_DOUBLEBUF );

// Elimina el cursor del raton
SDL_ShowCursor ( SDL_DISABLE );

// Carga la imagen de fondo
fondo = SDL_LoadBMP( ".//data//fondo.bmp" );

Uint32 x = 10, y = 10;

// Bucle
do
{
SDL_PumpEvents ( );
keystate = SDL_GetKeyState(NULL);


SDL_BlitSurface( fondo, &fondorect, screen, &screenrect);

Uint32 a = SDL_MapRGB(screen->format, 255, 200, 100);
SDL_Rect rect = {x, y, 50, 50};

SDL_FillRect(screen, &rect, a);

x++;

// Intercambia las paginas de video
SDL_Flip( screen );

} while ( !keystate[SDLK_ESCAPE] );

SDL_Quit();
return 0;
}

Propeller
11/10/2007, 18:09
Prueba a cambiar la ruta de carga de la imagen a "data/fondo.bmp"

Propeller

ArChEr
11/10/2007, 18:29
Prueba a cambiar la ruta de carga de la imagen a "data/fondo.bmp"

Propeller

sigue igual...


Puede ser problema del doble buffer?

Propeller
11/10/2007, 18:31
Prueba con HWSURFACE en vez de SWSURFACE.

Propeller

ArChEr
11/10/2007, 18:34
Prueba con HWSURFACE en vez de SWSURFACE.

Propeller


Si tambien lo he probado, y con SDL_FULLSCREEN pero el resultado es el mismo...

Si quito el doblebuffer si que funciona :S pero claro parpadea que da gusto!

Propeller
11/10/2007, 18:49
Ahora sustituye &fondorect y &screenrect por NULL :D

Propeller

juanvvc
11/10/2007, 18:56
Archer, el doble buffer en SDL solo funciona en el modo HW. Diría que la librería SDL de la Gp2x solo soporta el modo SW, así que no hay más narices que evitar el parpadeo "a mano".

Propeller
11/10/2007, 18:59
Archer, el doble buffer en SDL solo funciona en el modo HW. Diría que la librería SDL de la Gp2x solo soporta el modo SW, así que no hay más narices que evitar el parpadeo "a mano".

Yo suelo inicializar así:


* screen = SDL_SetVideoMode (640, 480, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);

Así que imagino que si que tira. Lo del tamaño de la pantalla, es por compatibilidad con Dreamcast nada más.

Propeller

BuD
11/10/2007, 19:17
Yo te propongo que hagas estos cambios. Si te sale es que no ha cargado bien la imagen.



#include <stdlib.h>

void GP2X_Exit();
int main(int argc, char *argv[])
{

SDL_Init(SDL_INIT_VIDEO);
atexit(GP2X_Exit);

SDL_Surface *fondo;
SDL_Rect fondorect = { 0, 0, 320, 240 };

// Inicializa el modo grafico a 320x240,, 16bpp, doble buffer y pantalla completa
screen = SDL_SetVideoMode(320, 240, 16, SDL_SWSURFACE | SDL_DOUBLEBUF );

// Elimina el cursor del raton
SDL_ShowCursor ( SDL_DISABLE );

// Carga la imagen de fondo
fondo = SDL_LoadBMP( ".//data//fondo.bmp" );
if(fondo == NULL) return 0;

Uint32 x = 10, y = 10;

// Bucle
do
{
SDL_PumpEvents ( );
keystate = SDL_GetKeyState(NULL);

SDL_BlitSurface( fondo, &fondorect, screen, &screenrect);

Uint32 a = SDL_MapRGB(screen->format, 255, 200, 100);
SDL_Rect rect = {x, y, 50, 50};

SDL_FillRect(screen, &rect, a);

x++;

// Intercambia las paginas de video
SDL_Flip( screen );

} while ( !keystate[SDLK_ESCAPE] );

return 0;
}

void GP2X_Exit()
{
SDL_Quit();
chdir("/usr/gp2x");
execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);
}

ArChEr
11/10/2007, 19:58
Es por el doble buffer, pues me parece que al final lo hare con las ArcherGL y pal sonido usare SDL...

Gracias a todos :)

BuD
11/10/2007, 20:06
Es por el doble buffer, pues me parece que al final lo hare con las ArcherGL y pal sonido usare SDL...

Gracias a todos :)
El doble buffer de SDL siempre lo he odiado, es el causante de que los Flips de SDL se coman un porcentaje del tiempo del proceso considerable. Si usas las librerias por hardware no hace falta ni que pongas doble buffer. Por ejemplo, lo que hace el doble buffer de las minimal es cambiarte el buffer que se esta mostrando por pantalla. SDL no, SDL tiene dos buffers, uno que es donde dibujas y otro que es el que muestras. Cuando haces Flip, copia el buffer donde dibujas al que se muestra por pantalla, esperando el vsync claro.
Te puedo ayudar si lo que quieres es tener sonido sin usar SDL.

ArChEr
11/10/2007, 22:20
El doble buffer de SDL siempre lo he odiado, es el causante de que los Flips de SDL se coman un porcentaje del tiempo del proceso considerable. Si usas las librerias por hardware no hace falta ni que pongas doble buffer. Por ejemplo, lo que hace el doble buffer de las minimal es cambiarte el buffer que se esta mostrando por pantalla. SDL no, SDL tiene dos buffers, uno que es donde dibujas y otro que es el que muestras. Cuando haces Flip, copia el buffer donde dibujas al que se muestra por pantalla, esperando el vsync claro.
Te puedo ayudar si lo que quieres es tener sonido sin usar SDL.

Eso del sonido sin SDL me interesa, esque eso de montarlo uno mismo el mixer con las minimal... no lo veo yo muy ....

Como lo haces tu?

Puck2099
11/10/2007, 22:23
Eso del sonido sin SDL me interesa, esque eso de montarlo uno mismo el mixer con las minimal... no lo veo yo muy ....

Como lo haces tu?

Yo sumo las ondas y listo :)

BuD
13/10/2007, 23:01
Eso del sonido sin SDL me interesa, esque eso de montarlo uno mismo el mixer con las minimal... no lo veo yo muy ....

Como lo haces tu?

He hecho un mixer en C++ (es facil portarlo a C) desde cero, abre OGG y lo descomprime en memoria, y si quieres te hace streaming de OGG. Si quieres te paso el código encantado, ya me dirás algo.

ArChEr
14/10/2007, 00:51
He hecho un mixer en C++ (es facil portarlo a C) desde cero, abre OGG y lo descomprime en memoria, y si quieres te hace streaming de OGG. Si quieres te paso el código encantado, ya me dirás algo.


Hacias Bud, de momento mañana me voy para Londres asi que poco podre mirar jejej cuando vuelva ya te dare el toque y me pasas ese codigo ;)

Un saludo compañero!