我正在尝试创建一个基于SpriteKit的游戏,并试图在我继续之前建立基本的蓝牙连接,但是我的游戏在从菜单上切换到GameScene时崩溃了,并且我得到了一个“无法将'UIView‘类型的值转换为'SKView'”的错误。我的游戏菜单如下:
import UIKit
import MultipeerConnectivity
class TitleScreenViewController: UIViewController, MCBrowserViewControllerDelegate {
@IBOutlet weak var TitleLabel: UILabel!
@IBOutlet weak var PlayLocallyButton: UIButton!
@IBOutlet weak var PlayOnlineButton: UIButton!
@IBOutlet weak var SettingsButton: UIButton!
@IBOutlet weak var GameCenterButton: UIButton!
var appDelegate:AppDelegate!
override func viewDidLoad() {
super.viewDidLoad()
PlayLocallyButton.layer.borderColor = UIColor.blackColor().CGColor
PlayLocallyButton.layer.cornerRadius = 10
PlayLocallyButton.layer.borderWidth = 1
PlayOnlineButton.layer.borderColor = UIColor.blackColor().CGColor
PlayOnlineButton.layer.cornerRadius = 10
PlayOnlineButton.layer.borderWidth = 1
SettingsButton.layer.borderColor = UIColor.blackColor().CGColor
SettingsButton.layer.cornerRadius = 10
SettingsButton.layer.borderWidth = 1
GameCenterButton.layer.borderColor = UIColor.blackColor().CGColor
GameCenterButton.layer.cornerRadius = 10
GameCenterButton.layer.borderWidth = 1
appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.mpcHandler.setupPeerWithDisplayName(UIDevice.currentDevice().name)
appDelegate.mpcHandler.setupSession()
appDelegate.mpcHandler.selfAdvertise(true)
}
@IBAction func ConnectWithPlayer(sender: AnyObject) {
if appDelegate.mpcHandler.session != nil {
appDelegate.mpcHandler.setupBrowser()
appDelegate.mpcHandler.browser.delegate = self
self.presentViewController(appDelegate.mpcHandler.browser, animated: true, completion: nil)
}
}
func browserViewControllerDidFinish(browserViewController: MCBrowserViewController!) {
appDelegate.mpcHandler.browser.dismissViewControllerAnimated(true, completion: nil)
self.performSegueWithIdentifier("OverToGame", sender: self)
}
func browserViewControllerWasCancelled(browserViewController: MCBrowserViewController!) {
appDelegate.mpcHandler.browser.dismissViewControllerAnimated(true, completion: nil)
}我的GameViewController (菜单选择到并应该呈现GameScene )如下所示。这包含它挂起的行。
import UIKit
import SpriteKit
import MultipeerConnectivity
extension SKNode {
class func unarchiveFromFile(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! GameScene
archiver.finishDecoding()
return scene
} else {
return nil
}
}
}
class GameViewController: UIViewController {
var appDelegate:AppDelegate!
override func viewDidLoad() {
super.viewDidLoad()
appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.mpcHandler.setupPeerWithDisplayName(UIDevice.currentDevice().name)
appDelegate.mpcHandler.setupSession()
appDelegate.mpcHandler.selfAdvertise(true)
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
let skView = self.view as! SKView
if skView.scene == nil {
skView.showsFPS = true
skView.showsNodeCount = true
let gameScene = GameScene(size: skView.bounds.size)
gameScene.scaleMode = SKSceneScaleMode.AspectFill
skView.presentScene(gameScene)
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
}
override func prefersStatusBarHidden() -> Bool {
return true
}
}我是不是以正确的方式呈现了这个场景?
发布于 2015-05-17 19:16:20
您的类GameViewController是UIViewController类。UIViewController的view属性属于UIView类,而不是SKView类。
因此,当您编写let skView = self.view as! SKView时,您会说,嘿,我确信我的self.view应该是SKView类型的,这是由as!指示的。但事实并非如此,所以幸运的是,编译器会在您运行应用程序并使其崩溃之前停止您的操作。
SKView是SKScene的view属性的类。
要使用雪碧工具包编写游戏,您必须了解UIViewController和SKScene之间的区别,祝您好运!
https://stackoverflow.com/questions/30288473
复制相似问题