我已经设法通过编写我自己的.TMX解析器来使用SpriteKit和Swift加载和显示等轴测图。正交映射工作正常,但这是我第一次使用等距映射,数学让我感到困惑。
我的图块是64x32,地图可以是任意大小。
理想情况下,我希望地图的最左边缘([0,maxRow]处的平铺)在x轴上位于零,而may位于最底部边缘([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)
}
答案 0 :(得分:0)
由于您使用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);
}
为了理解它,我通常在纸上画一小块等距地图,看看它的边界是如何从它的瓷砖尺寸中得出的。您会看到,对于每个额外的图块行,地图边界的增长量与每个其他图块列的增长量相同。而金额恰好是瓷砖尺寸的一半。