「 例えば エスケープ・キーを押したら ゲームがピタッと 一時停止するような、制御を練習しようぜ?」
「 ポーズ機能ぐらい 標準で実装されてないのか? 先に調べてみろだぜ」
「 調べていて でてきたんだが BGM って和製英語で 海外人に通じないみたいだな」
「 そんなん言ったって 和製英語を通じて 世の中を見てるし できあがった土台を疑うのは大変だぜ」
「 👇 ポーズ機能は フレームワークで用意されているようだぜ」
📖 GODOT DOCS / Pausing games and process mode
func _unhandled_key_input(event):
# 何かキーを押したとき
if event.is_pressed():
# エスケープ・キー
if event.keycode == KEY_ESCAPE:
if not get_tree().paused:
# 全体を止める
get_tree().paused = true
else:
# 全体を止めているのを解除
get_tree().paused = false
「 👆 ルートで 木を停止すると、ルートも止まるので 上記のコードでは 一時停止を解除できない」
「 素直な挙動だから、これで 狙って指定したノードだけ 一時停止できそうね」
「 なんか よく分からんなあ。 お父ん、いったん 思うように 再構成してみてくれだぜ」
「 👆 ゲーム制作の チーム作業を 模擬して、
第2階層のフォルダーには 誰がそのフォルダーを開ければいいのかが分かるように
役職名を書いていこう」
「 ある種の ダイナミック・プログラミング(Dynamic Programming;動的計画法)を行うのね」
「 手の付けやすいところを先に固めていけば 難しい所が最後に残るわけか」
「 👆 Background
も、 BackgroundArtist
にリネームしよう」
「 👆 Scenes
も、 LocationCoordinator
にリネームしよう」
「 マシ―ナリー(machinery;機械装置)なんじゃないの?」
「 👇 スクウェアエニックス 中途採用 ゲーム開発
で検索。
どんな職種があるか 調べたろ」
📖 募集中の職種
「 UI デザイナー
と、 UI アーティスト
は何が違うんだぜ? 表記ゆれ?」
「 デザイナーと アーティストの違いが さっぱり分からん。
実態は どう違うんだぜ?」
「 アーティストは 自分勝手なやつで、
デザイナーは 顧客が思っていた本当に欲しかったものとは違うものを作ってくる勝手なやつじゃないのか?」
📖 デザイナーとアーティストの違いって? 実は存在目的が明確に違うんです!
「 アーティストは その人本人に価値があって それを会社側が ゲヘヘ と下心をこめて利用するもので、
デザイナーは 下請けか」
「 ゲーム制作は専門技術なんで、それ用の技術を持ってないので どこも無理だぜ」
「 なんで そんなやつが きふわらべRPG 作ろうとするんだぜ?」
「 Designer
と Artist
だと、 Artist
の方が つづりが短いから こっちを採用しよう」
「 👆 他の職業は 制作の裏方さんという感じなのに、
GuiArtist
は 本番中に めっちゃ 働くんだけど」
「 裏方と オン・エアで 大分類を切った方がベターなのかしらねえ?」
「 オンエアが始まる前に仕事が終わってる人たちと、
オンエアに仕事をしてる人たちで 別れるんじゃないの?」
「 上演中にシナリオを書き換えるシェークスピアみたいなやつとか 分類できないだろ」
「 現状の実装では ユーザーがキー入力すると
メッセージ・ウィンドウへ送られ、
台本の次の行が読み込まれ、それに従って さらに動く、
オートマタが 完成しているのが、 一時停止を都合悪くする原因だろう」
「 自律 するかどうかより 連続 かどうかが問題だぜ。
連続に 切れ目なんか無いぜ」
「 数学的には 無限の狭間を永遠に彷徨っていて定まらないと思うが、
情報処理的には プログラム・カウンターが止まっているところだぜ」
「 都合のわるい所、変なところであったとしても、
止まっているノードに対して 編集を行わず、かつ、行う処理が 再開 だけなのであれば
問題は起こらないと思うぜ」
「 Godot の GUI の思想が中途半端なんだぜ。
位置情報のような固定できる設定と、
メッセージ表示のような ランタイム時に状態を持つ設定が 分かれていない」
「 今どきのエディター、ほとんどの素材が ダイナミックだしな」
「 ラベルなどのコントロールは CanvasLayer
の下に管理される前提よね」
「 入力系や 自律的な系は Director
と AssistantDirector
に抑えさせよう。
他は 指示待ちで」
「 👆 GuiArtist
のフォルダーが深くて 開けるのが手間よ」
「 何を pause すればいいのか分かってきた……、
入力は一元的に抑え、
時間軸で勝手に動いているもののうち、邪魔なものを止めればいいんだぜ」
「 停止する世界と 停止しない世界 が共存していえ、
デッドロックしない仕組みを どう実現しているのか 分からないが……」
「 容赦なくデッドロックするんだぜ。
勝手に上手く停止させろよ、という方針なのだろうなんだぜ」
$"GuiArtist".get_tree().paused = true
「 👆 ウィンドウだけ止めようと思って .get_tree().paused = true
したら、音楽も止まった……」
「 👇 .get_tree().paused
は、ゲーム全体を止めるものらしいぜ」
「 .set_process(false)
を使うと、 _process(delta)
が呼び出されなくなるそうよ」
「 メソッドを呼び出したノードだけ一時停止して、その子ノードは一時停止しない……」
「 👆 Godot の習慣に合わせると、こっちの 書き方の方がいいか?」
📖 How to check have the node a custom function?
# サブツリーの is_process を設定。ポーズ(Pause;一時停止)の逆の操作
func set_process_subtree(is_process):
print("[テキストブロック] プロセッシング:" + str(is_process))
# 処理しろ (true) という指示のとき、処理していれば (true) 、何もしない(pass)。
# 処理するな(false)という指示のとき、処理していれば (true) 、停止する (false)。
# 処理しろ (true) という指示のとき、処理していなければ(false)、再開する (true)。
# 処理するな(false)という指示のとき、処理していなければ(false)、何もしない(pass)
if is_process != self.is_processing():
self.set_process(is_process)
# 子ノード
for child in self.get_children():
if child.has_method("set_process_subtree"):
child.set_process_subtree(is_process)
「 👆 これを 各ノードのスクリプトに貼り付けていけば良さげ、めんどくせ」
📺 動画
.
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント