sprite-kit
SKScene
Recherche…
Remarques
SKScene représente une scène unique dans une application SpriteKit. Un SKScene est présenté dans un SKView . SKSpriteNodes sont ajoutés à la scène pour implémenter les sprites réels.
Les applications simples peuvent avoir un SKScene unique contenant tout le contenu SpriteKit. Des applications plus complexes peuvent avoir plusieurs SKScen présentés à des moments différents (par exemple, une scène d'ouverture pour présenter les options de jeu, une deuxième scène pour implémenter le jeu lui-même et une troisième scène pour présenter les résultats de Game Over).
Sous-classement de SKScene pour implémenter la fonctionnalité SpriteKit principale
La fonctionnalité SpriteKit peut être implémentée dans une sous-classe de SKScene. Par exemple, un jeu peut implémenter la fonctionnalité principale du jeu dans une sous-classe SKScene appelée GameScene.
En Swift :
import SpriteKit
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
/* Code here to setup the scene when it is first shown. E.g. add sprites. */
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch in touches {
let location = touch.locationInNode(self)
/* Code here to respond to a user touch in the scene at location */
}
}
override func update(currentTime: CFTimeInterval) {
/* Code here to perform operations before each frame is updated */
}
}
La fonctionnalité secondaire pourrait alors être implémentée dans des sous-classes des SKSpriteNodes utilisées dans la scène (voir Sous-classement de SKSpriteNode ).
Créer un SKScene qui remplit le SKView
Un cas simple pour créer un SKScene qui remplit exactement le SKView. Cela évite d'avoir à considérer la mise à l'échelle de la vue pour l'ajuster ou à définir une caméra pour afficher une partie de la scène.
Le code suivant suppose qu'un SKView appelé skView existe déjà (par exemple, tel que défini dans Créer un SKView en plein écran à l'aide d'Interface Builder ) et qu'une sous-classe de SKScene appelée GameView a été définie:
En Swift :
let sceneSize = CGSizeMake(skView.frame.width, skView.frame.height)
let scene = SKScene(size: sceneSize)
skView.presentScene(scene)
Cependant, si SKView peut changer de taille (par exemple, si l'utilisateur fait pivoter son appareil et que cela entraîne l'étirement de la vue en raison de ses contraintes), le SKScene ne sera plus compatible avec SKView. Vous pouvez gérer cela en redimensionnant le SKScene chaque fois que SKView change de taille (par exemple, dans la méthode didChangeSize).
Créez un SKScene adapté à SKView
Un SKScene a un paramètre scaleMode qui définit la manière dont il changera de taille pour qu'il corresponde au SKView qu'il présente dans SKView s'il n'a pas la même taille et / ou la même forme.
Il y a quatre options pour scaleMode:
- AspectFit : la scène est mise à l'échelle (mais pas étirée) jusqu'à ce qu'elle rentre dans la vue. Cela garantit que la scène n'est pas déformée, mais il peut y avoir certaines zones de la vue qui ne sont pas couvertes par la scène si la scène n'a pas la même forme que la vue.
- AspectFill : la scène est mise à l'échelle (mais pas étirée) pour remplir complètement la vue. Cela garantit que la scène n'est pas déformée et que la vue est complètement remplie, mais que certaines parties de la scène peuvent être tronquées si la scène n'a pas la même forme que la vue.
- Remplir : la scène est mise à l'échelle (et si nécessaire étirée) pour remplir complètement la vue. Cela garantit que la vue est complètement remplie et qu'aucune de vos scènes n'est recadrée mais que la scène sera déformée si la scène n'a pas la même forme que la vue.
- ResizeFill : la scène n'est pas du tout dimensionnée, mais sa taille est modifiée pour s'adapter à la taille de la vue.
Le code suivant suppose qu'un SKView appelé skView existe déjà (par exemple, tel que défini dans Créer un SKView plein écran à l'aide d'Interface Builder ) et qu'une sous-classe de SKScene appelée GameView a été définie, puis utilise le scaleMode AspectFill :
Dans Swift 3 :
let sceneSize = CGSize(width:1000, height:1000)
let scene = GameScene(size: sceneSize)
scene.scaleMode = .aspectFill
skView.presentScene(scene)
Créer un SKScene avec un SKCameraNode (iOS 9 et versions ultérieures)
Vous pouvez placer un SKCameraNode dans un SKScene pour définir quelle partie de la scène est affichée dans SKView. Pensez au SKScene comme à un monde en 2D avec une caméra flottant au-dessus: le SKView montre ce que la caméra «voit».
Par exemple, la caméra pourrait être attachée au sprite du personnage principal pour suivre l'action d'un jeu défilant.
Le SKCameraNode a quatre paramètres qui définissent quelle partie de la scène est affichée:
- position : c'est la position de la caméra dans la scène. La scène est rendue pour placer cette position au milieu du SKView.
- xScale et yScale : définissent le zoom de la scène dans la vue. Gardez ces deux valeurs identiques pour éviter de déformer la vue. Une valeur de 1 signifie qu'il n'y a pas de zoom, que les valeurs inférieures à 1 font un zoom avant (rendent les images-objets plus grandes) et les valeurs supérieures à 1 font un zoom arrière (rendent les images-objets plus petites).
- zRotation : définit la rotation de la vue dans la vue. Une valeur de zéro ne sera pas une rotation. La valeur est en radians, donc une valeur de Pi (3.14 ...) fera pivoter la vue à l'envers.
Le code suivant suppose qu'un SKView appelé skView existe déjà (par exemple, tel que défini dans Créer un SKView plein écran à l'aide d'Interface Builder ) et qu'une sous-classe de SKScene appelée GameView a été définie. Cet exemple définit simplement la position initiale de la caméra, vous devrez déplacer la caméra (de la même manière que vous le feriez avec d'autres SKSpriteNodes dans la scène) pour faire défiler votre vue:
Dans Swift 3 :
let sceneSize = CGSize(width:1000, height:1000)
let scene = GameScene(size: sceneSize)
scene.scaleMode = .aspectFill
let camera = SKCameraNode()
camera.position = CGPointM(x:500, y:500)
camera.xScale = 1
camera.yScale = 1
camera.zRotation = 3.14
scene.addChild(camera)
scene.camera = camera
skView.presentScene(scene)