0

我正在尝试编写一些代码,在其中检查鼠标是否已在某个 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 函数中做错了什么导致它失败?

4

1 回答 1

0

clip_rect 属性不是您认为的那样:

来自 SDL 文档:

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

和 SDL_SetClipRect

设置曲面的剪切矩形。当这个表面是 blit 的目标时,只有剪辑矩形内的区域将被绘制到。

rect 指向的矩形将被剪裁到曲面的边缘,因此曲面的剪裁矩形永远不会落在曲面的边缘之外。

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

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

对此的解决方案是创建一个类似 Sprite 的类,该类将具有 Rect 和 Surface。

于 2013-05-20T07:31:48.720 回答