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
相关产品推荐
相关产品推荐

