SKSpriteNode 同士が衝突した時の書き方 コンタクトォ!
ノード(キャラクター、プレイヤー)同士がぶつかった時に破裂したり、ゲームオーバー画面に遷移したりさせたい時に使用できます。
前回の記事に書いたように衝突判定のデリゲートを継承してカテゴリ設定をして、衝突するものをした後、衝突が起きたときに呼び出されるメソッド内に書くコード例
前回の記事:ゲームのキャラクターを作成!「SKSpriteNode」 - "まだ"の力 [swift]基礎辞書
SKPhysicsContactDelegate
衝突判定を受け取るためのデリゲート
例
class GameScene: SKScene,SKPhysicsContactDelegate ←←←←
categoryBitMask
プレイヤーのカテゴリー設定。これにより衝突したときに実行するコードを書けます。
例
let category_player:UInt32 = 1 << 1 //0001 let category_tower:UInt32 = 1 << 2 //0010 let category_enemy:UInt32 = 1 << 3 //0100 let category_item:UInt32 = 1 << 4 //1000 4つのカテゴリを用意 //プレイヤーをプレイヤーカテゴリに設定 playerSprite.physicsBody?.categoryBitMask = category_player
contactTestBitMask
プレイヤーが衝突するもの
例
playerSprite.physicsBody?.contactTestBitMask = category_enemy | category_item //プレイヤーは敵とアイテムに衝突
didBeginContact
衝突が起きたときに呼び出される関数(SKPhysicsContactDelegateの実装が必要)
func didBeginContact(contact: SKPhysicsContact) {}
ここからが衝突が起きたときに呼び出されるメソッド内に書くコード例
printはどういう時にどこが実行されるのか可視化するためのコード。
func didBeginContact(contact: SKPhysicsContact) { print("衝突") if contact.bodyA.categoryBitMask == category_player { print("塔がプレイヤーと衝突A") switch contact.bodyB.categoryBitMask { case category_tower : print("塔とプレイヤーが衝突!1") break case category_enemy: print(" 敵とプレイヤーが衝突!1") break case category_item: print("アイテムとプレイヤーが衝突!1") break default: print("その他1") break } } if contact.bodyB.categoryBitMask == category_player { print("塔がプレイヤーと衝突B") switch contact.bodyA.categoryBitMask { case category_tower : print("塔とプレイヤーが衝突!2") break case category_enemy: //リザルト遷移 print("敵とプレイヤーが衝突!2") break case category_item: print("アイテムとプレイヤーが衝突!2") break default: print("その他2") break } } }