【问题标题】:SDL image does not displaySDL 图像不显示
【发布时间】:2012-10-30 23:42:14
【问题描述】:

我目前正在尝试创建一个如下所示的按钮类。

void Button::apply_image(std::string path) {

    SDL_Surface* loaded_image = NULL;
    loaded_image = IMG_Load(path.c_str());
    m_button_image = SDL_DisplayFormat(loaded_image);
    SDL_FreeSurface(loaded_image);

}

void Button::show(SDL_Surface* screen) {
    SDL_BlitSurface(m_button_image, NULL, screen, &m_box);
}

使用该类时,我会执行以下操作:

Button button1(0,0,50,50);
button1.apply_image("images/cards/1.png");

SDL_Surface* screen = NULL;

screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
SDL_WM_SetCaption("House Of Cards", NULL);

button1.show(screen);
SDL_Flip(screen);

我的问题是,当我使用SDL_DisplayFormat(loaded_image); 时,图像没有显示,但是当我摆脱那条线和SDL_FreeSurface(loaded_image); 时。然后我将loaded_image = IMG_load(path.c_str()); 更改为m_button_image = IMG_Load(path.c_str());,图像就会出现。我是不是做错了什么,因为路径显然是正确的,因为当我不调用 DisplayFormat() 时图像会显示。通过使用gdb,m_button_image 为NULL,我不明白为什么,因为gdb 也显示loaded_image 指向一个SDL_Surface*。

【问题讨论】:

    标签: c++ sdl


    【解决方案1】:

    所以我想出了问题所在。我在初始化屏幕之前调用了 SDL_DisplayFormat。因为我的函数顺序错误,所以 SDL_DisplayFormat 没有将图像转换为的表面。

    【讨论】:

      【解决方案2】:

      来自http://sdl.beuc.net/sdl.wiki/SDL_DisplayFormat: '如果转换失败或内存不足,则返回NULL'

      所以看起来对 SDL_DisplayFormat 的调用由于某种原因失败了,在调用 SDL_DisplayFormat 之后检查 m_button_image==NULL 可能很有用,如果它是 NULL 则使用 SDL_GetError() 来查看什么错误是

      如果这没有帮助,那么我不确定会发生什么,尽管您可以通过将未转换的图像blitting 到显示格式化的表面并将其用作图像来进行较慢的转换(几乎相同,但有点复杂,真的只是避免调用 SDL_DisplayFormat)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-08
        • 2020-07-24
        • 2016-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多