【Swift】UniversalなSpriteKit開発 SKSceneが微妙なScaleをしてしまう問題の対処

【Swift】Universal SpriteKit開発
SKSceneがScaleしてしまう問題の対処
背景がぴったり合わない
環境
マシンiMac 2010 Mid Core i5 760@2.80GHz Mem=12GB(Win6GB,Mac6GB)
MacMac OS X 10.9 Mavericks
WindowsWindows7 Ultimate 64bit
VMWareVMWare Fusion 6
HDD1TB(Win545GB,Mac299GB) SSDが欲しいです!
Xcodeversion 6.0β
iOSテスト機iPhone5(iOS6)、iPod touch 5th(iOS7)、iPad mini retina(iOS7)
ガンダム初代,Z,ZZ,0083,08小隊,逆襲,F91,V,W,X,∀,SEED,DESTINY,00



SKSceneがScaleしてしまう問題ってなんぞや?
  1. とりあえず画面キャプチャ!
  2. 言葉で説明するのむずいので。。。(´・ω・`)こんな現象です。



    640x800pxの画像を表示しているのに、なぜか

    小 さ く 表 示

    される

    iPhone5Sは640x1136px。
     背景の横幅がぴったり合わないのはおかしい。

    ・画像は@2x指定。
     でも倍率の指定の問題なら1倍か2倍になるはず。
     0.75倍くらいになる点が謎。

  3. GameSceneクラスの画像読み込み処理はこんな感じ↓
  4. プログラムはこんな感じ(・ω・)ノ ちなみにswift。

    class GameScene: SKScene {
        override func didMoveToView(view: SKView) {
    
            // 背景画像。SKSPriteNodeで画像を読み込む。
            let sprBG = SKSpriteNode(imageNamed:"bg001")
            sprBG.position = CGPointMake(self.frame.size.width*0.5, self.frame.size.height*0.5)
            self.addChild(sprBG)
    
            // 良くわからないのでログに出してみる
            NSLog("sprBG.size = (%.1f,%.1f)",sprBG.size.width,sprBG.size.height)  // 640,800
            NSLog("self.frame.size = (%.1f,%.1f)",self.frame.size.width,self.frame.size.height)  // 1024,768
        }
    
    // …あとは省略
    


対策(`・ω・´)ゞ
  1. とりあえず困ったときのBing先生。
  2. 毎度毎度なstackoverflowが見つかりました。
    ※参考リンク参照
    
  3. 原因は・・・(´・ω・`)
  4. ・UniversalアプリのSKSceneでは、デフォルトサイズが1024x768になっている。
     横長なのでアスペクト比を合わせてスケールするなどの対応が必要で、スケールモードの指定はSKScene.scaleModeでやっている。
     ただ、サイズがこのままだと絶対に拡大縮小が行われるので、せっかくデザインしてもらった画像を綺麗に表示することができない。
    
    
  5. 対策!
  6. サイズを画面サイズに合わせるしかないので、GameViewController側を修正する。

    class 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
                
                // SKSceneをウインドウサイズにスケーリングする時のモードを指定する
                // ※SKSceneはデフォルトで1024 x 768のため、どれを指定しても拡大縮小してしまう。
                scene.scaleMode = .AspectFill
                //  scene.scaleMode = .AspectFit
                //  scene.scaleMode = .ResizeFill
                //  scene.scaleMode = .Fill
                
                // SKSceneサイズをViewサイズに合わせる
                // これによって表示時のスケーリングを無くすことができる。
                scene.size = skView.frame.size;
    
                skView.presentScene(scene)
            }
    
    // …あとは省略
    

  7. 対策後

  8. こんな感じにぴったり!



    横幅ピッタリ!




参考リンク