C++ 通过SDL曲面或剪辑

C++ 通过SDL曲面或剪辑,c++,sdl,C++,Sdl,我正在尝试编写一段代码,在其中检查鼠标是否已单击某个SDL曲面。在下面的代码示例中,我有SDL_曲面背景,我正试图对照鼠标位置检查它 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_re

我正在尝试编写一段代码,在其中检查鼠标是否已单击某个SDL曲面。在下面的代码示例中,我有SDL_曲面背景,我正试图对照鼠标位置检查它

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
        }
    }
}
bool checkCollide(int myx,int myy,SDL_Surface*objectOne){
if(myxclip_rect.x)返回false;
如果(myx>objectOne->clip_rect.x+objectOne->clip_rect.w)返回false;
如果(myyclip_rect.y)返回false;
if(myy>(objectOne->clip_rect.y+objectOne->clip_rect.h))返回false;
返回true;
}
void main(){
SDL_表面*背景;
while(SDL_事件和事件)){
if(event.type==SDL_MOUSEBUTTONDOWN){
if(选中Collide(event.button.x,event.button.y,background){
//举办活动
}
}
}

我遇到的问题是,当我尝试按上面所示运行它时,代码编译得很好,但什么都不做。冲突检查总是失败。我尝试了很多不同的组合,包括将checkCollide的参数更改为SDL_Rect,并传递曲面的clip_Rect属性。唯一完全成功的方法是完成后,将有一个单独的SDL_____________________________________________________正确传递,或者如果是,我在checkCollide函数中做错了什么导致它失败?

clip\u rect属性不是您所认为的:

从SDL文档:

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

和SDL_SetClipRect

设置曲面的剪裁矩形。当此曲面为 blit的目标,将仅显示剪辑矩形内的区域 卷入

rect指向的矩形将被剪裁到矩形的边缘 曲面,以便曲面的剪辑矩形永远不会掉落 在曲面的边缘之外

如果rect为NULL,则剪切矩形将设置为 表面

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


解决这个问题的方法是创建一个类似精灵的类,该类将有一个矩形和一个曲面。

你确定背景有一个正确的剪辑矩形和一个适当的宽度高度吗?还要确保背景的x和y坐标也正确。我对SDL不是特别有经验,但似乎是因为“背景”是一个矩形指向垃圾的指针,传递的“&background”将是一个SDL_曲面**,而不是函数查找的SDL_曲面*,该曲面不应该编译,并且应该给出分段错误。greedybuddha:我尝试在程序开始时手动设置clip_rect属性,但没有用。metredigm:我猜是p很可能,我不太熟悉**指针。我在转录上面的代码时出错,在调用checkCollide时,SDL_Surface参数只是“background”,而不是“&background”.我对它进行了编辑以反映这一点。我做了一些研究,尝试了我能想到的所有组合,但唯一能编译的就是我得到的组合。看起来你是对的。我希望避免使用与每个曲面对应的单独矩形,但我想我没有太多选择。谢谢你的帮助!