【GDevelop 基礎 11】衝突したらゲームを停止する (Time scale)

今回作成するもの

Time scale Layer time scale

【GDevelop 基礎 10】ずっと水平に移動して衝突したら反転する (衝突検知時の処理) - Make Everything Games 前回「衝突時に何かをする」方法を試しました。

今回は、ありがちなゲームオーバー的な表現としてゲームを停止することを試します。

レイヤー

今回はレイヤーを利用します。冒頭の Gif でいうと、キャラクター以外の「太陽」「雲」の2つが、キャラクターとは異なるレイヤーに属しています。
今回は以下のように Background というレイヤーを作成しています。

レイヤーの作成については、Add a layer という分かりやすいボタンがあるのでそこをクリックするだけです。

シーンの作成

今回はざっくり以下のようになっています。

  • Enemies Scene Groups には、Enemy, Enemy2 が入っています
  • Cloud, SunBackground レイヤーに属しています
    • レイヤーは以下の画像のようにプロパティパネルから変更できます

各オブジェクトの設定

Player

OnKeyPress_Move_Fixed を使って、自由に移動できるようにしておきます。(動かさなくてもいいので、なくてもいいです)

【GDevelop 基礎 06】キーを押すと移動する ~斜め移動の速度の修正~ - Make Everything Games で作成しています。

Enemy, Enemy2

Forever_Chase を使って Player を追いかけ衝突するようにさせます。

【GDevelop 基礎 08】ずっと追いかける (他のオブジェクトとの関連を作る) - Make Everything Games で作成しています。

Cloud / Sun

とりあえず動き続けてくれれば何でもいいです。今回は以下の記事で作成したスクリプトを作成しています。

【GDevelop 基礎 04】 一定間隔で反転する - Make Everything Games

Cloud に関しては X, Y 座標を変更する移動方法を用い、SunAdd a force を使う移動方法を利用しています。(記事の Appendix に記載しています)

座標を直接変更する移動と、Add a force を使うケースで変化が出たのであえて二種類用意しています。

イベントシートの設定

Player is in collision with Enemies が 2 行ありますが、これらはいずれかを Disable して実行してください。

冒頭の Gif 画像もこれらをそれぞれ Disable して実行しています。

  • Set the time scale of the scene to 0 のみを有効にしたのが Gif 画像の左側 (Time scale) です。
  • Set the time scale of layer Base layer to 0 のみを有効にしたが Gif 画像の右側 (Layer time scale) です。

Repeat

イベントシートの先頭で Repeat for each instance of Enemies となっていますが、これは For each objects を利用しています。
以下のコンテクストメニューから追加できます。

今回は Enemies グループに入っているインスタンス(つまり、 Enemy, Enemy2 ) を順に取り出し Action 側の Chase Target Enemies and Player に渡しています。各インスタンスの名前も Action 側でそのまま Enemies と扱うのは、コードに慣れていると「あれ?」となりますが、余計な変数が増えなくていいので慣れれば良さそうに思います。

動作確認

結果としては冒頭の Gif 画像の通りです。Layer time scale に関しては想定通り、Base Layer は停止し、Background は動き続けているのですが、Time scale の方は止まり方に違和感があります。

Time scale と Layer time scale

私はてっきり、Time scale はゲーム(ループ) 全体を停止させ、Layer time scale は特定のレイヤーのみを停止させると思っていました。

ただ、冒頭の Gif 画像を見てもらって分かる通りですが、Time scale を利用しても Cloud の全体の動きと、Sun の縦方向の反転の動きは停止していません。

一方で、SunAdd a force での左右への移動は停止しています。

  • Physics Engine - GDevelop documentation
    • Timescale. It defines the scale of time the simulation will use. With a timescale of 0.5, the simulation will run at half the speed; with a timescale of 2, the simulation will be twice as fast. If timescale is 0, the simulation will pause. Super useful for bullet time effects!

  • レイヤーとカメラ - GDevelop documentation
    • レイヤーの「タイムスケール」を使用すると、レイヤー内のすべてのアニメーションとすべてのオブジェクトの動きの速度を変更できます。レイヤーの時間を遅くするには、1 未満のタイムスケールを設定します。レイヤーの時間を速くするには、1 より大きいタイムスケールを設定します。デフォルトのタイムスケールは、すべてのレイヤーで 1 です。

あまり調査できていないのですが、上記のドキュメントを読む限りでは、Physics では simulation (の speed) を、Layer の方でもオブジェクトの速度を変更するとなっているので、今回の Cloud のように座標を直接変更しているだけだったり、スプライトを反転させるだけというのは停止させられないのだと想像しています。

ではどうするか?

ここは単純な話でゲームが動いているかのフラグを用意し、停止が必要なイベントはそのサブイベントにまとめるということになりそうです。

Unity にも Time.timeScale がありますが、こちらも誤解しているのではないかと思い始めたのでまた確認してみようと思います。