好了,我在Swift中有了精灵工具包游戏,我在苹果为你设置的GameScene.swift文件中创建了我的游戏,所有这些都运行得很好。现在我想在这个项目中创建另一个游戏场景。
当游戏结束时,现在游戏移动到我在故事板中设置的一个新的UIViewController (名为GameOverBufferViewController)。但我想把它移到一个全新的游戏场景。
因此,我查看了如何在GameScene.swift中加载GameViewController (因为游戏场景需要一个视图控制器以及SKScene代码),并将其复制到我的UIViewController的视图控制器文件中,游戏结束后将移动到该文件中。
我更改了对GameScene的引用,以匹配我的新游戏场景swift文件(GameOverScene1)和unarchiveFromFile函数,以避免错误:
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。控制台也不会打印任何内容。
我做错了什么?
编辑*
这就是我的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 )
} 发布于 2015-08-23 03:05:00
我只是使用这个:
func back() {
let theView = view as! SKView
let theMainMenu = MainMenu( size: view.frame.size )
theMainMenu.scaleMode = SKSceneScaleMode.ResizeFill
theView.presentScene( theMainMenu )
}MainMenu是SKScene的一个子类。
编辑:
确保在主ViewController的viewDidLoad()函数运行时将视图声明为UIView。如下所示:
override func viewDidLoad() {
super.viewDidLoad()
let theView = view as! SKView
let theWelcome = Welcome( size: view.bounds.size )
theWelcome.scaleMode = SKSceneScaleMode.ResizeFill
theView.presentScene( theWelcome )
}发布于 2015-08-24 13:03:51
试试这个:
let SceneMove = SceneName(size: self.scene!.size)
SceneMove.scaleMode = SKSceneScaleMode.AspectFill
self.scene!.view!.presentScene(SceneMove)当然,SceneName是场景的名称。
来自skyguy的致谢和他发布的链接:How to transition scenes in Swift
发布于 2016-03-06 15:37:06
我认为问题来自于扩展SKNode的"unarchiveFromFile“函数。
尝试更改此行:
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! GameOverScene1 要这样做:
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! SKScene另请注意,您不需要为每个新场景(每个新级别)都有许多"unarchiveFromFile“函数,只需在GameViewController类中导入后定义一个。
https://stackoverflow.com/questions/32159641
复制相似问题