【问题标题】:Set the frame of scene to be size of the iPhone screen将场景的框架设置为 iPhone 屏幕的大小
【发布时间】:2015-02-10 00:19:53
【问题描述】:

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

这是我在玩家输掉时展示子视图时的代码

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

【问题讨论】:

    标签: iphone swift ios8 sprite-kit


    【解决方案1】:

    如果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)
    

    不使用sks文件,在GameViewControllerviewDidLoad

    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的框架而不是sceneframe,然后这样做

    if let viewFrame = self.view?.frame {
        let width : CGFloat = 200.0
        let height : CGFloat = 200.0
        gameOverView.frame = CGRectMake(viewFrame.size.width/2 - width/2
            , viewFrame.size.height/2 - height/2, width, height)
    }
    

    【讨论】:

    • 是的,但由于某种原因,它没有出现在游戏场景中。我不知道为什么,但是当我 println(self.frame.size.width) println(self.frame.size.height) 我得到 1024 和 768 之前,框架比屏幕尺寸大得多我从来没有发生过这种情况跨度>
    • 你使用的是 sks 文件吗?
    • 当我创建精灵场景时,GameScene.sks 在项目文件夹中......但我所有的代码都在 GameScene.swift 中
    • 但我认为当您在 viewDidLoad 中初始化 GameScene 时,sks 文件将被加载到 GameViewController 中。请检查确认
    • 我把gameviewcontroller的代码加到原问题里,大家可以看看对sks的引用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多