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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:16:02