Sto ancora giocando con l'apprendimento di SpriteKit in iOS & ho fatto un sacco di letture di & lotti di sperimentazione. Sono confuso da qualcos'altro che ho trovato * per quanto riguarda le coordinate, i frame dei nodi &.Confusione su coordinate, frame e nodi figlio in SpriteKit su iOS?
Si consideri questo frammento di codice, in cui sto cercando di disegnare una casella verde intorno alla mia nave spaziale sprite a scopo di debug:
func addSpaceship()
{
let spaceship = SKSpriteNode.init(imageNamed: "rocketship.png")
spaceship.name = "spaceship"
// VERSION 1
spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
let debugFrame = SKShapeNode(rect: spaceship.frame)
debugFrame.strokeColor = SKColor.greenColor()
spaceship.addChild(debugFrame)
// VERSION 2
// spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
spaceship.setScale(0.50)
self.addChild(spaceship)
}
Se aggiungo il set lo sprite nave spaziale con la linea marcata "VERSIONE 1" di cui sopra, ottengo questo:
che è chiaramente sbagliata. Ma se io commento fuori la linea marcata "VERSIONE 1" di cui sopra, e di utilizzare invece la linea marcata "VERSIONE 2", ottengo ciò che voglio:
Si noti che il codice vero e proprio per le linee marcato Versione 1 & Versione 2 è identico: spaceship.position = CGPointMake (CGRectGetMidX (self.frame), CGRectGetMidY (self.frame))
Allora perché è importante quando ho impostato la posizione dello sprite astronave?
A mio modo di pensare, la posizione dello sprite navicella spaziale è irrilevante per il posizionamento del del debugFrame, perché il debugFrame è un figlio della nave spaziale sprite & quindi, è coordinate dovrebbero essere relativo al telaio del sprite astronave - destra?
Grazie WM
* Questo è in qualche modo legati ad una domanda ho chiesto ieri:
In SpriteKit on iOS, scaling a textured sprite produces an incorrect frame?
ma a) capisco che uno ora, e b) si tratta di una sufficiente che diverso merita la sua stessa domanda.
UPDATE:
Hmmm - grazie, ragazzi per le idee di seguito, ma io ancora non capisco & forse questo sarà di aiuto.
ho modificato il mio codice per stampare le posizioni relavant & cornici:
func addSpaceship()
{
let spaceship = SKSpriteNode.init(imageNamed: "rocketship.png")
spaceship.name = "spaceship"
println("Spaceship0 Pos \(spaceship.position) Frame = \(spaceship.frame)")
// VERSION 1 (WRONG)
spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
println("Spaceship1 Pos \(spaceship.position) Frame = \(spaceship.frame)")
let debugFrame = SKShapeNode(rect: spaceship.frame)
println("DEBUG Pos \(debugFrame.position) Frame = \(debugFrame.frame)")
debugFrame.strokeColor = SKColor.greenColor()
spaceship.addChild(debugFrame)
// VERSION 2 (RIGHT)
// spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
// println("Spaceship2 Pos \(spaceship.position) Frame = \(spaceship.frame)")
spaceship.setScale(0.50)
self.addChild(spaceship)
}
Poi, mi sono imbattuto in entrambi i modi hanno ottenuto questi risultati. Dal momento che capisco la versione 2, iniziamo da lì.
Correndo con la "versione 2 (DESTRA)" Codice, ho ottenuto:
Spaceship0 Pos (0.0,0.0) Frame = (-159.0,-300.0,318.0,600.0)
DEBUG Pos (0.0,0.0) Frame = (-159.5,-300.5,319.0,601.0)
Spaceship2 Pos (384.0,512.0) Frame = (225.0,212.0,318.0,600.0)
Il nodo astronave inizia, per impostazione predefinita, con la sua posizione in basso a sinistra dello schermo (Spaceship0). La sua cornice è espressa anche in termini di punto di ancoraggio (centro) impostato nella parte inferiore sinistra dello schermo, quindi i numeri negativi per l'origine del suo frame rect.
Il frame di debug viene quindi creato con la sua posizione impostata su 0, 0 per impostazione predefinita & il frame impostato per essere uguale a quello dell'astronave.
Il codice (Spaceship2) sposta il nodo della navicella spaziale in una posizione nelle coordinate della vista (384.0,512.0) e l'origine della sua cornice viene spostata aggiungendo la nuova posizione all'origine precedente (vale a dire 384 + -159 = 225).
Tutto va bene.
Purtroppo, ancora non capisco Versione 1.
Quando eseguo con la "versione 1 (sbagliato)," Codice, ottengo
Spaceship0 Pos (0.0,0.0) Frame = (-159.0,-300.0,318.0,600.0)
Spaceship1 Pos (384.0,512.0) Frame = (225.0,212.0,318.0,600.0)
DEBUG Pos (0.0,0.0) Frame = (0.0,0.0,543.5,812.5)
Come sopra, inizia nodo spaziale , per impostazione predefinita, con la sua posizione in basso a sinistra dello schermo (Spaceship0). La sua cornice è espressa anche in termini di punto di ancoraggio (centro) impostato nella parte inferiore sinistra dello schermo, quindi i numeri negativi per l'origine del suo frame rect.
Il codice (Spaceship1) sposta il nodo della navicella spaziale in una posizione nelle coordinate della vista (384.0,512.0) e l'origine della sua cornice viene spostata aggiungendo la nuova posizione all'origine precedente (ad).
Il frame di debug viene quindi creato con la sua posizione impostata su 0, 0 per impostazione predefinita & il suo frame impostato per avere una larghezza strana (543,5) & un'altezza strana (812,5). Dato che sto inizializzando il debugFrame.frame con spaceship.frame (i penso che sia che è quello che fa l'inizializzatore di default), mi aspetterei che il nuovo debugFrame.frame sia lo stesso del frame dell'astronave - ma non lo è! I valori di altezza del riquadro di debug & apparentemente provengono dall'aggiunta della larghezza effettiva & all'altezza del frame del nodo dell'astronave (543,5 = 225 + 318,5). Ma se questo è il caso, perché l'origine del frame è ancora 0, 0 & non la stessa aggiunta (225.0 + 0 = 225.0) ???
Non capisco.
registro spaceship.frame, si noterà la sua origine dipende dalla posizione. poiché la forma è un figlio dell'astronave, la posizione della forma è relativa ad essa. Quindi se frame.origin è 0,0 tutto va bene, ma se è 200.200 la forma sarà compensata di conseguenza. – LearnCocos2D
Grazie mille - ma temo di non averlo ancora capito. Vedi il mio aggiornamento sopra. – WonderMonster