【问题标题】:How can I determine the size of an Isometric map of any size?如何确定任意大小的等轴测图的大小?
【发布时间】:2015-06-25 01:51:17
【问题描述】:

通过编写自己的 .TMX 解析器,我设法使用 SpriteKit 和 Swift 加载和显示等距地图。正交地图工作正常,但这是我第一次使用等距地图,数学让我感到困惑。

我的图块是 64x32,地图可以是任意大小。

理想情况下,我希望地图的最左边缘([0, maxRow] 处的图块)位于 x 轴上的零处,并且可能的最底部边缘([maxCol, maxRow]) 位于 0 y 轴上。

地图的原点是顶部的图块。 X 从上到右,Y 从上到左。

SpriteKit 也有一个反向的 y 轴。下面的代码是我如何根据它们的坐标定位瓷砖,并使用屏幕上的位置检索它们。此代码运行良好。

所以要偏移位置校正,以便我可以将地图放置在我需要能够找到任何大小的等距地图的宽度和高度但我不知道从哪里开始的位置。

  func positionForCoord(col: Int, _ row: Int) -> (x: CGFloat, y: CGFloat) {

    var x: CGFloat = 0
    var y: CGFloat = 0

    x = (CGFloat(col - row) * CGFloat(tileSize.width)) / 2
    y = (CGFloat(col + row) * -CGFloat(tileSize.height)) / 2

    return (x, y)
}

  func coordForPosition(x: CGFloat,_ y: CGFloat) -> (col: Int, row: Int) {

    var col: Int = 0
    var row: Int = 0

    let tileWidthHalved = CGFloat(tileSize.width) / 2
    let tileHeightHalved = CGFloat(tileSize.height) / 2

    col = Int(floor(((x / tileWidthHalved) - ((y - tileHeightHalved) / tileHeightHalved)) / 2))
    row = Int(ceil(((((y - tileHeightHalved) / -tileHeightHalved) - (x / tileWidthHalved)) / 2)))


    return (col, row)
}

【问题讨论】:

    标签: sprite-kit isometric tiled


    【解决方案1】:

    由于您使用 Tiled 标记了它,开始的一种方法是查看 Tiled 的源代码以了解它是如何计算的。真的只是isometricrenderer.cpp中的这么一小段代码:

    QSize IsometricRenderer::mapSize() const
    {
        // Map width and height contribute equally in both directions
        const int side = map()->height() + map()->width();
        return QSize(side * map()->tileWidth() / 2,
                     side * map()->tileHeight() / 2);
    }
    

    为了理解它,我通常会在纸上画一小块等轴测图,然后看看它的边界是如何从它的图块大小得出的。您会看到,对于每个附加的瓦片行,地图边界的增长量与每个附加瓦片列的数量相同。数量正好是图块大小的一半。

    【讨论】:

    • 感谢您的帮助,答案似乎很明显。我试图把它复杂化。
    猜你喜欢
    • 2019-06-02
    • 2018-03-25
    • 2012-10-22
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    相关资源
    最近更新 更多