首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用程序挂在“让SKView as!SKView”(Swift)

应用程序挂在“让SKView as!SKView”(Swift)
EN

Stack Overflow用户
提问于 2015-05-17 15:22:01
回答 1查看 1.2K关注 0票数 0

我正在尝试创建一个基于SpriteKit的游戏,并试图在我继续之前建立基本的蓝牙连接,但是我的游戏在从菜单上切换到GameScene时崩溃了,并且我得到了一个“无法将'UIView‘类型的值转换为'SKView'”的错误。我的游戏菜单如下:

代码语言:javascript
复制
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 )如下所示。这包含它挂起的行。

代码语言:javascript
复制
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
  }
}

我是不是以正确的方式呈现了这个场景?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-17 19:16:20

您的类GameViewControllerUIViewController类。UIViewControllerview属性属于UIView类,而不是SKView类。

因此,当您编写let skView = self.view as! SKView时,您会说,嘿,我确信我的self.view应该是SKView类型的,这是由as!指示的。但事实并非如此,所以幸运的是,编译器会在您运行应用程序并使其崩溃之前停止您的操作。

SKViewSKSceneview属性的类。

要使用雪碧工具包编写游戏,您必须了解UIViewControllerSKScene之间的区别,祝您好运!

SKScene类引用

UIViewController类引用

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30288473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档