SpriteKitのrunActionを遅延させる

SKspriteNodeを遅延させるには

let wait = SKAction.waitForDuration(1)
someNode.runAction(wait)

とかすればすればいい。ループの中でSKActionを実行するとループ処理中のアクションはほぼ同時に実行されているように目視では見えるためループの回数だけ遅延時間を延長させる。

for var i = 0; i < 5; i++{
    let wait = SKAction.waitForDuration(1*i)
    someNode.runAction(wait)
}

あくまで見た目上の演出のための遅延というか。これを関数にしてメインスレッドで複数実行とかするとSKActionの遅延中にメインスレッドが先に進行する。

swift didbegincontactが呼ばれない

SpriteKitの衝突判定のデリゲートメソッドdidbegincontactが呼ばれなくてハマった。シーンにデリゲートの設定をして、衝突するオブジェクトそれぞれにcategoryBitMaskとcontactTestBitMaskを衝突判定させるように設定していて、なぜこれでデリゲートが呼ばれないのかと試行錯誤

失敗していたコードは下記のような感じ。

    var slowCarBody = SKSpriteNode(textture:sCar)
    slowCarBody.categoryBitMask = slowCarBitMask
    slowCarBody.contactTestBitMask = playerCarBitMask
    slowCar.physicsBody = slowCarBody
    gameNode.addChild(slowCar)

そして下記のような感じに修正するとデリゲートが呼ばれるようになった。

    var slowCarBody = SKSpriteNode(textture:sCar)
    slowCar.physicsBody = slowCarBody
    slowCarBody.categoryBitMask = slowCarBitMask
    slowCarBody.contactTestBitMask = playerCarBitMask
    gameNode.addChild(slowCar)

違いは、オブジェクトの判定サイズの設定と判定グループの設定の順番を入れ替えた点。physicsBodyをイニシャライズする前にカテゴリを設定しようとしているんだからそりゃ効かない。spriteノードを作ったから大丈夫だろうと無意識でいたので気づかなかった