【问题标题】:Isometric Tile Selection等距平铺选择
【发布时间】:2012-11-30 15:40:33
【问题描述】:

我的数学不太好,所以我希望你们中的一些人能帮忙?

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

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

Link

到目前为止,我看到的所有算法都适用于 X 和 Y 轴对角线,我的游戏目前是这样设置的,我想保持这样。

有没有一种算法,如果鼠标在红点处,它会返回它所在的瓷砖的坐标? (6,2)

提前致谢!

【问题讨论】:

  • 你知道仿射变换吗?
  • 不,但我现在正在谷歌搜索:)
  • 这是一种通过简单的矩阵乘法在不同的透视/缩放/旋转/平移组合之间进行转换的方法。如果你可以在一个方向上定义它,就很容易回到过去。

标签: java math game-engine isometric


【解决方案1】:

有一个好的开始:http://www.java-gaming.org/index.php?topic=23656.0

享受:)

编辑

完全受信任的“DrDobb's”网站,关于此的完整文章:http://www.drdobbs.com/parallel/designing-isometric-game-environments/184410055

【讨论】:

  • 这根本没有帮助,它有 3D 输入并且正在从 Tile 坐标转换为屏幕位置。我想反过来。
  • @Dylan Lundy :为您添加了新链接,C++ 语言,但可以轻松翻译成 Java。
【解决方案2】:
           <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;

完成!!从来没有任何问题!

【讨论】:

    【解决方案3】:

    实际上,一旦您将头缠上它,这很容易。您所要做的就是找出您的鼠标相对于地图的位置,然后反转您绘制图块的方式。

    我在这样的双“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);
        }
    

    【讨论】:

      猜你喜欢
      • 2022-10-08
      • 1970-01-01
      • 2012-12-20
      • 2014-09-05
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      相关资源
      最近更新 更多