ぬーぶのメモ帳

フリーゲームエンジン「Godot」でプログラム経験のない素人の備忘録 最近は色々な動作を考えて試すのが好き。

【Godot】練習に簡易RPGに挑戦したら大変だった1 

イメージはドラゴンクエスト1 



今は作れる物が偏っていてより複雑な事をするには辞書や配列、最終的にはJSONなど他にも覚える必要性を感じています。 

そこで複数のデータをやり取りするRPGを超簡易的にして挑戦することに。 

力を入れたい所は以下の三点

  • NPCとの会話  : 会話のフラグに合わせてメッセージを表示させる
  • 店でのアイテム購入 : アイテム欄は今回一番凝りたいと思った所
  • 戦闘システム : こちらが絶対先手の簡易的な戦闘

自分もですが初心者にありがちなのがこれなら簡単と思っても全然簡単で無いのでとにかくハードルを下げての挑戦が大事だと考えています。

会話ウィンドウの作成

下のウィンドウの子にLabelを挿入してスクリプトでテキストを制御する簡素なもの。

それでも適切に表示させるにはいくつか工程を踏まないとダメで、また今回signalと言う別オブジェクトを制御させる信号を使用しました。

  • シグナル : オブジェクトが信号を飛ばす事で、別オブジェクトのスクリプトの関数を実行させる事ができる、という解釈で間違いないはず




この場合はオブジェクト1がシグナルを発して、オブジェクト2の扉を開けるという命令を実行させる。
ただ遠くからドアが開いては困るので、エリアに入ってシグナルが飛ばされた時だけドアが開くようになっている。
シグナルを使う事でスクリプトが別々のオブジェクトでも連動させる事ができて非常に便利。
この時オブジェクト2は _ready関数などでオブジェクト1を接続しておかないと信号を受け取れないので注意が必要になる。
スクリプトにすると大体こうだと思います。

# オブジェクト1

# ここでシグナルの名前を定義する
signal open

func _process(_delta: float) -> void:
# エリアに入った状態でAを押すと emit_signal で open のシグナルが飛ぶ
	if Input.is_action_pressed("a") and area_in:
		emit_signal("open")
# オブジェクト2

func _ready() -> void:
# オブジェクト1の場所.connect(オブジェクト1の信号, 対象オブジェクト, 対象オブジェクトの関数)
	object1.connect("open", self, "door_open")
# この場合 open の信号をキャッチすると door_open が実行される
func door_open() -> void:
# 何かしらの命令


上のような事をしウィンドウの表示、ショップでの購入、戦闘画面の表示を行いました。
そして立てたフラグはmatchで会話カテゴリーの分岐を促し更にシグナルを飛ばす、を繰り返しました。

ひとまずメッセージ表示については完成。
三つの要素を振り返るととても長くなるので分割します。



次回 : 【Godot】練習に簡易RPGに挑戦したら大変だった2 - ぬーぶのメモ帳