2

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

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*。

4

2 回答 2

1

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

于 2012-10-30T15:42:14.140 回答
0

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

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

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

于 2012-10-30T15:37:38.413 回答