2017-03-22 5 views
1

In meinem Spiel versuche ich Bilder auf verschiedenen Ebenen zu platzieren, so dass klar ist, wo die Dinge sind.Wie man Objekte auf verschiedene Z-Ebenen in SpriteKit setzt

z. Terrain befindet sich auf der Z-Ebene 0, während Verbesserungen und Städte sich auf der Z-Ebene 1 befinden, während sich die Einheiten auf einer höheren Ebene befinden.

Ich folge einem Tutorial (http://helpmecodeswift.com/sprite-kit/spritekit-gameift-2-0-part-2) und bin Kopieren ihrer Methode (Ändern der Namen an meine Bedürfnisse) und es scheint nicht zu funktionieren.

Hier sind zwei Bilder aus exakt den gleichen Code (ich das auf der rechten Seite wollen, obwohl die rote Stadt eine Einheit auf ihm haben sollte):

Units under cities

Blue unit above city, Red unit still under city

Frage (keine Themenfrage): Warum werden diese Bilder nicht geladen?

Hinweis: Die großen Farbquadrate sind "Städte", während die Schachfiguren Einheiten sind, die Grafiken sind nur Füller, bis ich den Großteil des Spiels beende und tatsächlich dedizierte Texturen mache.

Hier ist der Code, der mit den Schichten beschäftigt (Einheiten und Städte auf den richtigen Schichten gelegt werden):

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

Sie keinen Code zeigt, wo Sie die zPosition der Objekte tatsächlich eingestellt –

+0

Sie t hinzugefügt werden o die Ebenen, die ich erstellt habe. Z.B. 'improvementsLayer.addChild (BlueCity)' –

+0

ja, aber Sie zeigen den Code nicht. Sie stellen eine Frage speziell zur zPosition-Schichtung, zeigen aber nicht den relevanten Code zu dem, was Sie bereits versuchen. –

Antwort

2

das ist, wie ich es

Die gameLayer Setup in einer SKS ist Datei, die ist, warum es anders als die

controlsLayer initialisiert
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

Ihr Kommentar gab mir die Idee, 'improvementsLayer.zPosition = layers.improvements' und 'unitsLayer.zPosition = layers.units' zum Code hinzuzufügen. –

Verwandte Themen