VisualScript:2D上で物体を移動させる

もっとも基本的な2Dノードを動かす方法について解説。

キーボードの左右上下を押したときに画像が動くようにする。

前準備

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

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

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

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

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

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

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

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

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

必要な変数の定義

移動させるために必要な変数を指定する。移動スピードの変数が必要になるため定義する。

メンバー:変数を作成の+を選択し、変数を1つ追加する。名前を「speed」とでもしておく。

右クリックをして「メンバーを編集」を選択。Type(型)はInt、値は150としておく。

キー入力の取得

これからの手順として、「キー入力の取得」「取得したキー入力に応じた速度パラメータの方向を指定する」の2つ。

「キーの状態の取得」は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分追加してそれぞれを線でつなぐ。

次に動く方向を計算する。2次元において方向を示す変数はVector2という型を使用する。

Expressionブロックを追加する。これは任意の数式変換が出来るブロックである。Expressionのインスペクターウィンドウから、出力の型をVector2、入力の数を4、入力の変数の型をInt型に設定する。各入力の名前はleft/rightとしておくと分かりやすい。

Expressionの式の中には「Vector2(right-left,down-up)」を入力する。これでキー入力に応じて2次元ベクトルの向きのパラメータが設定される。

その後、出力されたVector2式をVector2 normalizedブロックで長さ1のベクトルに正規化する。

理由として、右と下の同時押しがあった場合、ベクトルの長さが√2≒1.414...になってしまい動く速度が1.4倍ほどになってしまう。
それを防ぐために長さ1のベクトルで正規化したうえでspeedをかける。

単純な掛け算もExpressionを使用する。入力がVector2とInt型のExpressionを作成する。定義した変数を使用したい場合はメンバーの変数からドラック&ドロップしてくると変数の値を取得するブロックが作成できる。これで速度パラメータの設定は終了。

速度パラメータからノードを動かす

いよいよノードを動かす制御を入れる。

KinematicBodyを動かす関数move_and_slideを追加して速度パラメータをそのままつなぐ。

ブロックの左上にある▽はこのブロックを動作させるタイミングを設定する場所である。

刻一刻と変化する処理は基本的に毎フレームごとに実行する。毎フレームごとにトリガー(動作のタイミング)を出力する関数はprocess関数になる。このブロックはメンバー:関数から追加できる。

最後にprocessブロックとmoce_and_slideブロックを繋いで終了。これを実行するとキー入力によって画像が動くプログラムとなっているはずである。

Follow me!

コメントを残す

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