2017年11月14日火曜日

didBegin が複数呼ばれてしまう場合の対応方法

概要

didBegin は SKPhysicsContactDelegate を継承することで使える関数です
SpriteKit で物理エンジンを使ったノードが衝突したときにコールされるイベント関数です
本来なら一度しか衝突していないのですが、ノードのスピードや重力の影響などで関数が複数回呼ばれることがあります
例えば衝突時に敵のカウントなどを増やすような処理をしている場合に 1 体しか倒していないのにカウントが 3 や 4 に増えてしまいます
そんな場合の対応方法を紹介します

環境

  • macOS X 10.13.1
  • Xcode 9.1 (9B55)

コード

こんな感じで対応します

func didBegin(_ contact: SKPhysicsContact) {
    var firstBody: SKPhysicsBody
    var secondBody: SKPhysicsBody
    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    } else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }
    if (firstBody.node?.parent != nil && secondBody.node?.parent != nil) {
        // 処理する
    }
}

ずばり答えは firstBody.node?.parent の null チェックをします
理由はさっぱりですが、複数衝突した場合に 1 度だけ null ではない場合があります
なのでこれで衝突回数を 1 回にすることができます

最後に

didBegin が複数回呼ばれてしまう場合の対応方法を紹介しました
自分が遭遇したのが iPhone5 (iOS 10.3) です
で、実はシミュレータの iOS11 では発生しませんでした
なのでもしかすると iOS10 系のバグかもしれません

とりあえず処理は入れておいても iOS11 で問題なく動作はするので影響はないと思います

参考サイト

0 件のコメント:

コメントを投稿