Entrar
¿Usuario nuevo? Regístrate
allegro-espanol · Una lista en español sobre la librería Allegro.
? ¿Ya estás suscrito? Entrar en Yahoo!

Consejos de Yahoo! Grupos

¿Sabías que...?
Puedes buscar mensajes antiguos en un grupo.

Mensajes

  Mensajes Ayuda
Avanzado
Re: [AL-ES] Cómo se evita el parpadeo?   Lista de mensajes  
Responder | Reenviar Mensaje #728 de 9896 |
Hola Sidus.

En primer lugar creo que el tuturial en español del que hablas estoy casi
seguro que es el de Artebinario (digo casi seguro por el codigo que muestras
es del tutorial). este tutorial es bueno para aprender el paradigma de
programacion orientado a objetos en los videojuegos pero definitivamente no
es bueno para aprender ALLEGRO. Si quieres aprender Allegro deberás
consultar un tutorial en ingles (por ahora), yo te recomiendo VIVACE.

Ahora, para evitar el parpadeo debes usar una tecnica que se conoce como
DoubleBuffering y que consiste en dibujar primero en una pantalla virutal
(un sector de la memoria) y despues copiar esa pantalla virtual a la
pantalla real. En tu codigo la pantalla virtual seria el BITMAP buffer, el
problema consiste en que lo estas usando de forma inapropiada. El codigo
correcto seria algo como esto (solo la parte del movimiento):

//*************************************************
buffer = create_bitmap (SCREEN_W, SCREEN_H); //EN PRIMER LUGAR EL buffer O
PANTALLA VIRTUAL DEBE SER DEL MISMO TAMAÑO DE LA PANTALLA REAL

clear(buffer); //LIMPIO EL BUFFER
x = SCREEN_W/2;
y = SCREEN_H/2;

while (!key[KEY_ESC]) {

if ( key[KEY_UP] && y>0) y--; //si presiona
arriba y no se ha salido de la pantalla se corre para arriba
if ( key[KEY_DOWN] && y<SCREEN_H) y++; //se corre para
abajo
if ( key[KEY_LEFT] && x>0) x--; //se corre para la
izquierda
if ( key[KEY_RIGHT] && x<SCREEN_W) x++; //se corre para
la derecha

draw_sprite (buffer, image, x, y); //PRIMERO DIBUJA EL SPRITE O
IMAGEN EN LA PANTALLA VIRTUAL
blit(buffer,screen,0,0,0,0,SCREEN_W,SCREEN_H); //LUEGO COPIA EL
buffer A LA PANTALLA REAL (screen)
}
//***************************************************

Espero que te sirva, esto debe eliminar completamente el parpadeo, si de
todos modos no funciona puedes usar la funcion vsync() justo antes del blit
esta funcion garantiza que no habra parpadero, lo malo es que vuelve mas
lento el juego.

Cualquier cosa que necesites solo pregunta

Saludos,

Manuel Alejandro Cerón

----- Original Message -----
From: "Sidus" <sidus@...>
To: <allegro-espanol@yahoogroups.com>
Sent: Sunday, August 31, 2003 7:15 PM
Subject: [AL-ES] Cómo se evita el parpadeo?


> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Hola:
> Tengo el siguiente problema.
> Cuando trato de "mover" una imagen utilizando el cursor; esa imagen
parpadea
> constantemente.
> No se cómo solucionarlo. Se me ocurre que tal vez debería usar una función
de
> temporización, pero no tengo ni idea de cómo hacerlo. La ayuda de Allegro
es
> demasiado técnica para mí.
> Adjunto el código que hice hasta ahora.
> ¿Saben de algún tutorial en español que explique un poco más la
programación
> de juegos con Allegro? Hasta ahora solamente encontré uno, y explica muy
> poco, casi nada.
> Desde ya muchas gracias.
>
> #include "allegro.h"
> int main(int argc, char *argv[])
> {
> PALETTE pal;
> int x, y, x_anterior, y_anterior;
> BITMAP *image;
>
> BITMAP *buffer; //PARA EL MOVIMIENTO
>
> allegro_init();
> install_keyboard();
> set_color_depth(8);
> if (set_gfx_mode(GFX_AUTODETECT, 1024, 768, 0, 0) != 0) {
> allegro_message("Error al establecer el modo
gráfico\n%s\n",allegro_error);
> return 1;
> }
> image =load_bitmap("allegro.pcx", pal);
> set_palette(pal);
>
>
//-----------------------------------------------------------------------//
> // TODO LO QUE SIGUE ES AGREGADO PARA EL MOVIMIENTO
>
//-----------------------------------------------------------------------//
> buffer = create_bitmap (image -> w, image -> h);
> clear(buffer); //LIMPIO EL BUFFER
> x = SCREEN_W/2;
> y = SCREEN_H/2;
>
> while (!key[KEY_ESC]) {
>
> if (key[KEY_UP]) y--;
>
> if (key[KEY_DOWN]) y++;
>
> if (key[KEY_LEFT]) x--;
>
> if (key[KEY_RIGHT]) x++;
>
> if (x<0) x=x_anterior;
>
> if (x>SCREEN_W-image->w) x=x_anterior;
>
> if (y<0) y=y_anterior;
>
> if (y>SCREEN_H-image->h) y=y_anterior;
>
> if ((x_anterior != x) || (y_anterior != x)) {
> blit (buffer, screen, 0, 0, x_anterior, y_anterior, buffer -> w, buffer ->
h);
> blit (screen, buffer, x, y, 0, 0, buffer -> w, buffer -> h);
> draw_sprite ( screen, image, x, y);
> }
> x_anterior = x;
> y_anterior = y;
>
> }
>
> return 0;
> }
> END_OF_MAIN();
>
>
> - --
> Llave Gnupg en:
> http://pgp.rediris.es:11371/pks/lookup?op=get&search=0x6F1FD83E
>
> Key fingerprint = F619 9CB9 8E42 0287 8386 D2ED AEBA 0FC5 6F1F D83E
>
>
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.0.4 (GNU/Linux)
> Comment: For info see http://www.gnupg.org
>
> iEYEARECAAYFAj9Sj7YACgkQrroPxW8f2D59/QCfeEzdTu3WMNuaRb+G2BC0yqEK
> G9gAn0mjTjkBP+IeoqYvuUN7WvQSCMzw
> =qsEF
> -----END PGP SIGNATURE-----
>
> _______________________________________________
> Para cancelar su subscripción envíe un email a:
> allegro-espanol-unsubscribe@egroups.com
>
>
> La utilización de Yahoo! Grupos está sujeta a su aceptación de las
> Condiciones del servicio (http://es.docs.yahoo.com/info/utos.html) así
> como de la Política de privacidad (http://privacy.yahoo.com/es/).
>
>
>
>
>





Vie, 9 de Ago, 2002 3:27 am

rdceron@...
Enviar mensaje Enviar mensaje

Reenviar Mensaje #728 de 9896 |
Desplegar mensajes Autor Ordenar por fecha

Hola Sidus. En primer lugar creo que el tuturial en español del que hablas estoy casi seguro que es el de Artebinario (digo casi seguro por el codigo que...
Manuel Alejandro Cer€...
rdceron@...
Enviar mensaje
9 de Ago, 2002
3:27 am
Avanzado

Copyright © 2009 Yahoo! Todos los derechos reservados.
Política de Privacidad Actualizada - Condiciones del servicio - Directrices - Ayuda