Чтение растровых изображений из исполняемых ресурсов

Сейчас я делаю игру на аллегро, поэтому я могу научиться классам, объектной ориентации и файлам заголовков, но у меня есть несколько вопросов о растровых изображениях и их загрузке.

Я могу легко загружать растровые изображения, используя:

ALLEGRO_BITMAP *image = NULL;
image = al_load_bitmap("image.png");

Но я хочу импортировать файлы png в визуальную студию в качестве ресурсов (используя resource.h и project.rc)

Я уже проверил этот ресурс:

https://www.allegro.cc/forums/thread/604040/865263#target

и этот код ужасно ломает мой проект (искажает cmath и сбой в функциях malloc), и ничто другое не приближается к тому, что я хочу.

Есть ли способ загрузить растровые изображения из ресурсов, и если нет, то как лучше всего интегрировать растровые изображения в исполняемый файл, чтобы мне не приходилось включать папку с изображениями в мою игру?

Они даже не должны быть ресурсами исполняемого файла, я просто не хочу, чтобы они были доступны пользователю, и я бы предпочел, чтобы они находились внутри исполняемого файла, но опять же это не важно.

спасибо за помощь о великие волшебники Stack Overflow


person zawata    schedule 14.04.2015    source источник


Ответы (1)


Я начал писать блок управления контентом для проекта Allegro5 в прошлом году и так и не успел его закончить. По сути, моя идея для этой проблемы заключалась в том, чтобы загрузить все мои растровые изображения, собрать необходимые данные (ширина, высота, размер файла), а затем написать результирующую структуру. Для нескольких файлов вам придется отслеживать смещения (размер файла), необходимые для каждого изображения, написанного для правильного поиска, а затем перезагружать в правильной последовательности. Соответствующий код для одного изображения, расширяйте его по мере необходимости:

Заголовок:

struct IMAGE_DATA
{
    ALLEGRO_BITMAP *file;
    int width;
    int height;
    int size;
};

class content_manager
{
private:
    ALLEGRO_FILE *content;
    char* bitmap_content_file_name;
    IMAGE_DATA test;

    void parse_image_file(IMAGE_DATA, char*);
public:
    content_manager(void);
    ~content_manager(void);
    void init_bitmap_content(void);
    void create_bitmap_content_file(void);  
};

Учебный класс:

content_manager::content_manager(void)
{
    bitmap_content_file_name = "data.arbitraryextension";
}


content_manager::~content_manager(void)
{
}

void content_manager::init_bitmap_content(void)
{
    content = al_fopen(bitmap_content_file_name, "rb");
    al_fread(content, test.file, test.size);
}

void content_manager::create_bitmap_content_file(void)
{
    parse_image_file(test, "images/image.png");
    content = al_fopen(bitmap_content_file_name, "wb");
    al_fwrite(content, test.file, test.size);
    al_fclose(content);
}

void content_manager::parse_image_file(IMAGE_DATA data, char* path)
{
    data.file = al_load_bitmap(path);
    data.size = sizeof(data.file);
    data.width = al_get_bitmap_width(data.file);
    data.height = al_get_bitmap_height(data.file);
}

create_bitmap_content_file будет расширен, чтобы включить все растровые изображения, которые вы хотите упаковать, тогда вы просто включите файлы данных, которые вы создали в своем развертывании приложения.

person 131nary    schedule 17.04.2015
comment
беглый взгляд делает это очень сложным, но чтение кода делает это очень полезным - person zawata; 20.04.2015