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

2D正交伪无限网格的Tile选择偏移问题求解

修改方案

核心逻辑

鼠标坐标是屏幕坐标,需要先转换为网格相对坐标(即相对于网格原点的坐标),再计算Cell索引。网格的绘制原点是GRID_X和GRID_Y,必须用鼠标屏幕坐标减去这个偏移,得到网格内的相对位置后再做坐标转换。

修改后的World2Cell公式

// 假设mouseX、mouseY是获取到的鼠标屏幕坐标
float gridRelativeX = mouseX - GRID_X;
float gridRelativeY = mouseY - GRID_Y;

// 计算Cell索引,使用向下取整确保索引正确(避免浮点数精度问题)
int TILE_I = (int)Math.Floor(gridRelativeX / TILE_WIDTH);
int TILE_J = (int)Math.Floor(gridRelativeY / TILE_HEIGHT);

对应修改光标定位代码

// 先通过上面的方法得到CURSOR_I和CURSOR_J
CURSOR_X = CURSOR_I * TILE_WIDTH + GRID_X;
CURSOR_Y = CURSOR_J * TILE_HEIGHT + GRID_Y;

或者等价的链式转换:

Vector2 mouseScreenPos = new Vector2(mouseX, mouseY);
// 转换为网格相对坐标
Vector2 gridRelativePos = mouseScreenPos - new Vector2(GRID_X, GRID_Y);
// 网格相对坐标转Cell
Vector2 cellPos = new Vector2(
    (int)Math.Floor(gridRelativePos.X / TILE_WIDTH),
    (int)Math.Floor(gridRelativePos.Y / TILE_HEIGHT)
);
// Cell转屏幕坐标
Vector2 cursorScreenPos = new Vector2(cellPos.X * TILE_WIDTH, cellPos.Y * TILE_HEIGHT) + new Vector2(GRID_X, GRID_Y);

CURSOR_X = cursorScreenPos.X;
CURSOR_Y = cursorScreenPos.Y;

关键说明

  1. 偏移修正:GRID_X和GRID_Y是网格在屏幕上的实际绘制原点(包含相机偏移和居中偏移),鼠标坐标减去这个值后,才是相对于网格自身原点的位置,此时再除以Tile尺寸才能得到正确的Cell索引。
  2. 无限网格适配:相机重置时GRID_X/Y会同步更新,直接使用当前的GRID_X/Y计算偏移,就能适配相机重置后的网格跳转,光标定位依然准确。
  3. 整数除法处理:使用Math.Floor确保浮点数除法得到正确的整数索引(比如鼠标在Tile右半部分时,不会错误跳转到下一个Tile)。

内容的提问来源于stack exchange,提问作者Sanchez Milo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:30:40