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

Swiftで遊ぼう! on Hatena

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

Swiftで遊ぼう! - 774 - 物理世界をいろいろ纏わせる

ビーカーを爆発させても、その爆発は他のオブジェクトに影響を与えません。

爆破にPhysicsBodyが実装されていないからです。explosionTexturesは、ただのイメージの集まりなんで、SpriteKitの物理世界に絡みようがありません。このイメージの集合体をまずノードオブジェクトにする必要があるので次のコードをnewProjectile()メソッド内に加えます。

let explosionRadius = 
       SKSpriteNode(color: UIColor.clear, 
                     size: CGSize(width: 200, height: 200))
explosionRadius.name = "explosionRadius"

200ポイントの幅と高さで透明なSKSpriteNodeオブジェクトを作ります。そしてこのノードにPhysicsBodyを実装するので設定をします。

let explosionRadiusBody = SKPhysicsBody(circleOfRadius: 200)
explosionRadiusBody.mass = 0.01
explosionRadiusBody.pinned = true
explosionRadiusBody.categoryBitMask = PhysicsType.ExplosionRadius
explosionRadiusBody.collisionBitMask = PhysicsType.None
explosionRadiusBody.contactTestBitMask = PhysicsType.Cat

直径200ポイントの円の空間を作ります。「mass」は重量(kg)なんで、10gになります。「pinned」はPhysicsBodyの実装されるノードが親ノードにくっつけています。そしてビットマスクの設定ですね。これはオブジェクトの衝突判定を理解するために知らなければならない重要概念です

そしてこの物理世界を爆発ノードに実装します。

explosionRadius.physicsBody = explosionRadiusBody
beaker.addChild(explosionRadius)

とまあ、これで爆発と猫の接触判定ができます。

今日はこれだけ。