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;
关键说明
- 偏移修正:
GRID_X和GRID_Y是网格在屏幕上的实际绘制原点(包含相机偏移和居中偏移),鼠标坐标减去这个值后,才是相对于网格自身原点的位置,此时再除以Tile尺寸才能得到正确的Cell索引。 - 无限网格适配:相机重置时
GRID_X/Y会同步更新,直接使用当前的GRID_X/Y计算偏移,就能适配相机重置后的网格跳转,光标定位依然准确。 - 整数除法处理:使用
Math.Floor确保浮点数除法得到正确的整数索引(比如鼠标在Tile右半部分时,不会错误跳转到下一个Tile)。
内容的提问来源于stack exchange,提问作者Sanchez Milo
相关产品推荐
相关产品推荐

