2016-05-17 26 views
0

我正在爲高中編程課程創建Swift項目。我似乎無法弄清楚這個問題,而且我班上的其他人似乎都沒有任何想法。故事板圖像中的Seque點擊進入SpriteKitScene

首先,我創建了一個新的Swift項目,並選擇了一種遊戲格式。

new project template

然後我用一些基本的代碼,以使第一級爲我的遊戲,迷宮移動,而不是周圍的球基於用戶如何傾斜設備中的迷宮遊戲。 這是我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 */ 
    } 
} 

我想有一個應用程序打開進入主菜單,這是mainMenu.storyboard

menu storyboard

我已經成功地應用程序啓動到mainMenu.storyboard(和當我測試level1.sks時,物理層的物理效果很好),但是我很難弄清楚如何繼續。

目標:我希望當人們在mainMenu.storyboard中點擊相應的圖片時,他們會被困在level1.sks(以及我以後添加的關卡)中。

我無法使用添加Storyboard引用的方法來縮小它,因爲Storyboard Reference不會讓我選擇level1.sks

我也很想了解如何使用戶返回主菜單時,玩家圖標觸及目標(藍色的事情了接近頂部,在這個截圖):

game maze screenshot

回答

0

所以要做到這一點,我認爲最好的方法是創建另一個ViewController子類,可能名爲LauncherViewController,它將呈現您的SKScene。然後在你的故事板上添加這個viewController並讓你的菜單在圖像印刷機上繼續播放。

下面是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) 

    } 
} 

凡在你的菜單控制你有一個prepareForSegue這樣開始:

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

有你LauncherViewController駁回gameScene當用戶完成迷宮,使用委託模式。因此,在GameScene添加類以上的協議

protocol GameDelegate { 
    func gameFinished() 
} 

有你LauncherViewController符合此委託和gameScene的委託變量設置爲自(見下文)

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

在GameScene添加一個變量來保存委託(LauncherViewController)並添加一個調用委託函數的函數。您還需要添加邏輯來了解遊戲何時結束,因爲我沒有這樣做。

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

}

有可能會出現一些錯誤,在這裏我寫這個我的手機上,以便略低於評論任何你不確定或不工作。

+0

了不起的信息到目前爲止@OlivierWilkinson。謝謝。我創建了LauncherViewController並在主菜單故事板中添加了對它的引用。但是,當我控制拖動1按鈕到新的視圖控制器時,它不會讓我選擇該視圖控制器。所以我不能在按鈕和Launcher View Controller之間創建segue。該按鈕也具有輕擊手勢識別器。有什麼想法嗎? –

+0

是1,2,3,4和5個UIButtons?如果他們是UIImages,那麼你將無法通過這種方式連接賽格。相反,您需要從菜單viewController頂部的橙色按鈕拖動到啓動器視圖控制器,命名segue,並在手勢識別器調用的函數中使用performSegueWithIdentifier(「您命名您的segue」,sender:self)。那有意義嗎?我沒有特別好地解釋自己 –

+0

沒有那麼完美,謝謝。我將它們更改爲帶有圖像紋理的按鈕,並讓它可以繼續播放。我會繼續努力,如果我需要其他任何東西,請回復您。迄今爲止,非常感謝您的幫助。 –