Ver la versión completa : Ayuda con SDL
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
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
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
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
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);
}
Es por el doble buffer, pues me parece que al final lo hare con las ArcherGL y pal sonido usare SDL...
Gracias a todos :)
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.
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 :)
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.
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!
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.