从可执行资源中读取位图

时间:2015-04-14 08:28:05

标签: c++ bitmap allegro5

我现在正在快速制作一个游戏,所以我可以自学类,面向对象和头文件,但我对位图有一些疑问并加载它们

我可以使用以下方法轻松加载位图:

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

但我想将visual studio中的png文件导入为资源(使用resource.h和project.rc)

我已经检查了这个资源:

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

并且该代码严重破坏了我的项目(搞乱了cmath并且没有使用malloc函数) 没有其他任何东西接近我想要的东西。

有没有办法从资源加载位图,如果没有,最好的方法是将位图集成到可执行文件中,以便我不必在游戏中包含图片文件夹?

他们甚至不必是可执行文件的资源,我只是不希望他们被用户访问,我宁愿他们在可执行文件内部但又不重要。

感谢Stack Overflow的很棒的向导

1 个答案:

答案 0 :(得分:0)

我去年开始为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将扩展为包含您要打包的所有位图,然后您只需包含您在应用程序部署中生成的数据文件。