2020/11/02(月) [n年前の日記]
#1 [godot] Godot Engineで林檎や爆弾の動きを止める処理を追加
Godot Enigne 3.2.3 x64 の勉強を兼ねて、Apple Catcher っぽいゲームを作成中。環境は Windows10 x64 2004。
プレイヤーに爆弾が当たった時に林檎や爆弾の動きを止めたい。Godot Engineにはポーズをかけてゲーム進行を一時停止する機能があるので、今回はお試し(?)でその機能を利用してみる。
プレイヤーに爆弾が当たった時に林檎や爆弾の動きを止めたい。Godot Engineにはポーズをかけてゲーム進行を一時停止する機能があるので、今回はお試し(?)でその機能を利用してみる。
◎ 各ノードのPause Modeを設定。 :
Godot Engine の各ノードは、ポーズ(Pause)が有効になった時にどう反応するかを決めるModeプロパティを持っている。指定できる種類は以下。
_ゲームの一時停止 - Godot Engine (stable)の日本語のドキュメント
例えば、ポーズ有効になった際、ポーズ解除処理を担当するノードまで止まってしまったらゲームを再開できないので、そんな時はポーズ解除処理担当ノードに「Process」を指定しておいて、ポーズ状態でもそのノードだけは処理を続行させたりする。
各ノードのModeを設定していく。Main.tscn を開いて、Mainノードを選択。Pause → Mode を「Process」に変更。Ctrl + Sキーを押して保存。
Player.tscn を開いて、Playerノードを選択。Pause → Mode を「Process」に変更。Ctrl + Sキーを押して保存。
Apple.tscn を開いて、Appleノードを選択。Pause → Mode を「Stop」に変更。Ctrl + Sキーを押して保存。
他のシーンも同様に設定していく。
- Inherit : 上位ノードの設定を継承する。
- Stop : ポーズ有効時に自身の処理を止める。
- Process : ポーズ有効時も自身の処理を続行する。
_ゲームの一時停止 - Godot Engine (stable)の日本語のドキュメント
例えば、ポーズ有効になった際、ポーズ解除処理を担当するノードまで止まってしまったらゲームを再開できないので、そんな時はポーズ解除処理担当ノードに「Process」を指定しておいて、ポーズ状態でもそのノードだけは処理を続行させたりする。
各ノードのModeを設定していく。Main.tscn を開いて、Mainノードを選択。Pause → Mode を「Process」に変更。Ctrl + Sキーを押して保存。
Player.tscn を開いて、Playerノードを選択。Pause → Mode を「Process」に変更。Ctrl + Sキーを押して保存。
Apple.tscn を開いて、Appleノードを選択。Pause → Mode を「Stop」に変更。Ctrl + Sキーを押して保存。
他のシーンも同様に設定していく。
- Mainノード : Mode = Process
- Playerノード : Mode = Process
- Appleノード : Mode = Stop
- Bombノード : Mode = Stop
- ItemGeneratorノード : Mode = Stop
- GetItemEffectノード : Mode = Stop
◎ スクリプトでポーズを有効化する。 :
メインシーンのスクリプト Main.gd 内に、ポーズ有効化/解除の処理を追加する。
F6キーを押して動作確認してみる。
プレイヤーに爆弾が当たったタイミングで、林檎や爆弾の動きが止まってくれた。
しかし、プレイヤーの死亡アニメが終了して、プレイヤーのアタリ判定処理が有効になった途端に、そこに居続ける爆弾にまた当たってその場でたちまちゲームオーバーが繰り返されてしまう。このバグを修正しないと…。
- ゲームオーバーになったタイミングでポーズ有効化。get_tree().paused = true を記述。
- ゲームタイトルを表示し直すタイミングでポーズ解除。get_tree().paused = false を記述。
F6キーを押して動作確認してみる。
プレイヤーに爆弾が当たったタイミングで、林檎や爆弾の動きが止まってくれた。
しかし、プレイヤーの死亡アニメが終了して、プレイヤーのアタリ判定処理が有効になった途端に、そこに居続ける爆弾にまた当たってその場でたちまちゲームオーバーが繰り返されてしまう。このバグを修正しないと…。
◎ グループ名をつける。 :
プレイヤーの死亡アニメが終わるタイミングで、画面上に出ている林檎や爆弾を全消去してやる必要がある。その処理をグループ機能を使って行ってみる。
各ノードにはグループ名をつけることができる。グループ名を使えば、「このグループにこういう処理をせよ」と、複数のオブジェクトに対して一気にまとめて処理を指定することができる。
グループ名をつけていく。Apple.tscn を開いて、Appleノードを選択。ノードタブをクリック → グループをクリック → 「apples」と入力して「追加」。Appleノードに「apples」というグループ名をつけることができた。Ctrl + Sキーを押してシーンを上書き保存。
Bomb.tscn を開いて、Bombノードを選択。ノードタブをクリック → グループをクリック → 「bombs」と入力して「追加」。Ctrl + Sキーを押してシーンを上書き保存。
GetItemEffect.tscn を開いて、GetItemEffectノードを選択。ノードタブをクリック → グループをクリック → 「effects」と入力して「追加」。Ctrl + Sキーを押してシーンを上書き保存。
各ノードにはグループ名をつけることができる。グループ名を使えば、「このグループにこういう処理をせよ」と、複数のオブジェクトに対して一気にまとめて処理を指定することができる。
グループ名をつけていく。Apple.tscn を開いて、Appleノードを選択。ノードタブをクリック → グループをクリック → 「apples」と入力して「追加」。Appleノードに「apples」というグループ名をつけることができた。Ctrl + Sキーを押してシーンを上書き保存。
Bomb.tscn を開いて、Bombノードを選択。ノードタブをクリック → グループをクリック → 「bombs」と入力して「追加」。Ctrl + Sキーを押してシーンを上書き保存。
GetItemEffect.tscn を開いて、GetItemEffectノードを選択。ノードタブをクリック → グループをクリック → 「effects」と入力して「追加」。Ctrl + Sキーを押してシーンを上書き保存。
◎ スクリプトでグループに対して全消去。 :
メインシーンのスクリプト Main.gd に、グループに対して全消去する処理を追加。
ポーズを解除する直前に、林檎、爆弾、エフェクトを全消去するメソッドを追加。
全消去するメソッドを追加。
ここでは、apples(林檎)、bombs(爆弾)、effects(「+10」表示) に対して queue_free() を呼んでノード消去を指示している。
Main.gd の内容は以下。
_Main.gd
F6キーを押して動作確認。
プレイヤーの死亡アニメが終わるタイミングで林檎や爆弾が全消去できている。それらしく動いてくれた。
これで一通りゲームっぽい感じになったかなと…。次回はexeファイルやHTML5でエクスポートして、Godot Engine をインストールしてない環境でも動かせるようにしたい。
ポーズを解除する直前に、林檎、爆弾、エフェクトを全消去するメソッドを追加。
kill_all_items()
全消去するメソッドを追加。
func kill_all_items(): get_tree().call_group("apples", "queue_free") get_tree().call_group("bombs", "queue_free") get_tree().call_group("effects", "queue_free")get_tree().call_group("グループ名", "メソッド名") と書けば、そのグループ名を持ってるオブジェクト全てに対して指定したメソッドを実行することができる。
ここでは、apples(林檎)、bombs(爆弾)、effects(「+10」表示) に対して queue_free() を呼んでノード消去を指示している。
Main.gd の内容は以下。
_Main.gd
F6キーを押して動作確認。
プレイヤーの死亡アニメが終わるタイミングで林檎や爆弾が全消去できている。それらしく動いてくれた。
これで一通りゲームっぽい感じになったかなと…。次回はexeファイルやHTML5でエクスポートして、Godot Engine をインストールしてない環境でも動かせるようにしたい。
[ ツッコむ ]
以上です。