見出し画像

p5play.jsでゲームが動かなくなる?物理演算の罠とその対策

こんにちは。なおしむです。
p5.jsとp5play.jsを使えば、容易に物理演算を活用したアプリを作成することができます。私自身もこれを利用してよく遊んでいます。しかしながら、Spriteの動きが突如止まってしまう現象に遭遇したことがあります。
私が体験したのは、ボールを操作するゲームを作っていた際、正常に動いているはずのボールが突如止まってしまった事態でした。最初は一過性の問題かな、と軽く考えていましたが、ゲームを公開した後、他のユーザーからも同様の報告が上がり、この現象は再現する問題であることが明らかになりました。そこで調査を進めた結果、問題の原因を見つけ出すことができたので、今回はそれを共有します。

問題の原因はとても単純で、world.allowSleepingがtrueになっていたためでした。
この値がtrueの場合、動きが止まったspriteは物理演算の対象から自動的に外されます。そして、この値はデフォルトではtrueに設定されています。
物理演算から勝手に外されてしまったら困りますね。。

以下は公式サイトからの引用です。

スリープ
world.allowSleeping はデフォルトで true です。
スプライトは、動きを止めて新たに何も衝突しないときに "sleeping" 状態になります。 "Sleeping" スプライトは物理シミュレーション中に無視されるため、通常は Box2D 物理エンジンソルバが不必要な計算を行う必要がなくなります。これはパフォーマンスには良いですが、場合によっては問題を引き起こすこともあります。

スプライトを起こすには sprite.sleeping を false に設定します。また、 sprite.allowSleeping を false に設定することで、スプライトごとにスリープを無効にすることもできます。

https://p5play.org/lang/ja/learn/world.html

なので、対処法はカンタンで、値をfalseにするだけです。

world.allowSleeping = false

これは、今後もプログラムを書く際の定番のルーチンになりそうですね。

p5play.jsには物理演算を最適化するための機能が複数含まれています。なので、「なんか変だな?」と思ったら、このようなデフォルトで制御されている部分を疑ってみるとよいかもしれません。


この記事が気に入ったらサポートをしてみませんか?