C ++和SDL:SDL_Rect如何正常工作?

时间:2010-10-14 03:42:26

标签: c++ sdl

我正在研究一些SDL的东西,在尝试设置加载的BMP的位置时遇到了一些麻烦。

这是代码。

while(event.type != SDL_QUIT) //The game loop that does everything
{
    SDL_Rect *location;
    location = SDL_Rect(600,400,0,0);
    SDL_PollEvent(&event); //This "polls" the event
    //Drawing stuff goes here
    SDL_BlitSurface(zombie, NULL, buffer, &location);
    SDL_Flip(buffer); //Draw
}

它不会编译。我做错了什么?

2 个答案:

答案 0 :(得分:15)

SDL是用C语言编写的,因此SDL_Rect只是一个简单的结构。

要动态分配它,您必须使用new否则编译器会将您的代码解释为对名为SDL_Rect的常规函数​​的调用,该函数返回SDL_Rect*
在这种情况下,我认为没有理由使用动态分配;只需使用struct初始化语法(并注意struct的成员的声明顺序):

SDL_Rect location = {0,0,600,400}; // or
SDL_Rect location{0,0,600,400}; // for C++11 & up (h/t @HolyBlackCat)

或显式初始化每个成员(如果有人决定重新排列结构成员的顺序,则更安全):

SDL_Rect location;
location.h = 600;
location.w = 400;
location.x = 0;
location.y = 0;

答案 1 :(得分:3)

作为上述答案的替代方案,如果您出于任何原因需要动态创建location,则需要按照以下方式执行此操作:

while(event.type != SDL_QUIT) //The game loop that does everything
{
    SDL_Rect *location;
    location = new SDL_Rect(600,400,0,0);             //add new operator
    SDL_PollEvent(&event); //This "polls" the event
    //Drawing stuff goes here
    SDL_BlitSurface(zombie, NULL, buffer, location);
    SDL_Flip(buffer); //Draw
    delete location;                                  //IMPORTANT: deallocate memory
}

请注意,因为在循环的每次迭代中都会创建一个额外的SDL_Rect,并且在下一次迭代中将不再有指向它的指针,所以有必要在结束之前删除它。循环(换句话说,在每次迭代结束之前删除)。否则,您会创建内存泄漏。

作为另一种选择,如果您需要更改location以从循环的一次迭代持续到下一次,或者您根本不需要在循环内更改,但是您想要清理稍微提高你的尾声,你可以做这样的事情:

SDL_Rect *location = new SDL_Rect(600,400,0,0);

while(event.type != SDL_QUIT) //The game loop that does everything
{
    SDL_PollEvent(&event); //This "polls" the event
    //Drawing stuff goes here
    SDL_BlitSurface(zombie, NULL, buffer, location);
    SDL_Flip(buffer); //Draw
}

delete location;