我正在尝试编写一些代码,在其中检查鼠标是否已在某个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函数中做错了什么导致它失败?
答案 0 :(得分:0)
clip_rect属性不是你想象的那样:
来自SDL文档:
clip_rect字段是由设置的剪切矩形 SDL_SetClipRect。
和SDL_SetClipRect
设置曲面的剪切矩形。当这个表面是 一个blit的目的地,只有剪辑矩形内的区域 吸入。
rect指向的矩形将被剪裁到边缘 表面使得表面的剪切矩形永远不会掉落 在表面边缘之外。
如果rect为NULL,剪切矩形将设置为完整大小 表面。
问题是,当你稍后测试碰撞时,clip_rect x,y总是设置为0.表面本身不知道它在屏幕上的位置。
解决这个问题的方法是创建一个类似于Sprite的类,它将具有一个Rect和一个Surface。