繁体   English   中英

App挂在“让SKView为! SKView”(快速)

[英]App Hanging on “let SKView as! SKView” (Swift)

我试图创建一个基于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)

}

菜单选择要显示的GameScene并显示以下我的GameViewController。 这包含它悬挂的行

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
  }
}

我什至以正确的方式呈现场景吗?

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

因此,当您编写时, let skView = self.view as! SKView let skView = self.view as! SKView你说,嘿,我知道肯定是我的self.view应该是的SKView类型,由所示as! 但是事实并非如此,因此幸运的是,编译器会在运行应用程序并将其崩溃之前将您停止。

SKViewSKViewview属性的SKScene

要使用Sprite Kit编写游戏,您必须了解UIViewControllerSKScene之间的区别祝您好运!

SKScene类参考

UIViewController类参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM