Swiftで遊ぼう! - 884 - GameScene.sksを使うとグリッドがズレる(泣)
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
何もないsceneだけ表示した状態です。この上にSKNodeインスタンスを1つ用意して、その中に画面サイズに合わせてグリッドを「addChild()」していくんです。
GameScene.swiftファイルに4つのプロパティを用意します。
var width: CGFloat! var height: CGFloat = 9 var boxSize: CGFloat! var gridStart: CGPoint!
画面のサイズに合わせて横のグリッド数を変更するためwidthはオプショナル型にします。縦は「9」と指定しときます。
次に初期化メソッドを用意します。update()メソッドの下に次のコードを加えます。
func createGrid() { let grid = SKNode() let usableWidth = size.width * 0.9 let usableHeight = size.height * 0.8 boxSize = usableHeight / height width = CGFloat(Int(usableWidth / boxSize)) let offsetX = (size.width - boxSize * width) / 2 let offsetY = (size.height - boxSize * height) / 2 // ループを使って全てのグリッドを登録します for column in 0 ..< Int(width) { for row in 0 ..< Int(height) { let path = UIBezierPath(rect: CGRect(x: boxSize * CGFloat(column), y: boxSize * CGFloat(row), width: boxSize, height: boxSize)) let box = SKShapeNode(path: path.cgPath) box.strokeColor = UIColor.gray box.alpha = 0.3 grid.addChild(box) } } gridStart = CGPoint(x: offsetX, y: offsetY) grid.position = CGPoint(x: offsetX, y: offsetY) addChild(grid) // できあがったグリッドをsceneに加えます }
この初期化メソッドを、didMove()メソッドで呼びます*1。
override func didMove(to view: SKView) { createGrid() }
これでランすると...
グリッドが右上に位置してしまいます!?!
なぜ? コードを見ていてもわかりません。GameScene.sksファイルを読み込んでGameSceneクラスの初期化をさせるところで何か問題があるのは分かるのですが、どうやればいいのか分からない状態です。
いつまで悩んでいても仕方ないからGameScene.sksを使わないでコードでGameSceneクラスの初期化することにします*2。
それは明日。
*1:イニシャライザーを避けるための初期化メソッドの有用性が理解できなければ、次のエントリーを読みましょう -> Swiftで遊ぼう! - 248 - UIViewの初期化ステップ - Swiftで遊ぼう! on Hatena
*2:ちょっと進歩したでしょ。