Creating the enemy

Agora é hora de criarmos os inimigos que nosso jogador terá que se desviar. Seu comportamento não será tão complexo: inimigos irão nascer aleatoriamente nos cantos da tela e irão se mover em uma direção também aleatória, só que em linha reta, para, então desaparecerem ao sair da tela.

Nós iremos construir isso em uma cena Inimigo, que poderemos então instanciar para criar uma quantidade de inimigos independentes no jogo.

Configuração de nós

Clique Cena -> Nova Cena e adcione os seguintes nós:

Não se esqueça de configurar os filhos para que não possam ser selecionados, assim como você fez na cena Jogador.

Nas propriedades RigidBody2D, defina Gravity Scale para 0, assim o mob não vai cair. Além disso, na seção CollisionObject2D, clique na propriedade Mask e desmarque a primeira caixa. Isso garantirá que os mobs não colidam uns com os outros.

../../_images/set_collision_mask.png

Configure o AnimatedSprite assim como você fez para o jogador. Desta vez, temos 3 animações: voar (fly), nadar (swim) e andar (walk). Defina a propriedade Playing (reproduzindo_ no Inspetor para "Ativo" e ajuste a configuração "Velocidade (FPS)" como mostrado abaixo. Vamos selecionar uma dessas animações aleatoriamente para que a turba tenha alguma variedade.

Ajuste o "Speed (FPS)" para 3 em todas as animações.

../../_images/mob_animations.gif

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

Vamos selecionar uma das animações aleatoriamente para que os inimigos tenham alguma variedade.

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

Como na cena do Jogador, adicione um CapsuleShape2D para a colisão. Para alinhar a forma com a imagem, você precisará definir a propriedade Rotation Degrees (graus de rotação) como 90 na seção Node2D.

Salvar Cena.

Script do inimigo

Adicione um script à ``Mob``assim:

extends RigidBody2D

Agora, vamos ver o resto do script. Em ``_ready () ``, rodamos a animação e escolhemos aleatoriamente um dos três tipos de animação:

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

Primeiro nós pegamos a lista dos nomes das animações da propriedade frames do AnimatedSprite. Isto retorna um Array contendo os nomes das três animações: ["walk", "swim", "fly"].

Nós precisamos, então, de um número randômico entre 0 e 2 para selecionar um dos nomes da lista(os índices de um vetor começam do 0 ). randi() % n``seleciona randomicamente um inteiro entre ``0 e n-1.

Nota

Você deve usar randomize() se quiser que sua sequência de números "aleatórios" seja diferente toda vez que você executar a cena. Nós vamos usar randomize() em nossa cena Principal, então não precisaremos dessa função aqui. randi () % n é a maneira padrão de obter um inteiro aleatório entre 0 e n-1.

A última parte é fazer os inimigo se autodestruirem ao sair da tela. Conecte o sinal screen_exited() (saiu da tela) do nó VisibilityNotifier2D e adicione este código:

func _on_VisibilityNotifier2D_screen_exited():
    queue_free()

Isto completa a cena dos Inimigos.

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.