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

Swiftで遊ぼう! on Hatena

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

Swiftで遊ぼう! - 728 - ノードの衝突判定もなんとなくこなしてます

ノードに重力空間をまとわせるためにSKPhysicsBodyを設定して、状態を判定するためのカテゴリーも設定します。

まずモンスターのカテゴリーを考えます。

let monster = SKSpriteNode(imageNamed: "monster")

// ここからphysicsBodyの設定
monster.physicsBody = SKPhysicsBody(rectangleOf: monster.size) // 1
monster.physicsBody?.isDynamic = true // 2
monster.physicsBody?.categoryBitMask = PhysicsCategory.Monster
monster.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile
monster.physicsBody?.collisionBitMask = PhysicsCategory.None
  1. スプライトを作成した直後に「physicsBody」を着せます。monsterのイメージの大きさから四角形の衝突空間が形成されます。
  2. 「isDynamic」はデフォルトで「true」なんで書く必要はないのですが明示的に分かり易く記述します。
  3. さて「categoryBitMask」になっていますが、これがビットで立てたフラグですね。最初はモンスターとしてフラグを立てます。UInt32なので、「0b0000 0000 0000 0000 0000 0000 0000 0001」ということになりますね。カテゴリーは32種類というのは、それぞれ1個だけ「1」に変更しているということです。
  4. 「contactTestBitMask」は、2つの「カテゴリービットマスク」をANDオペレーションで評価して、「0」以外なら衝突が生じてSKPhysicsContactオブジェクトが作られるってことです。
  5. これと他のphysicsBodyのカテゴリービットマスクとANDオペレーションをして「0」以外だったら衝突がこのノードに影響を及ぼすのですが、ここで「0」を設定しているので、衝突は常に「0」で影響は出ません。

ビットマスクの使い方は慣れが必要ですね。私のようなド素人は最初かなり混乱しました(^^;)

今日はここまで。