2014-10-03 13 views
5

Utilizzando Swift e SpriteKit, ho un problema con SKSpriteNode che non viene visualizzato quando viene aggiunto come figlio a un altro SKSpriteNode. Al contrario, viene visualizzato un oggetto SKLabelNode esattamente nello stesso posto.SKSpriteNode viene nascosto sotto il nodo genitore

// does not show up, expected a white square 
override func renderBody(parentNode: SKNode, position: CGPoint) { 
    let node = SKSpriteNode(color: UIColor.whiteColor(), size: CGSize(width: 48, height: 48)) 
    node.position = position 
    parentNode.addChild(node) 
} 

// does show up as white text in the correct position 
override func renderBody(parentNode: SKNode, position: CGPoint) { 
    let node = SKLabelNode(text: "hello") 
    node.position = position 
    parentNode.addChild(node) 
} 

'parentNode' e 'position' sono uguali in entrambi i casi.

'parentNode' è un SKSpriteNode più grande, creato con una trama in colori scuri, che copre lo schermo come sfondo.

'posizione' è CGPoint (x: 50, y: 50).

Sembra che lo sprite del rettangolo arrivi sotto lo sfondo, mentre lo sprite dell'etichetta si trova in cima. Ho sperimentato rimuovendo lo sfondo e aggiungendo lo sprite del rettangolo direttamente al nodo della scena, e poi viene mostrato.

Qualcuno ha un'idea di cosa può essere sbagliato?

Modifica: l'impostazione manuale di zPosition risolve il problema. Tuttavia, continuo a pensare che ci sia qualcosa che non va da qualche parte. Non è necessario impostarlo manualmente su un nodo figlio per evitare che il nodo padre nasconda il figlio. Non ho mai dovuto farlo in Xcode 5. E perché c'è una differenza tra un labelnode e un nodo sprite?

Ecco un esempio che si spera lo illustri meglio. Crea un progetto SpriteKit, Swift, Iphone predefinito in Xcode 6. Incolla il codice qui sotto nel ciclo for in touchBegan. Rimuovi l'etichetta "Hello World" creata in didMoveToView. Eseguilo e fai clic da qualche parte nel mezzo dello schermo.

let location = touch.locationInNode(self) 

// LabelNode without manually setting zposition 
// visible 
let backGround1 = SKSpriteNode(imageNamed:"Spaceship") 
backGround1.position = CGPoint(x: location.x, y: location.y + 250) 
backGround1.xScale = 0.5 
backGround1.yScale = 0.5 
self.addChild(backGround1) 
let labelNode = SKLabelNode(fontNamed: "ChalkDuster") 
labelNode.text = "I am on top" 
labelNode.fontSize = 48 
labelNode.fontColor = UIColor.yellowColor() 
backGround1.addChild(labelNode) 

// SpriteNode without manually setting zposition 
// hidden under its parent node 
let backGround2 = SKSpriteNode(imageNamed:"Spaceship") 
backGround2.position = location 
backGround2.xScale = 0.5 
backGround2.yScale = 0.5 
self.addChild(backGround2) 
let spriteNode2 = SKSpriteNode(color: UIColor.yellowColor(), size: CGSize(width: 100, height: 100)) 
backGround2.addChild(spriteNode2) 

// SpriteNode with zposition manually set 
// visible 
let backGround3 = SKSpriteNode(imageNamed:"Spaceship") 
backGround3.position = CGPoint(x: location.x, y: location.y - 250) 
backGround3.xScale = 0.5 
backGround3.yScale = 0.5 
self.addChild(backGround3) 
let spriteNode3 = SKSpriteNode(color: UIColor.yellowColor(), size: CGSize(width: 100, height: 100)) 
spriteNode3.zPosition = 0.001 
backGround3.addChild(spriteNode3) 
+2

La proprietà zPosition controlla l'ordine in cui vengono disegnati i nodi. Il nodo con il valore più alto sarà in cima. Il valore predefinito è 0. – 0x141E

+0

Grazie per la risposta! Sì, l'impostazione di zPosition su qualcosa di positivo ha risolto il problema. Ma non sono abbastanza soddisfatto di questa soluzione. Si prega di vedere la spiegazione nella mia modifica della domanda. Penso che l'aggiunta di un bambino con zPosition = 0 dovrebbe collocarla automaticamente sopra il suo genitore. – uaknight

risposta

9

Quello che stai cercando è la proprietà ignoresSiblingOrder su SKView:

Un valore booleano che indica se padre-figlio e fratello relazioni influenzano l'ordine di rendering dei nodi nella scena.

Il 6.x di default Xcode (e forse 5, non ho controllato) modello SpriteKit stabilisce che per true quando si imposta il SKView nel controller della vista. Impostandolo su true, l'ordine di aggiunta dei nodi alla scena non influisce sulla posizione z. Se lo si imposta su false, verranno sovrapposti nell'ordine in cui vengono aggiunti alla scena (o al nodo padre).

Detto questo, SpritKit può fare alcune ottimizzazioni quando ignoresSiblingOrder è true (che è il motivo per cui è il default nel modello), quindi è probabilmente meglio tenerlo in questo modo se possibile. In tal caso, dovrai impostare manualmente la proprietà zPosition di ciascun nodo.

Problemi correlati