Compendium - Movimento em Plataforma 2D

Jogos de plataforma são um dos gêneros mais famosos do mundo. Eram bem comuns em consoles como super nintendo e mega drive. Nesse estilo de jogo a câmera é posicionada em 2D e o movimento básico do personagem é andar em 4 direções (cima, baixo, esquerda e direita),e também pular.

Para começarmos, precisamos antes criar a cena do personagem. Então dentro do Godot vamos utilizar esses nodes:

KinematicBody2D

O KinematicBody2D servirá para movermos o personagem. Dentro desse node podemos inserir um Sprite para o corpo, e por fim com o CollisionShape2D inserimos um colisor para ele.

Programando a Movimentação

Depois de ter feito isso, salve sua cena e crie um script dentro do node raiz (Não se esqueça de renomear os nodes). Dentro do script precisaremos criar 3 variáveis: uma para a velocidade do personagem, outra para definirmos a direção do player, e por fim mais uma para a movimentação do Player. Com o export a variável se torna editável na aba inspector, fazendo com que ela possa receber valores diferentes em cada cena que for instanciada:

Definido essas três variáveis, podemos inserir dentro da função _physics_process(delta) a condição que compara se for pressionado as setas da direita ou esquerda, o personagem se move para a direção desejada incrementando ou decrementando o valor do eixo X da variável dir utilizando o valor da velocidade multiplicado por delta.

 Lembre-se que o delta é o valor de tempo em milisegundos que o processador realiza todo o processo dentro do jogo. Ele é muito importante, pois faz com que todas as máquinas que rodarem o programa tenham o mesmo tempo de execução.

Já que agora temos o valor da variável dir, precisamos aplicar esse valor dentro da variável move que é responsável agora por controlar a movimentação do personagem, mas utilizando apenas o eixo X:

Por fim aplicamos o valor de move dentro da função move_and_slide(). Lembre-se que o primeiro valor da função é o valor do movimento, e o segundo é a identificação do vetor do chão, ou seja, para onde o chão está apontado:

Salve e teste a sua cena. Perceba que o personagem já se move, mas ele não para.  Para isso ser resolvido precisamos zerar a todo momento os valores de direção dessa forma:

Volte a testar e agora o personagem fica parado. Mas agora o que falta é implementarmos a gravidade ao Player e fazer com que ele pule.

Criando o Pulo

Vamos agora criar a gravidade para o Player. Para isso crie mais 2 variáveis: uma para determinar a força da gravidade e mais uma para determinar a força do pulo:

Agora precisamos aplicar a força da gravidade ao Player. Na função _physics_process vamos fazer com que o eixo de direção Y da variável move seja a todo momento aplicado a força incrementando o seu valor:

Teste e já perceba que o seu personagem começa a cair. Por último vamos fazer com que quando a tecla espaço for pressionada, a força do pulo ser aplicada diretamente no eixo Y da variável move com o valor da variável jumpForce, já que ela é responsável pela gravidade. Mas nesse caso a força deve ser contrária a gravidade, ou seja, negativa:

Antes de continuar, é necessário que criemos uma cena com uma plataforma sólida para realizarmos os testes. Para isso crie uma nova cena, e dentro dela insira um Node2D como raíz, e depois um node Texture Rect. Na aba inspector, procure o atributo Texture e insira um sprite (pode ser o rosto do Godot). Por fim procure a opção Stretch Mode e selecione a opção Tile. Ela faz com que o objeto seja repetido inúmeras vezes, o que facilita na hora de criar terrenos em 2D:

Criado a plataforma, basta inserir agora um node StaticBody2D e dentro dele insira o Texture Rect e por último o CollisionShape2D para inserir um colisor na plataforma:

Agora salve e insira o personagem na cena e depois teste o pulo do personagem. Mas existe um problema: se você apertar a tecla espaço várias vezes, o personagem não vai parar de pular. Para isso vamos fazer com que somente quando o personagem estiver no chão ele pule:

Pronto! Assim o personagem já pula e se move pelo cenário. Agora basta implementar o personagem em outras cenas quando necessário.