Sunday Discount - Lifetime Access for $20!!!! - Click Here!

Giving Tile Maps a Physics Body

Layout your levels with Tile Maps then customize each tile with a physics body and whatever other custom properties you want!

Learn how to give SKTileMapNodes a physics body definition using Swift. We’ll do this by setting up an SKTileMapNode in the .sks file, then replacing the tiles with SKSpriteNodes that can have all the usual properties of an SKSpriteNode, include a physics body with Alpha channel. I’ll also point out where to put in a subclass of SKSpriteNode in case you want to get even fancier and use custom properties.

Example Code

//call this by passing in your SKTileMapNode, then you should delete the original SKTileMapNode

func giveTileMapPhysicsBody(map: SKTileMapNode )



let tileMap = map

let startingLocation:CGPoint = tileMap.position


let tileSize = tileMap.tileSize


let halfWidth = CGFloat(tileMap.numberOfColumns) / 2.0 * tileSize.width

let halfHeight = CGFloat(tileMap.numberOfRows) / 2.0 * tileSize.height


for col in 0..<tileMap.numberOfColumns {


for row in 0..<tileMap.numberOfRows {


if let tileDefinition = tileMap.tileDefinition(atColumn: col, row: row)




let tileArray = tileDefinition.textures

let tileTexture = tileArray[0]

let x = CGFloat(col) * tileSize.width – halfWidth + (tileSize.width / 2)

let y = CGFloat(row) * tileSize.height – halfHeight + (tileSize.height / 2)



let tileNode = SKSpriteNode(texture:tileTexture)

tileNode.position = CGPoint(x: x, y: y)

tileNode.physicsBody = SKPhysicsBody(texture: tileTexture, size: CGSize(width: (tileTexture.size().width ), height: (tileTexture.size().height )))

tileNode.physicsBody?.linearDamping = 60.0

tileNode.physicsBody?.affectedByGravity = false

tileNode.physicsBody?.allowsRotation = false

tileNode.physicsBody?.isDynamic = false

tileNode.physicsBody?.friction = 1



tileNode.position = CGPoint(x: tileNode.position.x + startingLocation.x, y: tileNode.position.y + startingLocation.y)






Tags: tiles, tile, tileMap, SKTileMapNode, numberOfColumns, numberOfRows, tileDefinition, userData, tileRowIndex, tileColumnIndex, physicsBody, tileArray

Know what an affiliate program is? You make money just by sharing links to our site! Win. Win.

Earn when you refer any buyer here! 30 day tracking. Commissions are 33%-50% and recur on subscription products!

Uh oh, missing your affiliate ID. Create one real quick