[求助]我正在关注this tutorial (video)而我正处于这个时刻。编译时我没有遇到任何问题,但是当它运行程序时,它只是闪烁一秒钟然后关闭。所以我运行了调试器,我在我的SDL_DisplayFormat
函数中发现了load_image
的分段错误,当我在我加载图片的行注释时它工作正常,但我找不到原因问题。
[解决方案]我没有填写.bmp文件,这就是SDL_DisplayFormat无效的原因。一旦提交了绘图,一切都开始起作用了。
这是我的代码:
#include "game.h"
/*TODO
*stworzyć plik z blokami "blocks.bmp"
*stworzyć plik z tlem "background.bmp"
*uzywac jako tla do obrazkow 000,255,255
*
*/
game::game()
{
//zaladowanie ekranu
SDL_Init(SDL_INIT_EVERYTHING);
screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGTH, 32, SDL_SWSURFACE);
//ladowanei obrazkow
//ustawianie polozenia i rozmiaru kamery
camera.x = camera.y = 0;
camera.w = SCREEN_WIDTH;
camera.h = SCREEN_HEIGTH;
//inicjalizacja kierunku w kotrym sie poruszamy
direction[0] = direction[1] = 0;
running = true;
block = (load_image("blocks.bmp"));
background = (load_image("background.bmp"));
}
game::~game()
{
SDL_FreeSurface(block);
SDL_FreeSurface(background);
SDL_Quit();
}
SDL_Surface* game::load_image (const char* filename)
{
SDL_Surface* tmp = SDL_LoadBMP(filename);
SDL_Surface* tmp2 = SDL_DisplayFormat(tmp);
//do odkomentowania kolorkey na razie zeby sprawdzac kolizje
// SDL_SetColorKey(tmp2, SDL_SRCCOLORKEY, SDL_MapRGB(screen->format, 0x00, 0xff, 0xff)
SDL_FreeSurface(tmp);
return tmp2;
}
void game::handleEvents()
{
SDL_Event event;
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
running = false;
return;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_LEFT:
direction[0] = 1;
break;
case SDLK_RIGHT:
direction[1] = 1;
break;
}
break;
case SDL_KEYUP:
switch(event.key.keysym.sym)
{
case SDLK_LEFT:
direction[0] = 0;
break;
case SDLK_RIGHT:
direction[1] = 0;
break;
}
break;
}
}
}
void game::start()
{
while(1)
{
handleEvents();
SDL_Flip(screen);
}
}
答案 0 :(得分:2)
预先提出建议:提供完整的最小代码,包括编译说明。你的没有main()函数,也没有类定义(game.h)。在重新构建并在调试器中运行它之后,我发现第一个SDL_LoadBMP()返回NULL(也许这与你的相同,但这里肯定是我没有相应文件的情况),所以我没有线索如果你有同样的问题。
现在,您可以尝试解决此问题的方法是检查返回值。在这种情况下,试试这个:
SDL_Surface* tmp = SDL_LoadBMP(filename);
if(!tmp)
throw std::runtime_error("SDL_LoadBMP() failed");
使用unique_ptr或一些自定义包装器类也是一个很好的建议,以免泄漏资源。