Coordinates

Coordinate Conversion

Coordinate Conversion

SpriteKit uses a coordinate system that is different from Tiled’s; SpriteKit scenes’ origin is at the bottom-left, while Tiled sets the origin at top-left.

To emulate this, the SKTilemap node draws its layers starting at the origin and moving downwards into the negative y-space. To accommodate this, each layer type has conversion methods for converting points to coordinates and vice-versa. Be sure to convert points to the layer you are querying to return the correct coordinate.

Remember that the layers are centered on the SKTilemap origin.

// convert a position in the current view to a scene position
let positionInScene = view.convert(point, to: scene)

// convert a scene point to the layer's position
let positionInLayer = tileLayer.convert(positionInScene, from: scene).invertedY

// get the coordinate at the specified point
let coord = tileLayer.coordinateForPoint(positionInLayer)

If adding objects to a layer, you can easily get a position for a Tiled coordinate:

// get position in a layer for the given coordinate
let point = tileLayer.pointForCoordinate(coord: 3, 4)

Converting Coordinates from Other Nodes

Use the default SKNode.convert(_:from:) method to convert a tile position to another node’s coordinate space. If you wanted to add a node to the SKTiledScene:

let coord1 = simd_int2(0, 17)
let positionInLayer = layer.pointForCoordinate(coord: coord1)
newTile.position = worldNode.convert(positionInLayer, from: layer)

User Interaction

SKTiled also has methods for handling touch events (iOS) and mouse events (macOS):

/// iOS with `UITouch` event
let touchPosition = tileLayer.touchLocation(touch)

/// macOS with `NSEvent` mouse event
let eventPosition = tileLayer.mouseLocation(event: mouseEvent)

You can also query coordinates at an event directly:

// get the coordinate of a touch event
let coord = tileLayer.coordinateAtTouchLocation(touch: event)


// get the coordinate of a mouse event
let coord = tileLayer.coordinateAtMouse(event: event)

It’s important to remember that each layer has the ability to independently query a coordinate (which can be different depending on each layer’s offset). Querying a point in the parent SKTilemap node returns values in the default layer.

Coordinate Offsets & Hints

When converting a tile coordinate to screen points, you can also add optional pixel offset values:

// use CGFloat for offset
let point = tileLayer.pointForCoordinate(3, 4, offsetX: 4, offsetY: 0)

// use TileOffset for offset
let point = tileLayer.pointForCoordinate(3, 4, offset: TileOffset.center)

The SKTiledLayerObject.TileOffset enum represents a hint for placement within each layer type:

Alignment Hint Description
TileOffset.center returns the center of the tile.
TileOffset.top returns the top of the tile.
TileOffset.topLeft returns the top left of the tile.
TileOffset.topRight returns the top left of the tile.
TileOffset.bottom returns the bottom of the tile.
TileOffset.bottomLeft returns the bottom left of the tile.
TileOffset.bottomRight returns the bottom right of the tile.
TileOffset.left returns the left side of the tile.
TileOffset.right returns the right side of the tile.

Next: Working with Objects - Index