miércoles, 10 de junio de 2020

Animación en C++ y Allegro 5

Se mostrará el código para hacer una animación de un personaje, el cual se maneja mediante las flechas del cursor.





Esta es la imagen de nuestro personaje que vamos a utilizar para nuestro ejemplo. Este personaje ha sido generado en el RPG Maker MV.




En este ejemplo también vendrá el comando en Allegro 4 y su correspondiente comando en Allegro 5, para de esta forma podamos ver las diferencias entre las dos versiones, los comandos de Allegro 4 están puesto en los comentarios.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118

/*
  Dibuja un personaje y se mueve por pantalla mediante el teclado
*/
#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
int main()
{
    // allegro_init();
    al_init();
    al_init_image_addon();
    al_install_keyboard();
    //set_color_depth(32);
    //set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);
    ALLEGRO_DISPLAY* pantalla = al_create_display(800, 600);
    al_set_window_title(pantalla, "Programacion C++: Animacion");
    // BITMAP* prota = load_bmp("personaje.bmp", NULL);
    ALLEGRO_BITMAP* prota = al_load_bitmap("personaje.png");
    // defino lista de eventos
    ALLEGRO_EVENT_QUEUE* Mis_eventos;
    ALLEGRO_EVENT evento;
    // creo lista de eventos
    Mis_eventos = al_create_event_queue();
    // asigno eventos a la lista de eventos
    al_register_event_source(Mis_eventos, al_get_keyboard_event_source());
    al_register_event_source(Mis_eventos, al_get_display_event_source(pantalla));
    ALLEGRO_KEYBOARD_STATE teclado;
    bool salir;
    int x, y;
    int desplaza;
    int paso;
    int dir;
    // inicializar vbles
    x = 10;
    y = 10;
    desplaza = 4;
    paso = 0;
    dir = 0;
    salir = false;
     
    while (!salir)
    {
        // pinta el fondo de un color
        // clear_to_color(buffer, 0x785a5a);
        al_clear_to_color(al_map_rgb(120, 90, 90));
        // masked_blit(prota, buffer, paso*32, dir*32, x, y, 32,32);
        al_draw_bitmap_region(prota, paso * 48, dir * 48, 48, 48, x*desplaza, y*desplaza, 0);
        // mostramos la pantalla
        // blit(buffer, screen, 0, 0, 0, 0, 800, 600);
        al_flip_display();
        al_wait_for_event(Mis_eventos, &evento);
        // se ha cerrado la ventana
        if (evento.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
        {
            salir = true;
        }
        al_get_keyboard_state(&teclado);
        if (al_key_down(&teclado, ALLEGRO_KEY_UP))
        {
            y--;
            dir = 3;
            paso++;
        }
        if (al_key_down(&teclado, ALLEGRO_KEY_DOWN))
        {
            y++;
            dir = 0;
            paso++;
        }
        if (al_key_down(&teclado, ALLEGRO_KEY_LEFT))
        {
            x--;
            dir = 1;
            paso++;
        }
        if (al_key_down(&teclado, ALLEGRO_KEY_RIGHT))
        {
            x++;
            dir = 2;
            paso++;
        }
         
        // limitadores
        if (x < 0) x = 0;
        if (x > 800-48) x = 800-48;
        if (y < 0) y = 0;
        if (y > 600-48) y = 600-48;
        if (paso > 2) paso = 0;
        if (al_key_down(&teclado, ALLEGRO_KEY_ESCAPE)) {
            salir = true;
        }
    }
     
    // destroy_bitmap(prota);
    al_destroy_bitmap(prota);
    // destroy_display(pantalla);
    al_destroy_display(pantalla);
    return 0;
}
Paso a Paso

La primera diferencia que nos encontramos es a la hora de incluir la libería en Allegro 5, tiene varias librerías por separado. Para este ejemplo se incluye el allegro.h y el allegro_image.h.

A continuación se inicializa la librería al_init(), y al_init_image_addon(). Como tenemos dos librerías se deben inicializar ambas.
Con al_install_keyboard(), instala e inicializa el teclado para poder utilizarlo.

Para definir el tamaño de nuestra pantalla se utiliza el comando al_create_display(). En este ejemplo se crea la variable pantalla con las dimensiones de 800x600. Luego se le asigna un titulo a la ventana pantalla.

A continuación se carga la imagen de nuestro personaje, el nuevo comando para esto se llama al_load_bitmap(). A diferencia con el de la versión 4 este permite cargar archivos PNG, ya no es necesario tenerlo en BMP.

Para el manejo del teclado, se utilizan los eventos. Se crean dos variables una para la lista de eventos llamada Mis_eventos, y la variable evento para el control de eventos.

Después se crean y se inicializan las variables que se utilizaran en el ejemplo.

  • salir : indica si se sale del programa o no.
  • x,y : posición del personaje.
  • desplaza : contiene el desplazamiento que recorre a cada paso el personaje.
  • paso : se utiliza para ir alternando las imágenes para el movimiento.
  • dir : se utiliza para indicar la dirección del personaje.

El bucle principal se esta ejecutando mientras que se cumpla la condición, en este caso mientras que salir sea FALSE.

Luego se pinta el fondo, el personaje y se muestra por pantalla.
        // pinta el fondo verde
        // clear_to_color(buffer, 0x785a5a);
        al_clear_to_color(al_map_rgb(120, 90, 90));

        // masked_blit(prota, buffer, paso*32, dir*32, x, y, 32,32);
        al_draw_bitmap_region(prota, paso * 48, dir * 48, 48, 48, x*desplaza, y*desplaza, 0);

        // mostramos la pantalla
        // blit(buffer, screen, 0, 0, 0, 0, 800, 600);
        al_flip_display();
Con el comando al_wait_for_event(), se hace una pausa hasta que salte algún evento, en este caso los eventos que se controla son del teclado y la pantalla. La pantalla por si le dan al botón de la X para cerrar la ventana, y las del teclado para comprobar si se ha pulsado alguna tecla. A continuación se tiene unas condiciones para comprobar las teclas que nos interesa, en este caso las teclas de las direcciones, arriba, abajo, derecha e izquierda.

        al_get_keyboard_state(&teclado);

        if (al_key_down(&teclado, ALLEGRO_KEY_UP))
        {
            y--;
            dir = 3;
            paso++;
        }
        if (al_key_down(&teclado, ALLEGRO_KEY_DOWN))
        {
            y++;
            dir = 0;
            paso++;
        }
        if (al_key_down(&teclado, ALLEGRO_KEY_LEFT))
        {
            x--;
            dir = 1;
            paso++;
        }
        if (al_key_down(&teclado, ALLEGRO_KEY_RIGHT))
        {
            x++;
            dir = 2;
            paso++;
        }

Tenemos una parte de limitadores que se encargan de que no se puedan sobrepasar los bordes de la pantalla, manteniendo de este modo al personaje siempre a la vista.

Finalmente al finalizar el programa se debe de liberar la memoria ocupada, y es por ello que se debe de destruir las variables utilizadas como la imagen y la pantalla.

No hay comentarios:

Publicar un comentario

Antes de publicar un comentario

Todos los comentarios que se realicen en el blog son moderados.

Debido a esto es muy probable que tu comentario no aparezca de inmediato ya que previamente debe ser revisado para evitar un mal uso (SPAM).

Podrán realizar comentario cualquiera que tenga una cuenta de Google.

Related Posts Plugin for WordPress, Blogger...