「1-1」で登場する敵は、クリボーとクッパーの二種類だが今後のことも考え「継承」シーンを作成しその雛形を使用して各敵を作成する。継承の利点はあまり理解してないが下記の通りらしい。
- codeや定数の繰り返しを避ける
- 一貫性を向上する
- バリエーションを作るのが簡単になる。
個人的には、一旦雛形を作れば他の敵も最小の変更で作成でき、またプログラムの一貫性が向上することでデバックが用意になるかなと思う。
敵の雛形作成(ノードツリー)
上部メニューの「シーン」を選択し「新規シーン」をクリックする。
「その他のノード」クリックする。
今回も動きを伴うので「Player」と同じ「CharacterBody2D」を選択しクリック。
名前を「CharacterBody2D」から「Enemy」に変更。
ここで、シーンとして保存。上部メニュー「シーン」>「名前を付けてシーンを保存」 Scriptsデレクトリーに「Enemy.gd」として保存する。
そうしたら、下図のように「子ノード」を追加する。「+」をクリックして作成。
「Sprite2D」のインスペクター「Texture」は<空>で大丈夫。
「CollisionShape2D」のインスペクター「Shape」は「CircleShape2D」を選択する。
「Area2D」は、上部からの衝突を検知するものだ。その子として「CollisionShape2D」を追加し、インスペクターの「Shape」に「RectangleShape2D」を選択。例えば、マリオがジャンプしてクリボー上部に当たるのを検出する役目だ。
「RayCast2D」は、足元の衝突検出機能。
「VisibleOnScreenEnabler2D」は画面上に現れたかどうか検出する機能。
敵雛形のスクリプト作成
「ノードにスクリプトをアタッチする」をクリック。パス名はres://Scripts/Enemy.gdで作成をクリック。
スクリプトの内容を説明します。
敵の動き設定(enum)
敵の動き方を定義し、プロパティで変えることが出来る。move_type値は0 or 1 例えば、クリボーが空中の床上を移動中、端に来た時そのまま移動するか反転移動するかの設定に使用。normal:そのまま移動 round_trip:反転移動
敵の動き初期値設定
speed:速度、direction:動く方向 -1左 0停止 1右、gravity:重力 取り敢えず初期値を設定しているがいずれもプロパティで変更化
ノードを変数に代入
各ノードを変数に代入、ray_cast_2d_position_xは初期ray_cast_2dのposition.xを入れる変数
func _ready() set_physics_prosess()
set_physics_prosess(false)で func _physics_prosess()停止、set_physics_prosess(true)で func _physics_prosess()動作
Playerのグループ登録
下のfunc _on_area_2d_body_entered(body)の if body.is_in_group = “Player”でグループ判別するので、Playerのグループ登録をする。
左側のファイルシステムで「Player.tscn」をダブルクリック
現れたシーンの「Player」をクリック
右側ドックで「ノード」>「グループ」をクリックし「Player」と入力
「追加」をクリックすると「Player」グループが作成され、削除もこの画面で出来る。
左側のシーンドックで「Player」ノードに四角○が表示されるのでシーンを保存する。
func _on_area_2d_body_entered(body)
func _on_area_2d_body_entered(body)はbodyがエリアに入ったときのシグナルで、その後の処理は敵により異なる場合が多いのでon_hit_head(body)関数を作成し、処理は本当の敵スクリプトで記述(オーバーライドする形)if文内容は、エリアに入ったObjectが「Playerグループ」に属してたらon_hit_head(body)関数を実施
func _on_area_2d_body_entered(body)は下記の作業で記述される。画面左の「シーン」で「Area2D」選択
右側上部メニュー「ノード」>「body_entered(body:Node2D」クリック後、下部の「接続」をクリック
「メソッドにシグナルを接続」>「Enemy」選択後、「接続」をクリックすることでScriptが記述される。
VisibleOnScreenEnabler2D
画面に現れれば動作し、そうでなければ停止するスクリプト
func _on_visible_on_screen_enabler_2d_screen_entered()は下記の作業で記述される。画面左の「シーン」で「VisibleOnScreenEnabler2D」選択
右側ドックで「ノード」>「シグナル」>「screen_entered()」クリックし、下の「接続」をクリック
「Enemy」を選択し、「接続」をクリック
func _on_visible_on_screen_enabler_2d_screen_exited()も同様に実施すれば、作成される。
コメント