我目前正在尝试创建一个如下所示的按钮类。
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 *。
答案 0 :(得分:1)
所以我弄清楚问题是什么。在我初始化屏幕之前,我正在调用SDL_DisplayFormat。因为我的函数顺序错误,所以SDL_DisplayFormat没有表面将图像转换为。
答案 1 :(得分:0)
: '如果转换失败或内存不足,则返回NULL'
所以看起来SDL_DisplayFormat的调用由于某种原因失败了,在调用SDL_DisplayFormat之后检查m_button_image == NULL可能是有用的,如果它是NULL则使用SDL_GetError()来查看是什么错误是
如果这没有帮助那么我不知道会发生什么,虽然你可以通过将未转换的图像blitting到显示格式化的表面来进行较慢的转换,并将其用作图像(几乎相同但是有点复杂,真的只是避免调用SDL_DisplayFormat)