2014-11-08 77 views
0

我正在使用Swift創建一個基本的宇宙飛船遊戲,並且一切都運行良好,直到我嘗試添加一個功能,其中每當用戶滑動時飛船升起。我添加了一個UISwipeGestureRecognizer並在我的GameViewController中將它與一個IBAction連接起來,然後我打算在我的GameScene中調用一個方法來使這個宇宙飛船向上移動。我的GameScene返回零,當我嘗試在GameViewController中使用它

import UIKit 
import SpriteKit 

extension SKNode { 
    class func unarchiveFromFile(file : NSString) -> SKNode? { 
     if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") { 
      var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)! 
      var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData) 

      archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene") 
      let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene 
      archiver.finishDecoding() 
      return scene 
     } else { 
      return nil 
     } 
    } 
} 
class GameViewController: UIViewController { 

    let scene: GameScene! 

    @IBAction func swipeUp(sender: UISwipeGestureRecognizer){ 
     scene.movePlaneUp() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene { 
      let skView = self.view as SKView 
      skView.ignoresSiblingOrder = true 
      scene.scaleMode = .AspectFill 

      skView.presentScene(scene) 
     } 
    } 

    override func shouldAutorotate() -> Bool { 
     return false 
    } 

    override func supportedInterfaceOrientations() -> Int { 
     if UIDevice.currentDevice().userInterfaceIdiom == .Phone { 
      return Int(UIInterfaceOrientationMask.AllButUpsideDown.rawValue) 
     } else { 
      return Int(UIInterfaceOrientationMask.All.rawValue) 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    override func prefersStatusBarHidden() -> Bool { 
     return true 
    } 
} 

一切編譯和但是應用程序運行,每當我試圖向上輕掃,我得到一個致命的錯誤:意外發現零,同時上線展開一個可選值

scene.movePlaneUp() 

我明白髮生錯誤的原因是場景的值爲零,但是如何讓場景實際上具有GameScene的值?

這裏是我的代碼GameScene:

import SpriteKit 

class GameScene: SKScene { 
    override func didMoveToView(view: SKView) { 
     let bg = SKSpriteNode(imageNamed: "Background") 
     bg.size = self.frame.size 
     bg.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)) 
     self.addChild(bg) 
     let sprite = SKSpriteNode(imageNamed: "Spaceship") 
     sprite.xScale = 0.6 
     sprite.yScale = 0.5 
     sprite.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMinY(self.frame)+CGRectGetMaxY(sprite.frame)) 
     sprite.name = "spaceship" 
     self.addChild(sprite) 
    } 
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
     var t = touches.allObjects[0] 
     let location = t.locationInNode(self) 
     let action = SKAction.moveToX(location.x, duration:0.1) 
     let n = self.childNodeWithName("spaceship") 
     n?.runAction(action) 
     let bullet = SKSpriteNode(imageNamed: "Spaceship") 
     bullet.xScale = 0.05 
     bullet.yScale = 0.05 
     bullet.position = CGPoint(x: location.x, y: 200+bullet.position.y) 
     bullet.runAction(SKAction.moveToY(1000, duration: 0.75)) 
     self.addChild(bullet) 
    } 
    func movePlaneUp(){ 
     let n = childNodeWithName("spaceship") 
     n?.removeAllActions() 
     let action = SKAction.moveBy(CGVector(dx: 0, dy: 100), duration: 1) 
     n?.runAction(action) 
    } 
} 

回答

0

我意識到我有錯誤是因爲我從來沒有指派任何場景的原因。我解決我的問題,通過改變

let scene: GameScene! 

let myScene: GameScene! 

然後我改變了我的viewDidLoad到

override func viewDidLoad() { 
    super.viewDidLoad() 
    if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene { 
     let skView = self.view as SKView 
     skView.ignoresSiblingOrder = true 
     scene.scaleMode = .AspectFill 
     skView.presentScene(scene) 
     myScene = scene 
    } 
} 

然後實際分配一個值myScene

0

我知道這是有點晚...如果你使用self.scene = scene它也會有效。這是由於使用if let scene創建的scene變量覆蓋了if let範圍內的任何其他具有相同名稱的變量。你現在可能已經知道了這一點(因爲它已經創建了兩年):)但是,我希望這對新手來說是有用的。

相關問題