Swiftで遊ぼう! on Hatena

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

Swiftで遊ぼう! - 756 - Sprite Kit ノードの「zPosition」

ちょっと複雑なSpriteKitを使ったゲームチュートリアルの勉強してます。

www.raywenderlich.com

GameSceneクラスの実装をしているところです。SKPhysicsJointFixed型のインスタンスを作りました。

そして初期設定のためのメソッドを用意します。モンスターがビーカーを投げるのですが、SKSpriteNodeオブジェクトのビーカーを用意するのですが、ここで個別のノードを融合させるテクニックを学びます。

func newProjectile () {

// まず前半部分は馴染みのあるコードです。
// プロジェクトに用意したpngイメージから
// SKSpriteNodeインスタンスを作ります。
    let beaker = SKSpriteNode(imageNamed: "beaker")

// インスタンスの属性を設定して行きます。
// まず「name」プロパティに名前を付けます。
    beaker.name = "beaker"

// そして今日の表題「zPosition」です。
    beaker.zPosition = 5

// これが本来画面上での位置(CGPoint型)を表します。
    beaker.position = CGPoint(x: 120, y: 625)

SKSpriteKitは2Dゲームのためのフレームワークなんで、平面だけ扱えばいいと思っていましたが当然のように奥行きのパラメータが用意されています。考えてみればオブジェクトの重なりを判断する必要があるからです。

そしてSKSpriteKitを使用する時に注意しなければならないことが1つあります。SKViewはUIViewの派生クラスですが、座標システムが異なります。画面下左隅が(0.0, 0.0)になります。
f:id:yataiblue:20160810211324j:plain

UIView座標システムの情報

// 以下の説明は翌日を参照
    let beakerBody = 
    SKPhysicsBody(rectangleOf: CGSize(width: 40, height: 40))
    beakerBody.mass = 1.0
    beakerBody.categoryBitMask = 
        PhysicsType.beaker
    beakerBody.collisionBitMask = 
        PhysicsType.wall | PhysicsType.cat
    beaker.physicsBody = beakerBody
    addChild(beaker)
        
    if let armBody = 
        childNode(
            withName: "player")?.childNode(
                withName: "arm")?.physicsBody {
        pinBeakerToZombieArm = 
            SKPhysicsJointFixed.joint(withBodyA: armBody, 
                                          bodyB: beakerBody, 
                                         anchor: CGPoint.zero)
        physicsWorld.add(pinBeakerToZombieArm!)
        beakerReady = true
    }
}