等距瓷砖选择

时间:2012-11-30 15:40:33

标签: java math game-engine isometric

我对数学并不是那么好,所以我希望你们中的一些人可以提供帮助吗?

我正在尝试创建一个函数,将鼠标坐标转换为等轴测视图中的特定图块。

它不会让我发布图片是出于愚蠢的原因,所以生病只是链接图像:

Link

到目前为止,我所见过的所有算法都与X& Y轴对角线,我的游戏目前设置如此,我想保持这样。

是否有算法,如果鼠标位于红点,它将返回它所坐的瓷砖的坐标? (6,2)

提前致谢!

3 个答案:

答案 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);
    }