2017-03-22 2 views
1

Dans mon jeu, j'essaie de placer des images sur différents calques pour que les choses soient claires.Comment placer des objets sur différents calques Z dans SpriteKit

E.g. Le terrain est à la couche Z 0, tandis que les améliorations et les villes sont à la couche Z 1, tandis que les unités sont à une couche supérieure.

Je suis un tutoriel (http://helpmecodeswift.com/sprite-kit/spritekit-gameift-2-0-part-2) et je suis en train de copier leur méthode (changer les noms pour répondre à mes besoins) et cela ne semble pas fonctionner.

Voici deux images de l'exacte même code (je veux celui à droite, bien que la ville rouge devrait avoir une unité au-dessus de celui-ci aussi):

Units under cities

Blue unit above city, Red unit still under city

Question (pas question de sujet): Pourquoi ces images ne vont-elles pas charger? Remarque: Les grands carrés de couleur sont des "villes", tandis que les pièces à la recherche de pions sont des unités, les graphismes sont juste remplis jusqu'à ce que j'achève la majeure partie du jeu et que je crée des textures dédiées.

Voici le code qui traite des couches (unités et villes sont mises sur les couches à droite):

class GameScene: SKScene { 

    var mapTerrain: SKTileMapNode! 

    override func sceneDidLoad() { 
     cam = SKCameraNode() 
     cam.xScale = 1 
     cam.yScale = 1 
     self.camera = cam 
     self.addChild(cam) 
     cam.position = CGPoint(x: 100, y: 100) 
     setUpLayers() 
     loadSceneNodes() 
     setUpUI() 
     testSpawn() 
     //print("\(self.frame.width), \(self.frame.height)") 
    } 

    func setUpUI(){ 
     zoomIn.setButtonType(NSMomentaryLightButton) 
     zoomIn.title = "Zoom In" 
     zoomIn.alternateTitle = "Zoom In" 
     zoomIn.acceptsTouchEvents = true 
     view?.addSubview(zoomIn) //put button on screen 

     zoomOut.setButtonType(NSMomentaryLightButton) 
     zoomOut.title = "Zoom Out" 
     zoomOut.alternateTitle = "Zoom Out" 
     zoomOut.acceptsTouchEvents = true 
     view?.addSubview(zoomOut) //put button on screen 

     endTurn.setButtonType(NSMomentaryLightButton) 
     endTurn.title = "End Turn" 
     endTurn.alternateTitle = "End Turn" 
     endTurn.acceptsTouchEvents = true 
     view?.addSubview(endTurn) //put button on screen 

    } 

    func loadSceneNodes(){ 
     guard let mapTerrain = childNode(withName: "mapTerrain") 
      as? SKTileMapNode else{ 
      fatalError("Background node not loaded") 
     } 
     self.mapTerrain = mapTerrain 
     //GKGridGraph 
    } 

    func setUpLayers() { 
     improvementsLayer = SKNode() 
     improvementsLayer.name = "Objects Layer" 
     addChild(improvementsLayer) 
     unitsLayer = SKNode() 
     unitsLayer.name = "Units Layer" 
     addChild(unitsLayer) 
    } 

    func testSpawn(){ 
     if spawnCount == 0{ 
      for i in 0...10{ 
       spawnRedLegion(at: mapTerrain.centerOfTile(atColumn: 2, row: i), i: i) 
      } 
      for i in 0...10{ 
       spawnBlueLegion(at: mapTerrain.centerOfTile(atColumn: 3, row: i), i: i) 
      } 
      spawnCount += 1 
      for i in 0...0{ 
       spawnRedCity(at: mapTerrain.centerOfTile(atColumn: 0, row: 1), i: i) 
       spawnBlueCity(at: mapTerrain.centerOfTile(atColumn: 5, row: 1), i: i) 
      } 
     } 
    } 

    func spawnRedLegion(at: CGPoint, i: Int){ 
     let RedLegion = legion(texture: textureRedLegion, moveTo: nil, tag: i, health: 2) 
     RedLegion.position = at 
     RedLegion.team = "Red" 
     unitsLayer.addChild(RedLegion) 
     legionList.append(RedLegion) 
    } 

    func spawnBlueLegion(at: CGPoint, i: Int){ 
     let BlueLegion = legion(texture: textureBlueLegion, moveTo: nil, tag: i, health: 2) 
     BlueLegion.position = at 
     BlueLegion.team = "Blue" 
     unitsLayer.addChild(BlueLegion) 
     legionList.append(BlueLegion) 
    } 

    func spawnRedCity(at: CGPoint, i: Int){ 
     let RedCity = city(texture: textureRedCity, tag: i, health: 1, production: 1, workDone: 0) 
     RedCity.position = at 
     RedCity.team = "Red" 
     improvementsLayer.addChild(RedCity) 
     cityList.append(RedCity) 
    } 

    func spawnBlueCity(at: CGPoint, i: Int){ 
     let BlueCity = city(texture: textureBlueCity, tag: i, health: 1, production: 1, workDone: 0) 
     BlueCity.position = at 
     BlueCity.team = "Blue" 
     improvementsLayer.addChild(BlueCity) 
     cityList.append(BlueCity) 
    } 
    .... 
} 

//this is in another file 

let textureRedLegion = SKTexture(imageNamed: "Red Checker") 
let textureBlueLegion = SKTexture(imageNamed: "Black Checker") 
let textureRedCity = SKTexture(imageNamed: "Red Square") 
let textureBlueCity = SKTexture(imageNamed: "Black Square") 

struct layers { 

    static let background: CGFloat = 0 
    static let improvements: CGFloat = 1 
    static let units: CGFloat = 3 

} 

var improvementsLayer: SKNode! 
var unitsLayer: SKNode! 
+0

vous ne montrant aucun code où vous avez réellement régler le zPosition des objets –

+0

Ils sont ajoutés t o les couches que j'ai créées. Par exemple. 'improvementsLayer.addChild (BlueCity)' –

+0

oui, mais vous ne montrez pas le code. Vous posez une question spécifique sur la superposition de zPosition, mais vous ne montrez pas le code correspondant à ce que vous essayez déjà. –

Répondre

2

voilà comment je le fais

Le gameLayer est installé dans un SKS fichier est pourquoi il est initialisé différemment que le controlsLayer

enum Layer: CGFloat { 
    case background = 0 
    case gameLayer = 20 
    case controls = 100 
} 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    private var gameLayer = SKNode() 
    private var controlsLayer = SKNode() 

    override func didMove(to view: SKView) { 

     if let gameLayer = self.childNode(withName: "gameLayer") { 
      self.gameLayer = gameLayer 
      self.gameLayer.zPosition = Layer.gameLayer.rawValue 
     } 

     controlsLayer.zPosition = Layer.controls.rawValue 
     addChild(controlsLayer) 

     setupObjects() 
    } 

    func setupObjects() { 

     let pauseButton = SKSpriteNode(texture: nil, color: .red, size: CGSize(width: 100, height: 100) 
     pauseButton.position = CGPoint(x: 100, y: 100) 
     controlsLayer.addChild(pauseButton) 

     //OR USE IT THIS WAY 

     let ball = SKSpriteNode(texture: nil, color: .red, size: CGSize(width: 100, height: 100) 
     ball.position = CGPoint(x: 400, y: 400) 
     ball.zPosition = Layer.gameLayer.rawValue 
     self.addChild(ball) 
    } 
} 
+0

Votre commentaire m'a donné l'idée d'ajouter 'improvementsLayer.zPosition = layers.improvements' et 'unitsLayer.zPosition = layers.units' au code. –