2015-03-20 13 views
6

Sto creando un gioco universale per tutti i dispositivi iOS in modalità verticale utilizzando Swift. In GameViewController Sto creando scena come questa:Posizione SkSpriteNode nel gioco universale

let scene = GameScene(size:CGSize(width: 1536, height: 2048)) 
scene.scaleMode = .AspectFill 

immagine di sfondo ha 1536x2048 di risoluzione, e quindi con scaleMode sopra su iPad è visualizzato nella sua dimensione completa, su iPhone 6 1152x2048 viene visualizzata con i lati tagliati. Funziona perfettamente su tutti i dispositivi e serve solo un'immagine di sfondo. Il problema è che se richiamo size.width o self.frame.size.width restituisce sempre 1536, anche se l'area visibile effettiva è ad es. 1152.

Come posso impostare la posizione di SkSpriteNode relativa all'area visibile, in modo che sia ad esempio 50x50 dall'angolo su ogni dispositivo?

risposta

10

Come è possibile impostare la posizione di SkSpriteNode con riferimento al campo visibile, in modo che sarà per esempio 50x50 dall'angolo su ogni dispositivo?

"L'area visibile" è semplicemente la vista.

modo da poter fare le vostre posizioni rispetto al vista, e non la scena . Realmente faccio questo molto nel mio gioco, che è universale e funziona sia su OS X che su iOS.

Nel mio caso lo faccio normalmente per l'interfaccia utente, quindi potrei avere una scena in scala ma voglio impostare alcune posizioni non relative alla scena in scala ma relative all'area visibile (cioè la vista).

Per fare ciò, è possibile scrivere una funzione che converta le coordinate della vista sulle coordinate di scena corrispondenti.

Ecco la mia funzione che utilizzo. Nota che sottraggo la mia posizione y desiderata dall'altezza della vista in modo che possa trattare (0,0) come fa il kit sprite-bottom in basso invece di quello in alto a sinistra come fa UIKit.

func convert(point: CGPoint)->CGPoint { 
    return self.view!.convertPoint(CGPoint(x: point.x, y:self.view!.frame.height-point.y), toScene:self) 
} 

Ecco un esempio di utilizzo di questa funzione:

self.node.position = convert(CGPoint(x: 50, y: 50)) 

Questo sarà sempre forzare la posizione del nodo di essere a (50,50) rispetto alla visualizzazione (la parte visibile del schermo) indipendentemente da come la scena viene ridimensionata e ridimensionata.

+0

Quindi stai usando questa funzione in GameViewController e questo è anche il luogo dove stai aggiungendo l'interfaccia utente? –

+0

@shargath Oops, dovrebbe dire view, non sceneView. Lo modificherò ora. Sto usando questo metodo in scene di classe.E la mia interfaccia utente è interamente in sprite-kit. –

+0

Grande, perché ho fatto la mia intera interfaccia utente anche in spriteKit per cui la classe di scene funziona per me :) –

1

Non penso che questo sia davvero l'approccio migliore. Si dovrebbe creare la GameScene in base alle dimensioni del SKView

let scene = GameScene(size: self.skView.bounds.size) 

Non credo che si dovrebbe essere imposta una misura universale per tutti i dispositivi. È necessario consentire al dispositivo di impostare le dimensioni delle scene in base alla risoluzione dello schermo. Quindi è necessario creare immagini diverse in base al dispositivo. 2x, 3x, 2x ~ ipad ecc ..

Questo tutorial è un buon punto di partenza: http://www.raywenderlich.com/49695/sprite-kit-tutorial-making-a-universal-app-part-1

+1

Beh, in realtà l'approccio che ho usato è stato nel libro di Raywenderlich.com i giochi iOS per esercitazioni ... –

Problemi correlati