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

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)

修复逻辑说明

  1. 计算缩放比例:用缩放后的游戏区域尺寸tw/th除以原始画布尺寸WIDTH/HEIGHT,得到坐标转换的比例系数。
  2. 坐标转换:将缩放后的鼠标坐标除以比例系数,转回原始画布的像素单位,此时original_mouse_x和scroll_x处于同一坐标系。
  3. 计算Tile编号:用原始Tile大小TILE_SIZE(32px)计算,结果不受窗口缩放影响,滚动偏移scroll_x也能正确抵消。

内容的提问来源于stack exchange,提问作者r'ouster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 06:17:03