Sprite kit 如何确定任意大小的等轴测地图的大小?

Sprite kit 如何确定任意大小的等轴测地图的大小?,sprite-kit,isometric,tiled,Sprite Kit,Isometric,Tiled,我已经通过编写自己的.TMX解析器,使用SpriteKit和Swift加载并显示了一个等轴测图。正交贴图很好,但这是我第一次使用等距贴图,数学让我困惑 我的瓷砖是64x32,地图可以是任何大小 理想情况下,我希望地图最左边的边缘(位于[0,maxRow]的平铺)位于x轴上的零,而五月的最底部边缘(位于[maxCol,maxRow]的平铺)位于y轴上的0 地图的原点是顶部的平铺。X从上到右,Y从上到左 SpriteKit也有一个反向的y轴。下面的代码是我如何根据瓷砖的坐标定位瓷砖,并使用屏幕上的位

我已经通过编写自己的.TMX解析器,使用SpriteKit和Swift加载并显示了一个等轴测图。正交贴图很好,但这是我第一次使用等距贴图,数学让我困惑

我的瓷砖是64x32,地图可以是任何大小

理想情况下,我希望地图最左边的边缘(位于[0,maxRow]的平铺)位于x轴上的零,而五月的最底部边缘(位于[maxCol,maxRow]的平铺)位于y轴上的0

地图的原点是顶部的平铺。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)
}

既然您用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);
}

为了理解它,我通常在纸上画一小块等距图,看看它的边界是如何从它的瓷砖大小推导出来的。您将看到,对于每个附加的平铺行,贴图边界的增长量与每个附加平铺列的增长量相同。数量正好是瓷砖大小的一半。

谢谢您的帮助,答案似乎很明显。我想把事情复杂化。