【问题标题】:Reading Bitmaps from executable resources从可执行资源中读取位图
【发布时间】:2015-04-14 08:28:04
【问题描述】:

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

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

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 的大神们的帮助

【问题讨论】:

    标签: c++ bitmap allegro5


    【解决方案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 将扩展为包含您想要打包的所有位图,然后您只需包含您在应用程序部署中生成的数据文件。

    【讨论】:

    • 粗略的浏览让这看起来真的很困难,但实际上阅读代码让这非常有用
    猜你喜欢
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2016-06-17
    • 2023-03-05
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多