はじめに
ゲーム制作でPixiJSを使っていると、更新処理を ticker.add に登録して実行することがよくあります。
ただ、この処理が完了するのを待ちたい場面もありますよね。
2025-02-11
ゲーム制作でPixiJSを使っていると、更新処理を ticker.add に登録して実行することがよくあります。
ただ、この処理が完了するのを待ちたい場面もありますよね。
PixiJSではゲームのフレーム更新のために Ticker を使用しています。
しかし、Tickerを使って非同期処理を実装すると、2つの問題が発生します!Ticker の処理は同期的に実行されます。
つまり、毎フレーム処理が進むため、非同期処理が完了したタイミングを正確に把握することが難しくなります。非同期処理の結果を待つためにコールバックを実装すれば良いと思うかもしれません。
しかし、非同期処理の数だけコールバックの数も増えてしまい、処理がどんどん複雑になってしまいます。
コードの処理も読みにくくなってしまい、可読性が下がってしまいます。
これらの問題を解決するために async/await を使って非同期処理を同期的に扱うラッパークラスを作りました!TickerWrapperクラスを作成しました。
TickerWrapperクラスの目的は、PixiJSで非同期のフレーム更新処理を簡単に扱えるようにすることです。
このクラスを使うことで、非同期処理を同期的に書くことができ、処理の流れも分かりやすくなります。コンストラクタは、PixiJS の Ticker を受け取り、それを this.ticker に保存します。
このクラスでは、 this.ticker.add を使ってフレームごとの処理を管理していきます。ここが一番大事なところです!
このメソッドは、asyncを使った非同期関数で、非同期処理を同期的に待つために使用します。
引数として受け取るのは、フレームごとに実行したい非同期処理の関数です。
this.ticker.add() を使うことで、毎フレーム処理が実行されますが、その処理の終了を await で待ちます。
処理が終わったら resolve() を呼び出し、 Promise を解決します。
この Promise は非同期処理が終了するまで待機するため、呼び出し元で処理が終了したタイミングを確認できます。これは、実際に作成中のゲームで使用しているゲームオーバー処理の一部です。
プレイヤーが障害物と衝突した際、カメラを振動させた後にゲームオーバーシーンに遷移する流れです。
この流れを、非同期処理を使ってカメラの振動が終了するまで待機し、振動後にシーンを切り替えるようにしています。また、TickerWrapper は関数をバインドしたいときにも役立ちます。
例えば、cameraShake.update.bind(cameraShake) を使って、update メソッドの this を正しくバインドしています。
非同期処理だけでなく、thisのバインドにも対応している点が便利です。非同期処理の async/await を PixiJS で使うためのラッパークラス作成を行ないました。
実はまだまだ改善の余地はあるのですが、基本的な機能はできていると思います。
ラッパークラスという物を初めて作ったので間違えている点があるかとは思いますが、参考になったら嬉しいです。