Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

Ayuda con optimización de repintado.

8 views
Skip to first unread message

Jurasec

unread,
May 31, 2008, 9:27:34 PM5/31/08
to SDL en Español
Hola soy nuevo en este grupo y estoy empezando con SDL, espero que me
puedan ayudar a mejorar este codigo, lo que pasa es que en modo de
pantalla completa, el mouse desaparece y solo se muestra cuando lo
muevo y ademas de que si lo paso sobre una de las imagenes que se
estan desplazando, el repintado del cursor se nota, de tal manera que
se ve feo, resumiendo

1. como puedo hace para que siempre este visible el puntero del mouse?
2. como evitar ese repintado feo del mouse sobre la imagenes?

Le pongo el codigo, espero y no se inadecuada la forma en que les
solicito ayuda, gracias.

#include <stdlib.h>
#include <SDL/SDL.h>
#define DELAY_TIME 0
#define SCREEN_WIDTH 1024
#define SCREEN_HEIGHT 768


int procesar_eventos (void)
{
static SDL_Event event;

while (SDL_PollEvent (&event))
{
if (event.type == SDL_QUIT)
return 0;

if (event.type == SDL_KEYDOWN)
{
switch (event.key.keysym.sym)
{
case SDLK_q:
return 0;
break;

case SDLK_ESCAPE:
return 0;
break;

default:
break;
}
}
}
return 1;
}

struct Caratula{
int x,y;
SDL_Surface *surf;
};

Caratula *alex_envivo,*alex_acustica,*fondo;

/*** Carga de imagenes *****************************/
SDL_Surface* loadImageBMP(char * file){
SDL_Surface *temp, *newSurface;
temp = SDL_LoadBMP(file);
printf("%s\n",file);
if (temp==NULL)
printf("error al cargar la imagen %s\n",file);
return temp;
}

/*** Cuerpo del programa ***************************/
int main(int argc, char *argv[])
{
SDL_Surface *screen;
SDL_Surface *pantallaOculta;
SDL_Surface *fondoCaratulas;
SDL_Surface *temp;

alex_envivo = (struct Caratula *) malloc (sizeof (struct
Caratula));
alex_acustica = (struct Caratula *) malloc (sizeof (struct
Caratula));
fondo = (struct Caratula *) malloc (sizeof (struct Caratula));

SDL_Rect destino;
int i, j;
int xProt = 320, yProt= 400;
int tecla,terminado=1;

/* Tratamos de inicializar la biblioteca SDL */
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
printf("No se pudo inicializar SDL: %s\n", SDL_GetError());
exit(1);
}
/* Preparamos las imagenes a mostrar */
fondoCaratulas = loadImageBMP("fondo.bmp");
alex_envivo->surf = loadImageBMP("envivo.bmp");
//printf("%i\n",fondoCaratulas->w);
alex_envivo->y = (int)(SCREEN_HEIGHT/2)-(int)(alex_envivo->surf->w/
2);
alex_envivo->x = 850;

alex_acustica->surf = loadImageBMP("acustica.bmp");
alex_acustica->y = (int)(SCREEN_HEIGHT/2)-(int)(alex_acustica->surf-
>w/2);
alex_acustica->x = 850-150-10;

pantallaOculta = SDL_CreateRGBSurface(SDL_SWSURFACE,
SCREEN_WIDTH, SCREEN_HEIGHT, 16,0,0,0,0);

screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, 16,
SDL_FULLSCREEN | SDL_HWSURFACE | SDL_DOUBLEBUF);

if(screen == NULL) {
printf( "Error al entrar a modo grafico: %s\n",
SDL_GetError() );
SDL_Quit();
return -1;
}

/* Permitimos que nuestro "getch" repita cada 20 ms */
//SDL_EnableKeyRepeat(20, 20);

/* Titulo de la ventana */
SDL_WM_SetCaption( "Test!", "Test!" );

/* Parte repetitiva: hasta que se elija terminar */
while(terminado) {

destino.y = (int)(SCREEN_HEIGHT/2)-(int)(fondoCaratulas->h/
2);

for (j=0; j<4; j++) {
destino.x=256*j;
SDL_BlitSurface(fondoCaratulas, NULL, pantallaOculta,
&destino);
}

/* Dibujamos la caruta 1 */
destino.x= alex_acustica->x;
destino.y= alex_acustica->y;
SDL_BlitSurface(alex_acustica->surf, NULL, pantallaOculta,
&destino);

/* Dibujamos la caruta 1 */
destino.x= alex_envivo->x;
destino.y= alex_envivo->y;
SDL_BlitSurface(alex_envivo->surf, NULL, pantallaOculta,
&destino);
/* Actualizamos la pantalla */
destino.y = 0;
destino.x = 0;
SDL_BlitSurface(pantallaOculta, NULL, screen, &destino);

alex_acustica->x = alex_acustica->x-=2;
alex_envivo->x = alex_envivo->x-=2;

terminado = procesar_eventos();
SDL_Delay( DELAY_TIME );
SDL_Flip(screen);
}
SDL_Quit();
return 0;
}

Hugo Ruscitti

unread,
Jun 3, 2008, 8:30:11 PM6/3/08
to sdl...@googlegroups.com
2008/5/31 Jurasec <jur...@gmail.com>:

>
> Hola soy nuevo en este grupo y estoy empezando con SDL, espero que me
> puedan ayudar a mejorar este codigo, lo que pasa es que en modo de
> pantalla completa, el mouse desaparece y solo se muestra cuando lo
> muevo y ademas de que si lo paso sobre una de las imagenes que se
> estan desplazando, el repintado del cursor se nota, de tal manera que
> se ve feo, resumiendo

Saludos, disculpa por mi demora al responder pero hace tiempo que
no reviso los mensajes que llegan a esta lista de correo.

Intento contestar mas abajo en este mismo mensaje.

> 1. como puedo hace para que siempre este visible el puntero del mouse?

Cuando inicializas el modo de video con la bandera HW_SURFACE la biblioteca
SDL generalmente oculta el puntero de Mouse, esto es así porque la superficie
que verás en pantalla "vive" en la memoria de video, por lo tanto el sistema
operativo no interviene para dibujar el puntero.

Hay varias formas de resolverlo:

1 - no usar HWSURFACE junto a FULLSCREEN, o SWSURFACE y fullscreen.
2 - obtener la coordenada del mouse y dibujar ahí un puntero como si
se tratara de un sprite (ver ejemplo "mouse con eventos" de
la siguiente web:
http://www.losersjuegos.com.ar/referencia/ejemplos/ejemplos.php)

> 2. como evitar ese repintado feo del mouse sobre la imagenes?

Los programas desarrollados con SDL generalmente hacen uso de la técnica
"Double Buffer", que la misma biblioteca gestiona cuando no se usan superficies
de hardware (HWSURFACE). Por ello para la mayoría de programadores eso
no resulta ser un problema, simplemente se despreocupan de la inconsistencia
al imprimir y llaman a la función SDL_Flip cuando termina el ciclo del
bucle principal.

Mi recomendación sería que uses esa funcionalidad de la biblioteca,
pero para ello
debes deshabilitar la superficie de Hardware (y los buffers auxiliares
de tu código
como "pantallaOculta"). Se que puede parecer una mala idea, muchos soñamos que
las superficies en video son mas rápidas que las superficies en memoria de
sistema, pero a fin de cuentas... resulta mas conveniente no optimizar un
programa antes de tiempo, de otra forma ¿que estamos optimizando realmente?.

http://www.linuxdevcenter.com/pub/a/linux/2003/08/07/sdl_anim.html

> Le pongo el codigo, espero y no se inadecuada la forma en que les
> solicito ayuda, gracias.
>
> #include <stdlib.h>
> #include <SDL/SDL.h>
> #define DELAY_TIME 0
> #define SCREEN_WIDTH 1024
> #define SCREEN_HEIGHT 768
>

> [...]

Saludos y disculpa nuevamente por la demora. ¡ Buena suerte !.

--
Hugo Ruscitti
www.losersjuegos.com.ar

Jurasec

unread,
Jun 5, 2008, 2:00:23 AM6/5/08
to SDL en Español


On 3 jun, 19:30, "Hugo Ruscitti" <hugorusci...@gmail.com> wrote:
> 2008/5/31 Jurasec <jura...@gmail.com>:
Muchas gracias Hugo por tu atenta respuesta, :) ( pensé que ya no
seguía activo el grupo,), voy a seguir tus consejos, siempre es
difícil empezar a usar una nueva tecnología, tengo pensado hacer una
especie de simulación de rockola que se desplacen caratulas de discos
en la pantalla y al darle click que vaya al menú de canciones y
después reproducir las que elijan (pero para esto deberán depositar su
monedita, en un tragamonedas), lo estoy programando en mis tiempos
libres, después del trabajo, espero llegar a terminarlo.
Espero me puedas seguir ayudando.
Saludos.
Reply all
Reply to author
Forward
0 new messages