Creating the enemy

次はプレイヤーが避けるべき敵を作りましょう。敵の行動はあまり複雑ではありません。モブは画面の端でランダムに生まれると、ランダムな方向を選び、一直線に進みます。

これから Mob シーンを作り、それをインスタンス化して、ゲーム内に任意の数の独立したモブを作成します。

ノードの設定

[シーン → 新規シーン] をクリックして、次のノードを追加します:

Playerシーンと同様に、選択できないように子を設定することを忘れないでください。

In the RigidBody2D properties, set Gravity Scale to 0, so the mob will not fall downward. In addition, under the CollisionObject2D section, click the Mask property and uncheck the first box. This will ensure the mobs do not collide with each other.

../../_images/set_collision_mask.png

プレイヤーに対して行ったように AnimatedSprite を設定します。 今回は、3つのアニメーションがあります: flyswimwalkです。 artフォルダ内には、各アニメーション用の画像が2枚あります。

全てのアニメーションの "Speed (FPS)" を 3 に調整してください。

../../_images/mob_animations.gif

Set the Playing property in the Inspector to "On".

モブにバラエティを持たせるために、1つのアニメーションをランダムに選択します。

Like the player images, these mob images need to be scaled down. Set the AnimatedSprite's Scale property to (0.75, 0.75).

Player シーンと同様に、コリジョンに CapsuleShape2D を追加します。図形を画像に合わせるには、Rotation Degrees プロパティを 90 に設定する必要があります (インスペクタの「Transform」の下にあります)。

シーンを保存します。

Enemyスクリプト

Add a script to the Mob like this:

extends RigidBody2D

Now let's look at the rest of the script. In _ready() we play the animation and randomly choose one of the three animation types:

func _ready():
    $AnimatedSprite.playing = true
    var mob_types = $AnimatedSprite.frames.get_animation_names()
    $AnimatedSprite.animation = mob_types[randi() % mob_types.size()]

First, we get the list of animation names from the AnimatedSprite's frames property. This returns an Array containing all three animation names: ["walk", "swim", "fly"].

次に、 0 から 2 の間の乱数を選んで、リストから名前を選ぶ必要があります (配列のインデックスは 0 から始まります)。 randi() % n0 から n-1 の間の乱数を選びます。

注釈

シーンを実行するたびに「ランダム」な数字のシーケンスを異なるようにするには、 randomize() を使用する必要があります。 Main シーンで randomize() を使用するので、ここでは必要はありません。

最後のピースは、モブが画面を離れたときにモブ自身を削除することです。 VisibilityNotifier2D ノードの screen_exited() シグナルを接続し、次のコードを追加します:

func _on_VisibilityNotifier2D_screen_exited():
    queue_free()

これで Mob シーンが完成します。

With the player and enemies ready, in the next part, we'll bring them together in a new scene. We'll make enemies spawn randomly around the game board and move forward, turning our project into a playable game.