Swiftで遊ぼう! - 756 - Sprite Kit ノードの「zPosition」
ちょっと複雑なSpriteKitを使ったゲームチュートリアルの勉強してます。
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)になります。
// 以下の説明は翌日を参照 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 } }