Как поставить изображение в качестве фона (Allegro 5)

Я новичок в Allegro (5) и делаю свою первую игру. Мне нужно поместить изображение в качестве фона и маленький квадрат, который движется перед ним. В моем коде на каждом кадре изображение рисуется в координатах (0;0), а затем квадрат рисуется в (что-то; что-то), и, я думаю, он должен появляться поверх изображения, потому что он был нарисован после него, но это не так.

Может ли кто-нибудь объяснить мне, как это сделать? Спасибо

PS: Покопавшись в Интернете, я обнаружил, что это может иметь какое-то отношение к блиттингу, может кто-нибудь объяснить мне, что это за операция?


person NOVA99    schedule 29.05.2016    source источник
comment
stackoverflow.com/questions/6632697/ взгляните сюда.   -  person Job Heersema    schedule 29.05.2016
comment
Я уже видел это, но эта программа написана с Allegro 4   -  person NOVA99    schedule 30.05.2016
comment
* написано, извините   -  person NOVA99    schedule 31.05.2018


Ответы (1)


Я опубликую код, чтобы просто нарисовать фон на дисплее. И я объясню это понемногу

#include <stdio.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>

#define BACKGROUND_FILE     "background.png"
int main(void){

    ALLEGRO_DISPLAY *display = NULL;
    ALLEGRO_BITMAP  *background=NULL;
    if(!al_init()) {
        fprintf(stderr, "failed to initialize allegro!\n");
        return -1;
    }
    al_init_image_addon();//should check for errors

    display = al_create_display(640, 480);
    if(!display) {
        fprintf(stderr, "failed to create display!\n");
        return -1;
    }

    background=al_load_bitmap(BACKGROUND_FILE);
    if(!background)
    {
        fprintf(stderr, "failed to load background bitmap!\n");
        return -1;
    }
    al_draw_bitmap(background,0,0,0);

    al_flip_display();

    al_rest(2.0);

    al_destroy_display(display);
    al_destroy_bitmap(background);
    al_uninstall_system();
    return 0;
}

Эта часть запускает allegro, al_init запускает систему allegro, а al_init_image_addon позволяет нам использовать растровые изображения, так allegro управляет изображениями:

    if(!al_init()) {
        fprintf(stderr, "failed to initialize allegro!\n");
        return -1;
    }
    al_init_image_addon();//should check for errors

Здесь мы создаем дисплей и проверяем, успешно ли он был создан:

    display = al_create_display(640, 480);
    if(!display) {
        fprintf(stderr, "failed to create display!\n");
        return -1;
    }

Здесь мы загружаем изображение, вы просто вводите имя файла, и allegro загрузит его для вас, возвращая ALLEGRO_BITMAP * (NULL в случае неудачи). После вызова al_load_bitmap мы проверяем, успешно ли загружено растровое изображение.

background=al_load_bitmap(BACKGROUND_FILE);
if(!background)
{
    fprintf(stderr, "failed to load background bitmap!\n");
    return -1;
}

Allegro рисует в резервный буфер, это означает, что он не будет напрямую рисовать на дисплее. Вместо этого он будет отображать копию дисплея (backbuffer), и как только вы перевернете backbuffer (al_flip_display()), эта копия (которую вы рисовали поверх) появится сразу.

Это можно увидеть здесь:

al_draw_bitmap(background,0,0,0);

al_flip_display();

Если вы собираетесь инициализировать множество вещей allegro, вы можете инициализировать все вместе, например:

int allegro_startup(void)
{
    if(al_init())
    {
        if(al_init_primitives_addon())
        {
            if(al_install_keyboard())
            {
                if(al_install_mouse())
                {
                    if(al_init_image_addon())
                    {
                        al_init_font_addon();   //Void
                        if(al_init_ttf_addon())
                        {
                            if(al_install_audio())
                            {
                                if(al_init_acodec_addon())
                                {
                                    if(al_reserve_samples(1))
                                    {

                                        return AL_STARTUP_SUCCESS;


                                    }
                                    else 
                                        fprintf(stderr,"ERROR: Failed to reserve samples:(\n");
                                    //al_shutdown_acodec_addon(); Does not exist
                                }
                                else
                                    fprintf(stderr,"ERROR: Failed to initialize acodec addon\n");
                                al_uninstall_audio();
                            }
                            else
                                fprintf(stderr,"ERROR: Failed to install audio\n");
                            al_shutdown_ttf_addon();
                        }
                        else
                            fprintf(stderr,"ERROR: Failed to initialize ttf addon\n");
                        al_shutdown_font_addon();
                        al_shutdown_image_addon();
                    }
                    else
                        fprintf(stderr,"ERROR: Failed to initialize image addon\n");
                    al_uninstall_mouse();
                }
                else
                    fprintf(stderr,"ERROR: Failed to install mouse\n");
                al_uninstall_keyboard();
            }
            else
                fprintf(stderr,"ERROR: Failed to load primitives addon\n");
            al_shutdown_primitives_addon();
        }
        else
            fprintf(stderr,"ERROR: Failed to install keyboard\n");
        al_uninstall_system();
    }
    else
        fprintf(stderr,"ERROR: Failed to initialize allegro system\n");
    return AL_STARTUP_ERROR;
}

void allegro_shut_down(ALLEGRO_DISPLAY *display,ALLEGRO_EVENT_QUEUE *event_queue)
{
    al_destroy_display(display);
    al_destroy_event_queue(event_queue);
    al_uninstall_audio();
    al_shutdown_ttf_addon();
    al_shutdown_font_addon();
    al_shutdown_image_addon();
    al_uninstall_mouse();
    al_uninstall_keyboard();
    al_shutdown_primitives_addon();
    al_uninstall_system();

}

Здесь много руководств, которые намного понятнее и немного шире. если вы заинтересованы.

person Mr. Branch    schedule 31.05.2016