You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SDL2中检测SDL_Surface鼠标点击:SDL_PointInRect替代方案咨询

问题根源

SDL_PointInRect的第二个参数要求是const SDL_Rect*,但你传了SDL_Surface*,类型不匹配所以报错。更关键的是:SDL_Surface本身不包含它在屏幕上的位置和显示区域信息,它只是存储像素数据的对象,没法直接用来判断点击区域。你必须单独记录每个Surface对应的显示矩形(位置+尺寸)。

可行的替代/解决方法

方法1:绑定Surface与对应的SDL_Rect

把每个Surface和它的显示矩形配对存储,比如用结构体或std::pair:

// 定义结构体存储Surface和对应的显示区域
struct Piece {
    SDL_Surface* surface;
    SDL_Rect rect; // 记录这个Surface在屏幕上的x、y坐标,以及w、h尺寸
};

std::list<Piece> pieces; // 替换原来的std::list<SDL_Surface*>
SDL_Surface* selectedPiece = nullptr;
bool leftClick = false;

// 处理鼠标点击事件
if (windowEvent.type == SDL_MOUSEBUTTONDOWN) {
    if (!leftClick && windowEvent.button.button == SDL_BUTTON_LEFT) {
        leftClick = true;
        SDL_Point mousePos = { windowEvent.button.x, windowEvent.button.y };

        for (auto& piece : pieces) {
            // 现在可以正确调用SDL_PointInRect,传入对应的Rect
            if (SDL_PointInRect(&mousePos, &piece.rect)) {
                selectedPiece = piece.surface;
                break; // 找到后可以跳出循环,避免重复赋值
            }
        }
    }
}

方法2:手动实现点在矩形内的判断

如果你已经通过其他方式知道每个Surface的位置(x,y)和尺寸(w,h),可以不用SDL_PointInRect,自己写判断逻辑:

// 假设遍历每个Surface时,你能获取到它的x、y、w、h
for (auto surface : pieces) {
    int surfaceX = ...; // 该Surface的显示x坐标
    int surfaceY = ...; // 该Surface的显示y坐标
    int surfaceW = surface->w; // Surface的宽度(像素)
    int surfaceH = surface->h; // Surface的高度(像素)

    // 手动判断鼠标点是否在矩形范围内
    if (mousePos.x >= surfaceX && mousePos.x <= surfaceX + surfaceW &&
        mousePos.y >= surfaceY && mousePos.y <= surfaceY + surfaceH) {
        selectedPiece = surface;
        break;
    }
}
注意事项
  • 如果你是用SDL_BlitSurface来绘制Surface,那么你传入的目标Rect(第二个参数)就是这个Surface的显示区域,要把这个Rect和Surface一起保存下来。
  • 记得在程序结束时正确释放所有SDL_Surface资源,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Aseed Kid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 18:40:06