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)
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
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