【Swift】UniversalなSpriteKit開発 SKSceneが微妙なScaleをしてしまう問題の対処
- 【Swift】Universal SpriteKit開発
- SKSceneがScaleしてしまう問題の対処
- 背景がぴったり合わない
マシン | iMac 2010 Mid Core i5 760@2.80GHz Mem=12GB(Win6GB,Mac6GB) |
---|---|
Mac | Mac OS X 10.9 Mavericks |
Windows | Windows7 Ultimate 64bit |
VMWare | VMWare Fusion 6 |
HDD | 1TB(Win545GB,Mac299GB) SSDが欲しいです! |
Xcode | version 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してしまう問題ってなんぞや?
- とりあえず画面キャプチャ!
- GameSceneクラスの画像読み込み処理はこんな感じ↓ プログラムはこんな感じ(・ω・)ノ ちなみにswift。
言葉で説明するのむずいので。。。(´・ω・`)こんな現象です。
640x800pxの画像を表示しているのに、なぜか小 さ く 表 示
される
・iPhone5Sは640x1136px。
背景の横幅がぴったり合わないのはおかしい。・画像は@2x指定。
でも倍率の指定の問題なら1倍か2倍になるはず。
0.75倍くらいになる点が謎。
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 } // …あとは省略
- 対策(`・ω・´)ゞ
- とりあえず困ったときのBing先生。
- 原因は・・・(´・ω・`)
- 対策! サイズを画面サイズに合わせるしかないので、GameViewController側を修正する。
- 対策後
毎度毎度なstackoverflowが見つかりました。 ※参考リンク参照
・UniversalアプリのSKSceneでは、デフォルトサイズが1024x768になっている。 横長なのでアスペクト比を合わせてスケールするなどの対応が必要で、スケールモードの指定はSKScene.scaleModeでやっている。 ただ、サイズがこのままだと絶対に拡大縮小が行われるので、せっかくデザインしてもらった画像を綺麗に表示することができない。
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) } // …あとは省略
こんな感じにぴったり!
横幅ピッタリ!
参考リンク
- Background image size Sprite Kit Game ※特にSKSceneのサイズを指定しているトコが重要