VisualScript:条件分岐(Switch)によるキー入力処理

複雑な制御には欠かすことが出来ない条件分岐の制御の方法について解説する。

キー入力の情報を1つの変数に定義し、その変数が何かによって画像が動くようにする。

前準備

プロジェクトを作成し、Node2D/KinematicBody2D/Iconのノードを追加する。

(ノードの追加については2Dプロジェクト作成手順:リンクを参照)

▲!で警告が出ているが気にしない。(衝突判定をしないだけなので問題ない)

KinematicBody2DにVisualScriptをアタッチ(追加)する。

入力マップ(インプットマップ)の確認

次にキー入力に対応したイベント名の確認をする。

プロジェクト → プロジェクト設定→入力マップを開く。

この一覧からキーボードの上下左右を押したときのイベント名を確認する。

管理人の環境ではui_left/ui_right/ui_down/ui_upとなっていた。

キー入力の取得

「キーの状態の取得」はaction関数で取得できる。何もないところで右クリックしてactionと入力しactionブロックを作成する。

Actionブロックを選択した状態で(デフォルト設定では)右にあるインスペクターウィンドウからActionの設定を「ui_right」にする。

同様に「ui_left」「ui_down」「ui_up」のActionブロックを作成する。

このAction関数の出力はbool型と呼ばれるものでTrue/Falseのいずれかが出力される。

キー入力情報の定義

キー入力を取得したbool型はこのままだと使いにくいため、まずは1(True)/0(False)の数値の型(Int型)に変換する。

bool型をInt型に変換するにはConstruct IntBoolブロックを使用する。(追加方法はActionと一緒で右クリックでブロック名で検索)

これを全Action分追加してそれぞれを線でつなぐ。

次に各キー入力の情報を1つの変数にまとめる。それぞれのキーを押したときに右→1,左→2,下→4,上→8になるようにする。
入力に応じて数式を定義して計算し出力する場合は、Expressionブロックを使用する。

出力タイプはInt型、入力変数の数は4を選択し、各入力の型もIntにする。変数名はright,leftなど名前を付けても良い。


ui_right + 2*ui_left + 4*ui_down + 8*ui_up となるように数式を入力する。
同時押しがあり得る場合には各値は1,2,4,8・・・と2の倍数にしていく。
※もし今回のケースで1,2,3,4としてしまうと、右と左を同時押しは下を押した(1+2=3)と認識されてしまう。

条件分岐

前置きが長くなったが、いよいよ条件分岐を実装する。

VisualScriptの中でも条件分岐はconditionやswitch等あるが、基本的にはswitchを使用することを推奨する。
※C言語のif/ifelse/elseや、switch/case構文と近い。C言語に触れたことがある人には特にswitchの方がしっくりくるだろう。

switchブロックを追加し、インスペクターウィンドウからCase Countは4、各ケースの入力型をintに設定する。

さらに刻一刻と変化する処理は基本的に毎フレームごとに実行する。毎フレームごとに動作させる場合process関数というものが必要になる。このブロックはメンバー:関数から追加できる。

Switch関数のcase条件内にui_left/ui_right・・・の値をそれぞれ入力し、inputへはExpressionの出力を繋ぐ。
こうすることで各条件が成立した時のみ、その条件の右にある▽の先の処理だけが実行されることで条件分岐処理が出来る。

なお、条件分岐が終わった後に共通で実施したい処理がある場合(条件分岐後の共通処理)はdoneの先に繋げていく。

KinematicBodyを移動させる場合にはmove_and_slideを使用する。linear_velocityは動く速度のパラメータ。
絶対値を150として各キー入力に応じた速度の2次元ベクトルパラメータを入力していく。

これで実行するとキー入力に応じて、上下左右に動くものが出来る。

なお、同時押しで斜めにも移動するようしたい場合は、条件分岐に5(右下),6(左下),9(右上),10(左上)のパターンを追加すれば良い。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です