我对数学并不是那么好,所以我希望你们中的一些人可以提供帮助吗?
我正在尝试创建一个函数,将鼠标坐标转换为等轴测视图中的特定图块。
它不会让我发布图片是出于愚蠢的原因,所以生病只是链接图像:
到目前为止,我所见过的所有算法都与X& Y轴对角线,我的游戏目前设置如此,我想保持这样。
是否有算法,如果鼠标位于红点,它将返回它所坐的瓷砖的坐标? (6,2)
提前致谢!
答案 0 :(得分:2)
有个好的开始:http://www.java-gaming.org/index.php?topic=23656.0
享受:)
修改
完全信任的“DrDobb's”网站,全文:http://www.drdobbs.com/parallel/designing-isometric-game-environments/184410055
答案 1 :(得分:1)
<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_iso&amp;当y_mouse = MapHeight / tilewidth / 2和x_mouse = 0时,x_iso == 0
当x_mouse + = 1时,y_iso - = 1
所以首先我计算“每像素转换”
TileY =((y_mouse * 2) - ((MapHeight * tilewidth)/ 2)+ x_mouse / 2;
TileX = x_mouse-TileY;
找到瓷砖坐标我只是通过tilewidth
来划分TileY = TileY / 32; TileX = TileX / 32;
DONE !!没有任何问题!
答案 2 :(得分:0)
一旦你把头缠在上面,这很容易。您所做的就是找出鼠标相对于地图的位置,然后反转绘制图块的方式。
我在双“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开始,所以我必须将屏幕宽度的一半补偿鼠标,如下所示:
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坐标的向量:
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);
}