【Swift】Spritekitでは繰り返し処理にTimer.scheduledTimerではなくSKActionを使おう

Swift Tips

はじめに


この記事ではswiftでシューティングゲームを作成する過程でつまづいたポイントや調べるのに苦労したコードなどをご紹介しています。
swiftでゲームを作る時に使うフレームワークspritekitの記事が中心になります。

今回はspritekitで繰り返し処理をしたい時にどうしたらいいか?
について書いていきます。ゲームを作り始めた当初、入門書に書いてあったTimer.scheduledTimerで繰り返し処理を真似をして作成していましたが徐々にこのTimerが不具合を生む原因になっていることに気が付きました。しかもこのTimerは一度停止させると再度、生成しないといけません。今回はTimer.scheduledTimerを使わずに一定時間での処理や繰り返し処理についてご紹介します。

こんなゲーム作りました


まずは私が作ったシューティングゲームをぜひプレイしてみてどんな感じに実装したか見てみて下さい。全6ステージの2D縦スクロールSTGです。
アプリ名:ネオリゲイナー


開発環境はxcodeが12.5、swiftが5.4です。

繰り返し処理にはSKActionを使う


Spritekitでは一定間隔で処理をしたい場合や指定時間に処理を実行したい場合にはTimer.scheduledTimerではなくSKAction.repeatForeverを使いました。SKActionは敵のスプライトの動作や敵弾の発射によく使用しますが、そのSKActionを現在シーンから実行させることで、繰り返し処理を実行させています。Timer.scheduledTimerでも繰り返し処理等できるのですが、ステージが変わる時など画面遷移をした際に不具合が発生することがありましたので、私はすべてSKActionで実行させています。

let timerWait = SKAction.wait(forDuration: 0.1)  //繰り返し間隔を0.1秒とする
let shotCheck = SKAction.run {
    self.jikiShot()  //自機のショット処理関数を実行
}
let shotSequence = SKAction.sequence([shotCheck,timerWait])  //繰り返えす処理を順にまとめる
let loopShotCheck = SKAction.repeatForever(shotSequence)  //ずっと繰り返すように指定
        
self.run(loopShotCheck) //現在シーンから実行する

ちなみに繰り返す回数が指定できるrepeat()処理は下記のとおりです。

let loopShotCheck = SKAction.repeat(shotSequence, count: 5) // 5回だけ繰り返す

また、ゲーム中のポーズ処理でよく使う「self.isPause = true」 ですが、この全部のノードが停止している状態でも使えるタイマーがあります。下記のコードを使用すると、すべてが停止していても一定時間でisPauseを解除できたりします。

// 10秒後に処理を実行
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
            
            self.isPaused = false //現在シーンのポーズを解除
  
        }


ぜひ試してみて下さい。

タイトルとURLをコピーしました