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

"まだ"の力 [基礎辞書]

学んだことを書いていきます。質問やエラーなどございましたらお気軽にコメントお願いします。

SKSpriteNode 同士が衝突した時の書き方 コンタクトォ!

SKSpriteNode SKPhysics SKPhysicsContactDelegate

ノード(キャラクター、プレイヤー)同士がぶつかった時に破裂したり、ゲームオーバー画面に遷移したりさせたい時に使用できます。

前回の記事に書いたように衝突判定のデリゲートを継承してカテゴリ設定をして、衝突するものをした後、衝突が起きたときに呼び出されるメソッド内に書くコード例
前回の記事:ゲームのキャラクターを作成!「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
                
            }
        }
    }