remove_childだけだと、子ノードが消えていない

今、ゲーム中に、 2人のキャラクターを切り替えれるようなゲームを作っています。

それで、親にMPCという切替用のシーンを用意、add_child()で、一人目のシーンplayerを出す。切り替えボタンを押すと、2人目のシーンplayer2を出す。さらに切り替えボタンを押すと、1里目のplayerを出す、後同様にいくらでも切り替え可能・・・といった仕組みを作っていました。

切り替えの際、切り替え前のplayerのシーンは消さないと、2重にplayerが出てしまいます。

それで、remove_child()、を使って、以前のplayerを消していました。

1見するとできているのですが、ゲームオーバー時の処理(ここではstop_all、ゲームオーバーのトリガーが飛んで、player、player2各々のシーンで行われる )が一部おかしい。調べてみると、ゲームオーバー時、1度だけ行われる処理が、何度も行われていました。プレイ中のキャラ切替回数が多いほど、ゲームオーバーの処理が増えていました。


↓処理の箇所にprintを入れてコンソールに出したもの。

2回プレイ中にキャラを切り替えると、ゲームオーバー時、1回のはずの停止処理(stop_all)が、2回増えてしまっていた・・・



結局、消したと思っていたplayerシーンが残っていて、切り替えるとその分playerシーンが何人も増えてしまい、その全てのシーンの中で、ゲームオーバーの処理が行われてたのでした。


調べてみると、add_childで追加したシーンを消すには、remove_childだけでなく、queue_freeも必要なようです・・・


↓2行目が追加した、queue_freeの行


↓queue_freeを追加すると、1回の処理のみになりました。



以下のサイトを見つけて、わかりました。

https://scrapbox.io/kidaaam-92022284/Godot:_%E5%AD%90%E8%A6%81%E7%B4%A0%E3%82%92%E6%B6%88%E3%81%99%E6%99%82%E3%81%AF%E3%80%81remove_child()_%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89_queue_free()


remove_child、なのだから、子のノード(child)を削除(remove)しているはずで、queue_freeはいらないように思ったのですが・・・

2種類の異なる意味の”消える”、があるようで、注意が必要です。

また、上記のようにcall_deferred、を行わないと警告が出て、安全のために使っていますが、正直面倒で。。

強引ですが、危険な使い方ならそれを残さず、

通常の書き方でも、call_deferredの処理になるようにしちゃってほしいなぁ、と思いますが、既存のゲームに影響するからか、こうしているのかもしれません。

コメント

このブログの人気の投稿

プラグイン(godot sqlite)を含めてエクスポートすると、データの更新ができない問題

初心者に良い本は? → 『 ゆるっとはじめるGodot Engine ゲームプログラミング 』

他シーンからシグナルを送る方法