Pygame窗口缩放时Tile编号错误问题排查求助
问题排查:滚动后窗口缩放导致Tile悬停编号错误
问题现象
滚动地图后缩放窗口,鼠标指向Tile(19, 0)时,显示的却是(21, 0),偏移量随窗口缩放程度变化,仅在滚动后缩放才会出现该问题。
Bug原因分析
核心问题是坐标单位不匹配:
scroll_x是基于原始画布(s,尺寸640x360)的像素偏移值,单位是原始画布的1px。- 你当前用
tw/MAX_COL计算的是缩放后屏幕中每个Tile的宽度,单位是缩放后的屏幕像素。 - 直接将
mouse_x(缩放后屏幕坐标)与scroll_x(原始画布坐标)相加,再除以缩放后的Tile宽度,相当于把两个不同坐标系下的数值混算,缩放程度越大,误差越明显。
修复方案
正确的思路是:先将鼠标的屏幕坐标转换为原始画布坐标系的坐标,再用原始Tile尺寸计算编号,彻底隔离缩放和滚动的影响。
修正后的关键代码
替换主循环中鼠标坐标计算和print的部分:
mouse_x, mouse_y = pg.mouse.get_pos() grid_x = screen.get_width() / 2 - tw / 2 grid_y = screen.get_height() / 2 - th / 2 mouse_x -= grid_x mouse_y -= grid_y # 计算缩放比例:原始画布 -> 屏幕游戏区域 scale_x = tw / WIDTH scale_y = th / HEIGHT tile_col, tile_row = -1, -1 # 确保鼠标在游戏区域内 if 0 <= mouse_x <= tw and 0 <= mouse_y <= th: # 转换为原始画布坐标 original_mouse_x = mouse_x / scale_x original_mouse_y = mouse_y / scale_y # 用原始Tile尺寸计算编号,scroll_x是原始单位,直接参与运算 tile_col = int((original_mouse_x + scroll_x) // TILE_SIZE) tile_row = int(original_mouse_y // TILE_SIZE) # 限制在有效Tile范围内 tile_col = max(0, min(tile_col, MAX_COL - 1)) tile_row = max(0, min(tile_row, MAX_ROW - 1)) print(tile_col, tile_row)
修复逻辑说明
- 计算缩放比例:用缩放后的游戏区域尺寸
tw/th除以原始画布尺寸WIDTH/HEIGHT,得到坐标转换的比例系数。 - 坐标转换:将缩放后的鼠标坐标除以比例系数,转回原始画布的像素单位,此时
original_mouse_x和scroll_x处于同一坐标系。 - 计算Tile编号:用原始Tile大小
TILE_SIZE(32px)计算,结果不受窗口缩放影响,滚动偏移scroll_x也能正确抵消。
内容的提问来源于stack exchange,提问作者r'ouster
相关产品推荐
相关产品推荐

