Creating the enemy

Ora è il momento di creare i nemici che il nostro giocatore dovrà schivare. Il loro comportamento non sarà molto complesso: i mob saranno generati in modo casuale ai bordi dello schermo, sceglieranno una direzione casuale e si muoveranno in linea retta.

Creeremo una scena Mob, che possiamo poi istanziare per creare un qualsiasi numero di mob indipendenti nel gioco.

Impostazione dei nodi

Clicca Scena -> Nuova Scena e aggiungi i seguenti nodi:

Non dimenticare di impostare i nodi figli in modo che non possano essere selezionati, come hai fatto con la scena del Giocatore.

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

Imposta :ref: AnimatedSprite <class_AnimatedSprite> come hai fatto per il giocatore. Questa volta abbiamo 3 animazioni: `` fly``, `` swim`` e `` walk``. Ci sono due immagini per ogni animazione nella cartella grafica.

Regola "Speed (FPS)" su 3 per tutte le animazioni.

../../_images/mob_animations.gif

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

Selezioneremo una di queste animazioni casualmente in modo che i nemici abbiano una certa varietà.

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

Come nella scena Player, aggiungi un CapsuleShape2D per la collisione. Per allineare la forma con l'immagine, dovrai impostare la proprietà Gradi di rotazione su 90 (sotto "Trasforma" nell'Inspector).

Salva la scena.

Script del nemico

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"].

Dobbiamo quindi scegliere un numero casuale tra 0 e 2 per selezionare uno di questi nomi dalla lista (gli indici degli array iniziano con 0). randi() % n seleziona un numero intero casuale tra 0 e n-1.

Nota

È necessario utilizzare randomize() se si desidera che la sequenza di numeri "casuali" sia diversa ogni volta che si esegue la scena. Useremo randomize() nella nostra scena Main, quindi non ne avremo bisogno qui.

L'ultimo pezzo è quello di fare in modo che i nemici si cancellino loro stessi quando escono dallo schermo. Collega il segnale screen_exited() del nodo ``VisibilityNotifier2D` e aggiungi questo codice:

func _on_VisibilityNotifier2D_screen_exited():
    queue_free()

Questo completa la scena 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.