我数学不是很好,所以我希望你们中的一些人能帮忙?
我正在尝试创建一个函数来将鼠标坐标转换为等轴测视图中的特定图块。
它不会让我出于愚蠢的原因发布图片,所以我只是链接图片:
到目前为止,我看到的所有算法都适用于 X 和 Y 轴对角线,我的游戏目前是这样设置的,我想保持这样。
有没有一种算法,如果鼠标在红点处,它会返回它所在的瓷砖的坐标?(6,2)
提前致谢!
我数学不是很好,所以我希望你们中的一些人能帮忙?
我正在尝试创建一个函数来将鼠标坐标转换为等轴测视图中的特定图块。
它不会让我出于愚蠢的原因发布图片,所以我只是链接图片:
到目前为止,我看到的所有算法都适用于 X 和 Y 轴对角线,我的游戏目前是这样设置的,我想保持这样。
有没有一种算法,如果鼠标在红点处,它会返回它所在的瓷砖的坐标?(6,2)
提前致谢!
有一个好的开始:http ://www.java-gaming.org/index.php?topic=23656.0
享受 :)
编辑
完全受信任的“DrDobb's”网站,全文:http ://www.drdobbs.com/parallel/designing-isometric-game-environments/184410055
<0;4>
x <0;3> <1;4>
<0;2> <1;3> <2;4>
<0;1> <1;2> <2;3> <3;4>
<0;0> <1;1> <2;2> <3;3> <4;4>
<1;0> <2;1> <3;2> <4;3>
<2;0> <3;1> <4;2>
y <3;0> <4;1>
<4;0>
我像上面一样渲染了瓷砖。
解决方案非常简单!
第一件事:
我的瓷砖宽度和高度都是 = 32 这意味着在等轴测视图中,宽度 = 32 和高度 = 16!在这种情况下 Mapheight 为 5(最大 Y 值)
当 y_mouse=MapHeight/tilewidth/2 且 x_mouse = 0 时,y_iso & x_iso == 0
当 x_mouse +=1, y_iso -=1
所以首先我计算“每像素变换”
TileY = ((y_mouse*2)-((MapHeight*tilewidth)/2)+x_mouse/2;
TileX = x_mouse-TileY;
找到我只是通过 tilewidth 划分的 tile 坐标
TileY = TileY/32;TileX = TileX/32;
完毕!!从来没有任何问题!
实际上,一旦您将头缠住它,这很容易。您所要做的就是找出您的鼠标相对于地图的位置,然后反转您绘制图块的方式。
我在双“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 轴反向运行。这次我们补偿了瓷砖高度的偏移量,并将整个物体除以负瓷砖宽度,因为它以另一种方式运行。
我希望这有助于下面是我查找的方法的一个工作示例,它返回一个带有图块坐标的向量:
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);
}