読者です 読者をやめる 読者になる 読者になる

Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 884 - GameScene.sksを使うとグリッドがズレる(泣)

何もない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()
}

これでランすると...

f:id:yataiblue:20161219183239j:plain

グリッドが右上に位置してしまいます!?!

なぜ? コードを見ていてもわかりません。GameScene.sksファイルを読み込んでGameSceneクラスの初期化をさせるところで何か問題があるのは分かるのですが、どうやればいいのか分からない状態です。

いつまで悩んでいても仕方ないからGameScene.sksを使わないでコードでGameSceneクラスの初期化することにします*2

それは明日。

*1:イニシャライザーを避けるための初期化メソッドの有用性が理解できなければ、次のエントリーを読みましょう -> Swiftで遊ぼう! - 248 - UIViewの初期化ステップ - Swiftで遊ぼう! on Hatena

*2:ちょっと進歩したでしょ。