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の処理になるようにしちゃってほしいなぁ、と思いますが、既存のゲームに影響するからか、こうしているのかもしれません。
コメント
コメントを投稿