PDA

Ver la versión completa : [Duda - SDL + C] Procesamiento de eventos y carga de imágenes



turco
18/09/2010, 19:06
Hola a todos,

hace tiempo comencé a trabajar en un pequeño programa de dibujo para WIZ. Lo dejé durante un tiempo y ahora he decidido retomarlo. He compilado una versión para WIZ a ver que tal funcionaba lo poco que llevo hecho, y al ejecutarla me he encontrado dos problemas.

El primero es que no se cargan las imágenes que utilizo como iconos. Las cargo a través de la función:

IMG_Load("images/icons/icon_conf.png");
también he probado poniendo "./" delante de la ruta pero no hay manera.

El segundo problema es que cuando ejecuto la aplicación, si no interactuo con ella no pasa nada, pero si comienzo a utilizarla se vuelve cada vez más pesada hasta que llega un momento que se cierra.
Esto ocurre en pocos segundos si arrastro el puntero por la pantalla. Por lo que pienso que se debe al manejo de eventos. Parece como si se llenase la cola de eventos hasta que llega un momento que se "congestiona" el sistema y se sale.

A ver si alguien tiene alguna experiencia parecida y sabe como lo puedo tratar. Este es mi bucle principal...


while(go_out == MG_FALSE && component->visible) {

MG_Render(component);
SDL_Flip(MG_SCREEN);

// Captura del evento
SDL_WaitEvent(&event);

// Se despacha el evento sobre el componente superior
MG_DispatchEvent(component, &event);
}

¿Puede estar el problema en el uso de la función SDL_WaitEvent()?

Saludos y gracias de antemano.

juanvvc
18/09/2010, 19:34
En cuanto a la primera pregunta, ¿qué le pasa? ¿no encuentra la imagen o no reconoce el formato PNG? En le primer caso recuerda que Linux es sensible a mayúsculas y minúsculas, y en el segundo caso recuerda que libpng tiene que estar presente y enlazada para poder cargar archivos PNGs.

En cuanto a la segunda pregunta, no veo nada raro pero quizá es porque no uso SDL_WaitEvent() :( El procedimiento habitual para manejar eventos en la SDL es SDL_PollEvent()

jduranmaster
18/09/2010, 19:47
en el primer caso obtienes la estrutura asociada que devuelve IMG_Load?, te lo digo por que yo por ejemplo para pintar una imagen en pantalla cojo la estrutura que te devuelve y lo paso por la funcion :




void drawImage(SDL_Surface *screen, SDL_Surface *image, int x, int y){
SDL_Rect dstRect;
dstRect.x = x;
dstRect.y = y;
dstRect.w = image->w;
dstRect.h = image->h;

SDL_BlitSurface(image, NULL, screen, &dstRect);
}




y nunca falla.

turco
18/09/2010, 21:33
Gracias a los dos,

efectivamente lo de las imágenes era por no tener enlazada la librería libpng.

En cuanto al segundo problema intentaré mirarlo con más detenimiento, porque en el PC funciona perfectamente pero en la consola tengo ese problema. A ver si cambiando la gestión de eventos puedo solucionarlo.

Saludos.

hardyx
19/09/2010, 12:11
Yo le pondría un SDL_Delay(100) a ese bucle de eventos, luego lo podrás ajustar a los frames que quieras. Incluso en la SDL_gfx hay funciones que te lo gestionan automáticamente. Lo que creo que está pasando es que en el pc va sobrado, pero en la consola se ahoga porque necesitas limitar los frames.

turco
20/09/2010, 14:28
Después de revisar el sistema de gestión de eventos, reescribirlo de varias formas, etc... he visto que los eventos se trataban correctamente.

El problema no estaba en la gestión de eventos, sino en que el programa se me quedaba sin memoria porque no liberaba correctamente todos los recursos que se crean en el proceso de renderizado. En cada redibujo de la aplicación aumentaba la memoria utilizada, hasta que llegaba un momento que se quedaba sin memoria disponible y por eso se cerraba.

excuse me!