实际上,一旦您将头缠上它,这很容易。您所要做的就是找出您的鼠标相对于地图的位置,然后反转您绘制图块的方式。
我在这样的双“for”循环中绘制我的地图:
For x coord: x * (TileWidth / 2) - (y * (TileWidth / 2))
For y coord: x * (TileHeight / 2) + (y * (TileHeight / 2))
所以我的 x 从左上到右下,我的 y 从右上到左下。但是请注意,对于第一个图块,世界坐标将为 0,0,但顶部像素从 x=0 + (tilewidth / 2) 开始,因此当我们要查找鼠标在哪个图块上时,我们必须对其进行补偿. (或者我们可以通过给它一个偏移量来为整个世界本身做到这一点)。
现在首先我们必须找到鼠标相对于世界的位置,因为您可能需要一个移动的相机。我的相机中心从 0,0 开始,所以我必须将鼠标补偿一半的屏幕宽度,如下所示:
mouseWorldPosX = mouse.x + cam.x - (screen.width / 2)
mouseWorldPosY = mouse.y + cam.y - (screen.height / 2)
这就是我们需要计算鼠标位置回到平铺位置的全部内容。
对于 X:
tileX = (mouseWorldPosX + (2 * mouseWorldPosY) - (tileWidth / 2)) / tileWidth
正如你所见,我们将整个事物除以 tilewidth,因为我们在 draw 方法中将它相乘。 (tileWidth / 2) 只是为了补偿我前面提到的偏移量。
对于 Y:
tileY = (mouseWorldPosX - (2 * mouseWorldPosY) - (tileHeight / 2) / -tileWidth
实际上是一样的,但反过来。我们减去 Y 世界位置,因为 Y 轴反向运行。这次我们补偿了 tile 高度的偏移量,并将整个事物除以负 tilewidth,再次因为它以相反的方式运行。
我希望这有助于下面是我查找的方法的一个工作示例,它返回一个带有图块坐标的向量:
public Vector2 MouseTilePosition(Camera cam, GraphicsDevice device)
{
float mPosX = newMouseState.X + (cam.Position.X - (device.Viewport.Width / 2));
float mPosY = newMouseState.Y + (cam.Position.Y - (device.Viewport.Height / 2));
float posx = (mPosX + (2 * mPosY) - (Map.TileWidth / 2)) / Map.TileWidth;
float posy = (mPosX - (2 * mPosY) - (Map.TileHeight / 2)) / -Map.TileWidth;
return new Vector2((int)posx, (int)posy);
}