将场景框架设置为iPhone屏幕的大小

时间:2015-02-10 00:19:54

标签: iphone swift ios8 sprite-kit

您好我是精灵套件的新手,出于某种原因,当使用self.frame.size.width或.height来定位场景中的按钮或子视图时,它们不会居中,而是有时会完全显示在屏幕外。有谁知道如何将帧大小设置为使用iphone / ipad的大小?

这是播放器失败时提出子视图时的代码

func presentGameOverView() {

    if firstTime == true {
        let gameOverView = UIView()
        gameOverView.frame = CGRectMake(self.frame.size.width / 2.0, self.frame.size.height / 2.0, 200, 200) //should be center of screen
        gameOverView.backgroundColor = UIColor.redColor()
        playGameOverSound()
        self.view?.addSubview(gameOverView)
        firstTime = false
    }
}

这是gameViewController.swift

的一部分
extension SKNode {
class func unarchiveFromFile(file : NSString) -> SKNode? {
    if let path = NSBundle.mainBundle().pathForResource(file, 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
    }
}

}

类GameViewController:UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()


    if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
        // Configure the view.
        let skView = self.view as SKView
        skView.showsFPS = true
        skView.showsNodeCount = true

        /* 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


        //display banner Ads
        //self.canDisplayBannerAds = true

        skView.presentScene(scene)
    }
}

1 个答案:

答案 0 :(得分:2)

如果widthheightUIView的尺寸,则视图位于中心位置

 origin = (self.frame.size.width/2 - width/2, self.frame.size.height/2 - height/2)

所以gameOverView框架应该是

let width : CGFloat = 200.0
let height : CGFloat = 200.0
gameOverView.frame = CGRectMake(self.frame.size.width/2 - width/2
    , self.frame.size.height/2 - height/2, width, height)

要在GameViewController viewDidLoad

中不使用sks文件
override func viewDidLoad() {
    super.viewDidLoad()

    let scene = GameScene(size:CGSizeMake(self.view.frame.width, self.view.frame.height))

    let skView = self.view as SKView
    skView.showsFPS = true
    skView.showsNodeCount = true

    skView.ignoresSiblingOrder = true

    scene.scaleMode = .AspectFill


    skView.presentScene(scene)
}

您也可以只提取基础SKView的框架而不是frame的{​​{1}},并执行此操作

scene