Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use JSTileMap in swift

Can you use JSTileMap in swift, and if so, how do you use it. If I can't use it in swift, or if it is too buggy, then is there anything else I can use for .tmx maps. note, i am using sprite kit

like image 930
Mark Calhoun Avatar asked Sep 23 '14 12:09

Mark Calhoun


People also ask

What is tiled used for?

Tiles are often used to form wall and floor coverings, and can range from simple square tiles to complex or mosaics.

What is Sprite kit?

SpriteKit is a general-purpose framework for drawing shapes, particles, text, images, and video in two dimensions. It leverages Metal to achieve high-performance rendering, while offering a simple programming interface to make it easy to create games and other graphics-intensive apps.


1 Answers

Yes you can, I just started using it yesterday and haven't found a problem yet! Start by importing the JSTileMap files and the libz.dylib framework. Then add a bridging header with the following imports:

#import "JSTileMap.h"
#import "LFCGzipUtility.h"

Next simply go into you SKScene file and create a tileMap variable as shown below:

var tileMap = JSTileMap(named: "tileMap.tmx")

I found positioning a little bit tricky so ill add that in too.

self.anchorPoint = CGPoint(x: 0, y: 0)
self.position = CGPoint(x: 0, y: 0) //Change the scenes anchor point to the bottom left and position it correctly


let rect = tileMap.calculateAccumulatedFrame() //This is not necessarily needed but returns the CGRect actually used by the tileMap, not just the space it could take up. You may want to use it later
tileMap.position = CGPoint(x: 0, y: 0) //Position in the bottom left
addChild(tileMap) //Add to the scene

EDIT

below is the code I used to create a floor of SKSpriteNodes:

func addFloor() {
        for var a = 0; a < Int(tileMap.mapSize.width); a++ { //Go through every point across the tile map
            for var b = 0; b < Int(tileMap.mapSize.height); b++ { //Go through every point up the tile map
                let layerInfo:TMXLayerInfo = tileMap.layers.firstObject as TMXLayerInfo //Get the first layer (you may want to pick another layer if you don't want to use the first one on the tile map)
                let point = CGPoint(x: a, y: b) //Create a point with a and b
                let gid = layerInfo.layer.tileGidAt(layerInfo.layer.pointForCoord(point)) //The gID is the ID of the tile. They start at 1 up the the amount of tiles in your tile set.

                if gid == 2 || gid == 9 || gid == 8{ //My gIDs for the floor were 2, 9 and 8 so I checked for those values
                    let node = layerInfo.layer.tileAtCoord(point) //I fetched a node at that point created by JSTileMap
                    node.physicsBody = SKPhysicsBody(rectangleOfSize: node.frame.size) //I added a physics body
                    node.physicsBody?.dynamic = false

 //You now have a physics body on your floor tiles! :)
                }
            }
        }
    }
like image 82
Jack Chorley Avatar answered Oct 03 '22 16:10

Jack Chorley