Neste compendium vamos criar uma movimentação de um personagem na visão Top Down (Visto de Cima) para jogos 3D. O personagem será controlado pelas setas e irá se mover nas oito direções: Cima , Baixo , Esquerda, Direita e as quatro Diagonais.

Tópicos:

Movimento Top Down

Jogos na perspectiva Top Down, são jogos em que a câmera fica por cima do jogo sendo que a visão é vista de cima para baixo. Este tipo de visão é muito comum para jogos 2D. Mas jogos em 3D também podem ter essa perspectiva. Os personagens se movem em 8 direções: Cima , Baixo , Esquerda, Direita e as quatro Diagonais.


Jogo The Legend of Zelda - A Link Between Worlds - 3DS. Lançado pela Nintendo em 2013

Definindo a Cena do Player

A primeira coisa que precisamos fazer é criar a nossa cena do player. Para isso vamos utilizar um KinematicBody e filho desse um CollisionShape. Mude o nome do KinematicBody para Player.

Crie um formato de SphereShape para o CollisionShape:

Esta esfera azul representa a colisão do personagem. Uma boa dica para quando você estiver criando os personagens, é considerar a grid ( o quadriculado ) como o chão do jogo. Neste caso vamos subir um pouco o node CollisionShape .

Agora vamos criar a aparência física do personagem, o modelo 3D que o jogador irá enxergar no jogo. Para isso adicione um Spatial. Filho desse node colocamos um MeshInstance com o formato de esfera:

Ajuste a posição do Spatial para ficar na mesma altura do CollisionShape.

Mude o nome do Spatial para Mesh e o MeshInstance para Body

Vamos adicionar mais um MeshInstance filho do node Body. Este será no formato de um cubo. Mude o nome do node para Cube. Este node irá representar a direção que o jogador estará olhando, então diminua um pouco o node e coloque no lado oposto da seta vermelha do eixo X

ATENÇÃO

Fizemos essa parte acima somente como exemplo. Se você possuir um personagem já feito em 3D, coloque ele olhando na direção oposta da seta vermelha.

Por último salve a cena como Player.tscn. Se quiser pode mudar também a cor do material dos objetos.

Ajustando a Câmera

Agora iremos configurar a câmera do jogo. Na fase onde você irá colocar o seu personagem adicione um node Camera. Este node irá exibir o que ele tem visão para a tela do jogo.

Uma dica para posicionar a câmera na visão desejada é selecionar o node Camera, usar a movimentação em primeira pessoa, pressionando o botão esquerdo e utilize as teclas W,A,S,D para a visão desejada.

Após isso, com a câmera selecionada, vá no menu Perspective e selecione a opção Align Transform with view ( ou pressione Ctrl+Alt+M )

Criando as paredes

Podemos criar as paredes do nosso jogo usando o node CSGBox

Posicione o node aonde você quer que seja a parede. Use sempre os círculos vermelhos para alterar o tamanho de um CSGBox.

No inspetor, com a CSGBox selecionada marque a opção Use Collision,  dessa forma este node será sólido e o jogador não vai conseguir passar por ele.

Se você quiser, pode criar um material para o node. A vantagem do CSGBox, é que se você ativar a opção no Material UV Triplanar, a textura irá se repetir pela superfície do objeto.

Programando a movimentação

Crie um script para a cena Player. Então adicione as seguintes variáveis:

A variável speed representa a velocidade do jogador. Já a variável dir representa a direção que o jogador irá se mover. Uma variável que armazena um valor do tipo Vector3 está guardando três valores, sendo que o primeiro representa um valor X,  o segundo um valor Y e por último o Z. São esses valores de x, y e z que formam um Vetor3. Uma maneira simples de representar um vetor é através de uma seta, onde os valores x , y e z definem o seu tamanho e a direção para a qual ela está apontando.

Observe a animação para compreender a direção de um vetor:

Então vamos criar este código dentro de um _physics_process( )

Aqui na linha 7 está verificando se o jogador está pressionando a tecla para direita mude o x do vetor para 1. Se não, na linha 9, se o jogador estiver pressionando para esquerda mude o x para -1. Se não, na linha 11, caso nenhuma das outras opções forem verdadeiras, o x volta para 0.

Agora faremos o mesmo para o eixo z:

Por último, usamos a função move_and_slide( ) para mover o personagem na linha 21

Instancie o jogador na sua fase. Se você testar o jogo terá o resultado como este:

Observe que e você se mover na diagonal o personagem se move mais rápido do que se estivesse se movendo em apenas um eixo ( Direita e Esquerda , Frente e Trás )

Para resolver este problema, podemos normalizar a variável dir. Modifique a linha 21 para como está na imagem abaixo:

O resultado será este:

Uma melhoria que podemos fazer é mudar o ângulo de movimento do personagem. Para isso podemos adicionar uma nova linha antes da função move_and_slide( ) para rotacionar o node Mesh.

Teremos um problema no resultado, pois assim que o jogador soltar qualquer tecla, o personagem irá voltar para o ângulo 0:

Para resolver isto, vamos adicionar uma comparação antes de rotacionar o node:

O que a comparação da lina 21 está verificando e se o valor absoluto do vetor (isto é, se o vetor for maior do que 0, não estiver zerado ) é maior do que zero. Se afirmativo, só então rotacionamos nosso Node.

Podemos melhorar ainda mais a rotação do personagem. Em vez do Node rotacionar de forma brusca na direção do movimento, podemos rotacionar o Node gradualmente de forma suave. Para isso crie uma nova variável que será nossa rotação:

Então mude o código da linha onde ocorre a rotação:

O resultado será um movimento bem mais suave: