好吧,所以我在Swift中有sprite kit游戏,我在Apple为你设置的GameScene.swift
文件中创建了我的游戏,这一切都很有效。现在我想在同一个项目中创建另一个游戏场景。
当游戏结束时,游戏现在移动到我在故事板中设置的新UIViewController(名为GameOverBufferViewController
)。但我希望它能够进入一个全新的游戏场景。
所以我查看了GameViewController
中GameScene.swift
如何加载(因为游戏场景需要视图控制器以及SKScene
代码)并将其复制到我的视图控制器文件中UIViewController,当游戏结束时游戏移动到。
我更改了对GameScene
的引用以匹配我的新游戏场景swift文件(GameOverScene1
)和unarchiveFromFile
func以避免错误:
import UIKit
import SpriteKit
extension SKNode {
class func unarchiveFromFile2(file : NSString) -> SKNode? {
if let path = NSBundle.mainBundle().pathForResource(file as String, 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! GameOverScene1
archiver.finishDecoding()
return scene
} else {
return nil
}
}
}
class GameOverBufferViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
if let scene = GameOverScene1.unarchiveFromFile2("GameOverScene1") as? GameOverScene1 {
// Configure the view.
let skView = self.view as! SKView
skView.showsFPS = true
skView.showsNodeCount = true
skView.showsPhysics = false
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .AspectFill
skView.presentScene(scene)
}
}
然后我在这里设置我的GameOverScene1.swift
文件:
import SpriteKit
class GameOverScene1: SKScene {
override func didMoveToView(view: SKView) {
//Do stuff in scene
println("it works!")
}
}
游戏运行没有任何错误或崩溃,但GameOverScene1
没有运行;它只是GameOverBufferViewController
。控制台上也没有任何内容。
我做错了什么?
EDIT ********
这就是我的GameOverBufferViewController
文件现在的样子,我收到SIGABRT
错误could not cast a UIView as an SKView
:
import UIKit
import SpriteKit
class GameOverBufferViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
// Configure the view.
back()
}
func back() {
view.subviews.map({ $0.removeFromSuperview() })
let theView = view as! SKView //error on this line
let theMainMenu = GameOverScene( size: view.frame.size )
theMainMenu.scaleMode = SKSceneScaleMode.ResizeFill
theView.presentScene( theMainMenu )
}
答案 0 :(得分:0)
我只是用这个:
func back() {
let theView = view as! SKView
let theMainMenu = MainMenu( size: view.frame.size )
theMainMenu.scaleMode = SKSceneScaleMode.ResizeFill
theView.presentScene( theMainMenu )
}
MainMenu
是SKScene
的子类。
编辑:
确保在主UIView
的{{1}}函数运行时,您将视图声明为ViewController
。像这样:
viewDidLoad()
答案 1 :(得分:0)
试试这个:
let SceneMove = SceneName(size: self.scene!.size)
SceneMove.scaleMode = SKSceneScaleMode.AspectFill
self.scene!.view!.presentScene(SceneMove)
SceneName当然是场景的名称。
来自skyguy和他发布的链接:How to transition scenes in Swift
答案 2 :(得分:0)
我认为问题来自你的" unarchiveFromFile"扩展SKNode的功能。
尝试更改此行:
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! GameOverScene1
到此:
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! SKScene
另请注意,您不需要有很多" unarchiveFromFile"每个新场景(每个新级别)的函数,只需在GameViewController类中导入后定义一个。