SDL2中使用固定逻辑尺寸时,如何获取鼠标对应的纹理坐标?
更优雅的SDL官方方案:用逻辑坐标转换API
嘿,你的代码思路完全没问题,而且已经实现了需求——不过SDL其实提供了现成的API来帮你搞定这种窗口坐标到纹理(逻辑)坐标的转换,不用自己手动计算宽高比、黑边和缩放因子,既简洁又可靠!
核心API:SDL_RenderWindowToLogical()
既然你已经通过SDL_RenderSetLogicalSize(renderer, SCREEN_W, SCREEN_H)设置了固定的逻辑尺寸(也就是你的512x512纹理尺寸),SDL内部已经自动记录了窗口和逻辑尺寸之间的缩放比例、黑边偏移等信息。直接调用SDL_RenderWindowToLogical()就能一步完成坐标转换:
static void get_mouse_texture_coords(int x, int y) { // renderer是你的SDL_Renderer指针 SDL_RenderWindowToLogical(renderer, x, y, &mouse_x, &mouse_y); }
这个函数会直接把窗口相对的鼠标坐标(x,y)转换成逻辑坐标系下的坐标(mouse_x, mouse_y),完全不需要你手动处理宽高比判断、黑边计算这些细节——SDL已经帮你把所有逻辑都封装好了。
避免浮点运算?用整数版本API
如果你的模拟器只需要整数纹理坐标,不想处理浮点值,SDL 2.0.10及以上版本还提供了SDL_RenderWindowToLogicalInteger(),直接返回整数坐标:
static void get_mouse_texture_coords(int x, int y) { SDL_RenderWindowToLogicalInteger(renderer, x, y, &mouse_x, &mouse_y); }
这个函数内部会自动处理坐标的取整,完全规避浮点运算,非常适合你这种模拟老式电脑的场景。
补充说明
要确保这个API正常工作,你需要:
- 已经正确调用
SDL_RenderSetLogicalSize()设置了逻辑尺寸 - 渲染器的缩放模式是保持比例的(默认就是
SDL_SCALEMODE_FIT,和你需要的固定比例、黑边显示逻辑一致)
你的原有代码逻辑是正确的,但本质上是重复实现了SDL内部已经做好的工作。用官方API不仅代码更简洁,还能避免手动计算可能出现的边界错误或浮点精度问题,维护起来也更省心。
内容的提问来源于stack exchange,提问作者LGB Gábor Lénárt
相关产品推荐
相关产品推荐

