2016-05-17 2 views
0

Je crée un projet Swift pour une classe de programmation de lycée. Je n'arrive pas à comprendre ce problème, et tout le monde dans ma classe ne semble pas avoir d'idées. Pour commencer, j'ai créé un nouveau projet Swift et j'ai choisi un format de jeu.Seque à partir d'une image de storyboard puiser dans un SpriteKitScene

new project template

J'ai ensuite utilisé un code de base pour faire le premier niveau pour mon jeu, un jeu de labyrinthe où le labyrinthe se déplace autour au lieu de la balle sur la façon dont l'basé utilisateur incline vers l'appareil. Ceci est mon GameScene.swift:

import SpriteKit 
import CoreMotion 

var accelupdateinterval = 0.1 
var accelmultiplier = 15.0 

class GameScene: SKScene { 

    let manager = CMMotionManager() 

    override func didMoveToView(view: SKView) { 


     manager.startAccelerometerUpdates() 
     manager.accelerometerUpdateInterval = accelupdateinterval 
     manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()){ 
      (data, error) in 

      self.physicsWorld.gravity = CGVectorMake(CGFloat((data?.acceleration.x)!) * CGFloat(accelmultiplier), CGFloat((data?.acceleration.y)!) * CGFloat(accelmultiplier)) 

     } 

    } 

    override func update(currentTime: CFTimeInterval) { 
     /* Called before each frame is rendered */ 
    } 
} 

Je veux avoir un menu principal que l'application s'ouvre dans, qui est mainMenu.storyboard:

menu storyboard

J'ai réussi à l'application de se lancer dans la mainMenu.storyboard (et la physique du niveau fonctionne bien quand j'ai testé le level1.sks), mais j'ai du mal à comprendre comment procéder. OBJECTIF: Je souhaite que les personnes soient intégrées dans le (et les niveaux que j'ajouterai plus tard) lorsqu'elles tapent sur l'image correspondante dans mainMenu.storyboard.

Je ne peux pas utiliser la méthode d'ajout d'une référence de storyboard pour la fusionner, car la référence du storyboard ne me laisse pas choisir level1.sks.

J'aimerais aussi savoir comment envoyer les utilisateurs de revenir au menu principal lorsque l'icône du joueur touche le but (la chose bleue près du sommet dans cette capture d'écran):

game maze screenshot

Répondre

0

Pour ce faire, je pense que la meilleure approche consiste à créer une autre sous-classe ViewController, peut-être nommée LauncherViewController, qui présentera votre SKScene. Ensuite, dans votre storyboard, ajoutez ce viewController et faites-y apparaitre votre menu sur une image pressée.

est ici un début pour la LauncherViewController

class LauncherViewController: UIViewController { 

    var gameScene: GameScene! 

    override func viewDidLoad() { 

    } 

    override func viewWillAppear() { 
     presentGameScene() 
    } 

    func presentGameScene(){ 

     let skView = self.view as! SKView 
     skView.showsFPS = false 
     skView.showsNodeCount = false 
     skView.ignoresSiblingOrder = true 
     gameScene.size = skView.bounds.size 
     gameScene.scaleMode = .AspectFill 
     skView.presentScene(gameScene) 

    } 
} 

Où dans votre contrôleur de menu que vous avez un prepareForSegue comme ceci:

override func prepareForSegue(segue: UIStoryBoardSegue, sender: AnyObject?) { 
    if segue.identifier == "yourSegue" { 
     let destinationViewController = segue.destinationViewController as! LauncherViewController 
     destinationViewController.gameScene = GameScene() 
} 

avoir votre LauncherViewController rejeter le gameScene lorsque l'utilisateur se termine le labyrinthe , utilisez un modèle de délégué. Ainsi, dans GameScene ajouter un protocole au-dessus de votre classe

protocol GameDelegate { 
    func gameFinished() 
} 

ont votre LauncherViewController conforme à ce délégué et définir la variable délégué du gameScene à l'auto (voir ci-dessous)

class LauncherViewController: UIViewController, GameDelegate { 

    var gameScene: GameScene! 

    override func viewDidLoad() { 
     gameScene.delegate = self 
    } 

    override func viewWillAppear() { 
     presentGameScene() 
    } 

    func presentGameScene(){ 

     let skView = self.view as! SKView 
     skView.showsFPS = false 
     skView.showsNodeCount = false 
     skView.ignoresSiblingOrder = true 
     gameScene.size = skView.bounds.size 
     gameScene.scaleMode = .AspectFill 
     skView.presentScene(gameScene) 

    } 

    func gameFinished(){ 
     // this forces LauncherViewController to dismiss itself 
     dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

ajouter une variable GameScene pour maintenir la déléguer (LauncherViewController) et ajouter une fonction qui appelle la fonction de délégué. Vous devrez également ajouter la logique pour savoir quand le jeu est terminé car je n'ai pas fait cela.

class GameScene: SKScene { 

    let manager = CMMotionManager() 
    var delegate: GameDelegate! 

    override func didMoveToView(view: SKView) { 


    manager.startAccelerometerUpdates() 
    manager.accelerometerUpdateInterval = accelupdateinterval 
    manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()){ 
     (data, error) in 

     self.physicsWorld.gravity = CGVectorMake(CGFloat((data?.acceleration.x)!) * CGFloat(accelmultiplier), CGFloat((data?.acceleration.y)!) * CGFloat(accelmultiplier)) 

    } 

} 

func gameOver(){ 
    delegate.gameFinished() 
} 

override func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 
    // it's probably easiest to add the logic for a gameOver here 
    if gameIsOver { 
     gameOver() 
    } 
} 

}

Il y aura probablement quelques erreurs ici comme je l'ai écrit sur mon téléphone pour faire un commentaire ci-dessous pour tout ce que vous n'êtes pas sûr ou ne fonctionne pas.

+0

Excellente information jusqu'à présent @OlivierWilkinson. Merci. J'ai créé le LauncherViewController et ajouté la référence dans le storyboard du menu principal. Cependant, quand je fais glisser le bouton 1 vers le nouveau contrôleur de vue, il ne me laisse pas choisir ce contrôleur de vue. Donc je ne peux pas créer la séquence entre le bouton et le Launcher View Controller. Le bouton dispose également d'un outil de reconnaissance de gestes. Des pensées? –

+0

sont 1,2,3,4 et 5 UIButtons? Si ce sont des UIImages, vous ne pourrez pas connecter une section de cette façon. à la place, vous devez faire glisser le bouton orange en haut de votre menu viewController vers le contrôleur du lanceur, nommez le segue, et utilisez performSegueWithIdentifier ("tout ce que vous avez appelé votre segue", expéditeur: self) dans la fonction que le reconnaisseur gestuel appelle. Cela a-t-il du sens? Je ne m'expliquais pas particulièrement bien –

+0

Non, c'était tout à fait logique, merci. Je les ai changés en boutons avec une texture d'image, et ça m'a permis de faire le segue. Je continuerai à travailler pour l'instant et je reviendrai vers vous si j'ai besoin d'autre chose. Merci beaucoup pour votre aide jusqu'à présent. –