传递SDL_Surface或clip_rect

时间:2013-05-20 03:03:08

标签: c++ sdl

我正在尝试编写一些代码,在其中检查鼠标是否已在某个SDL Surface上单击。在下面的代码示例中,我有SDL_Surface背景,我试图检查鼠标位置。

bool checkCollide(int myx, int myy, SDL_Surface* objectOne){
    if(myx < objectOne->clip_rect.x) return false;
    if(myx > objectOne->clip_rect.x + objectOne->clip_rect.w) return false;
    if(myy < objectOne->clip_rect.y) return false;
    if(myy > (objectOne->clip_rect.y + objectOne->clip_rect.h)) return false;
    return true;
}

void main(){
SDL_Surface* background;
while(SDL_PollEvent(&event)){
    if(event.type == SDL_MOUSEBUTTONDOWN){
        if(checkCollide(event.button.x, event.button.y, background){
            // run events
        }
    }
}

我遇到的问题是,当我尝试如上所示运行它时,代码编译得很好但没有做任何事情。碰撞检查总是失败。我已经尝试了很多种组合,包括将checkCollide的参数更改为SDL_Rect并传递Surface的clip_rect属性。我完成的唯一完全成功的方法是使用与SDL_Surface相同大小和位置的单独SDL_Rect,并检查与此的冲突。当我以这种方式运行它时,一切都按照我的预期运行。为什么曲面(或clip_rect)没有正确传递,或者如果是,我在checkCollide函数中做错了什么导致它失败?

1 个答案:

答案 0 :(得分:0)

clip_rect属性不是你想象的那样:

来自SDL文档:

  

clip_rect字段是由设置的剪切矩形   SDL_SetClipRect。

和SDL_SetClipRect

  

设置曲面的剪切矩形。当这个表面是   一个blit的目的地,只有剪辑矩形内的区域   吸入。

     

rect指向的矩形将被剪裁到边缘   表面使得表面的剪切矩形永远不会掉落   在表面边缘之外。

     

如果rect为NULL,剪切矩形将设置为完整大小   表面。

问题是,当你稍后测试碰撞时,clip_rect x,y总是设置为0.表面本身不知道它在屏幕上的位置。

解决这个问题的方法是创建一个类似于Sprite的类,它将具有一个Rect和一个Surface。