Godot - Parte 6

Criando um script para movimento do carro

Olá a todos! Dando continuidade a sequência de posts, hoje vamos aprender um pouco sobre GDscript, que é a linguagem de programação nativa da Godot. No post passado aprendemos a adicionar o carro ao nosso jogo, hoje iremos criar um script vinculado a este carro e nele iremos codificar, de forma que possamos após o término do script, movimentar o carro no sentido esquerda e direita. Então vamos lá!

Inicialmente na pasta do seu projeto, onde já temos duas pastas, assets e scenes, vamos criar uma outra chamada de scripts, nela vamos a partir de agora guardar todos os arquivos de código do jogo. Após criar essa pasta, abra o sua Godot, e você já verá a pasta sendo exibida na área de recursos. Selecione o node Personagem e com botão direito clique na opção Attach Script, como mostra a figura abaixo:

Feito isso, aparecerá a tela abaixo, onde vamos explicar alguns detalhes:


Language

  • Aqui  podemos escolher a linguagem de programação que usaremos no jogo, vamos deixar como está, GDscript

Inherits

  • Cada node nativo da Godot, possui uma classe com seus próprios métodos e atributos, ao criarmos um script, podemos observar em Inherits a que classe o script herdará os métodos, no caso na figura acima, percebemos que nosso script herda da classe pertencente ao Node2D.

Template

  • Em template temos a opção default, onde o script é gerado já com a função func _ready(), ou vazio ou sem comentários. Escolha default

Built-in Script

  • Se habilitarmos essa opção para ON, o script criado será embutido dentro do node, e não teremos acesso a ele na pasta scripts. Então deixe marcado como off

Path

  • Em path, temos o caminho onde queremos salvar o script que vai ser criado, então como anteriormente criamos a pasta dentro do projeto, scripts, vamos clicar nessa  opção e direcionar até a nossa pasta criada, para que o script seja salvo dentro dele.


Ao clicarmos em path, veremos a tela abaixo:




Agora, em path, onde tem a seta direcionada para cima, clique para subirmos ao diretório pai, clique na pasta scripts, e salve dentro com o nome que apareceu por padrão, Personagem.gd.Feito isso, abaixo temos a imagem da tela já com o path correto, indicando onde o arquivo será salvo.



Agora é só clicar em Create, e o arquivo será criado. E finalmente teremos nosso Script criado, com o código abaixo:

extends Node2D

# class member variables go here, for example:
# var a = 2
# var b = "textvar"

func _ready():
# Called when the node is added to the scene for the first time.
# Initialization here
pass

#func _process(delta):
# # Called every frame. Delta is time since last frame.
# # Update game logic here.
# pass


No código acima gerado, temos:

func _ready()

  • essa função é executada uma única vez ao abrirmos a cena do jogo em que o script esteja vinculado a algum node. É interessante preenchermos o corpo dessa função, quando queremos carregar valores uma única vez ou instâncias de outras scenes.

func _process(delta)

  • Essa função que está comentada, é uma função muito usada, quando queremos executar ações continuamente. É uma função que é processada quadro a quadro do jogo e o que estiver no seu corpo será executado a cada mudança de quadro. Então vamos retirar os comentários dessa função, pois a funcionalidade do movimento do carro será realizada dentro dela.
  • OBS: Existem muitas outra funções nativas, como estas, que com o tempo aprenderemos as funcionalidades de cada.

pass

  • Perceba que dentro de cada função existe, pass, se apagarmos e deixarmos a função com o corpo em branco, será mostrado um erro. Então usamos pass, para simplesmente não deixarmos o corpo em branco e também para informar para a função não fazer nada, ao ser executada. Quando implementamos algo, retiramos essa palavra do corpo da função.

GDscript, é uma linguagem fácil de se entender, bem semelhante a python. Quem já tiver experiência nesta linguagem, não terá problema em entender GDscript. toda vez que criarmos uma função e formos implementar o seu corpo, usamos Indentação, perceba que o código tem um espaçamento a esquerda do nome da função no seu corpo, isso torna o código mais legível. Quando usamos as estruturas lógicas de programação, como if, while, for, etc, também teremos que fazer a indentação no corpo. Antes de irmos para a função _process(delta) e escrevermos o código para movimentarmos o carro, vamos no corpo da função _ready(), e dentro, vamos chamar a função _process(true), essa função recebe um booleano no argumento que informa se vamos ou não processar algo a cada quadro, ou seja a cada quadro do jogo a função _process(delta) será chamada, aproveitando limpe também todos os comentários para que fique um código mais limpo. Então faça como abaixo:

extends Node2D


func _ready():
_process(true)


func _process(delta):
pass

Agora que ativamos o processamento a cada quadro, vamos para a função _process(delta). Nela vamos criar duas variáveis, esquerda e direita. Para criarmos uma variável, basta declararmos var  "nome da variável". Então observe abaixo como ficou:

extends Node2D

var esquerda
var direita

func _ready():
_process(true)


func _process(delta):
pass

Para quem ainda não entende muito de programação, variáveis são espaços que criamos na memória para guardar informações, valores e etc, para que em determinados momentos do jogo esses valores sejam invocados para serem utilizados. Posteriormente, iremos criar alguns posts explicando sobre GDscript, a lógica, as funções e etc. Por isso é importante o seu contato, para que tenhamos uma demanda interessada. Bom voltando!, As variáveis foram criadas, vamos ao próximo passo.

Agora vamos atribuir a essas variáveis que foram criadas, as teclas de setas do nosso teclado. As setas esquerdas e direitas que estão em nosso teclado serão usadas para movimentar o carro nesse momento. Quando tivermos o joguinho pronto, vamos alterar para que sejam usadas o touchscreen do nosso smartphone, mas nesse momento por questões didáticas, vamos trabalhar com as setas.

Então agora, vamos em Project Settings, você já deve saber onde fica. No menu superior temos algumas abas, como mostra a figura abaixo, então clique em Input Map.

Nessa aba, Input Map, temos o mapeamento das teclas, onde criamos um evento, dando um nome e referenciando uma tecla que será pressionada. Então em Action, conforme mostra a figura abaixo, escreva ui_direita e clique em Add

Agora com essa Action criada, clique no + , conforme a figura abaixo:


Aparecerá a tela abaixo:



Clique em Key, e uma nova tela surgirá:



Nessa tela está sendo solicitado que você clique em uma tecla, do seu teclado para que fique mapeado a ação ui_direita para essa tecla, sempre que ela for pressionada. Então clique na seta direita e depois em OK. Se tudo tiver ocorrido bem, a imagem abaixo estará igual a sua:



Agora repita os mesmos passos, criando um Action nova, ui_esquerda e mapeando essa ação para a seta esquerda. Depois de criar, clique em Close. Voltando agora para o nosso script, vamos fazer a referência das variáveis criadas, com as ações de entrada no teclado.

extends Node2D

var esquerda
var direita

func _ready():
_process(true)


func _process(delta):
direita = Input.action_press("ui_direita")
esquerda = Input.action_press("ui_esquerda")



Veja como ficou, as variáveis criadas estão guardando as ações a cada quadro processado do jogo, as ações de pressionamento das teclas seta esquerda e seta direita. É exatamente, isso que os métodos do Input, is_action_pressed faz, ele recebe como argumento a referência do mapeamento criado anteriormente. O retorno desse método é um booleano, que será true se a tecla estiver sendo pressionada ou false, caso não esteja.

Agora vamos criar duas variáveis novas, que vamos chamar de var desl_esquerda e var desl_direita, nessas variáveis vamos atribuir vetores que indicam sentido do deslocamento, o código ficará assim:

extends Node2D

var esquerda
var direita
var desl_esquerda = Vector2(-1,0)
var desl_direita = Vector2(1,0)

func _ready():

_process(true)


func _process(delta):
direita = Input.is_action_pressed("ui_direita")
esquerda = Input.is_action_pressed("ui_esquerda")


vamos explicar o que fizemos, as duas variáveis criadas estão recebendo valores que representam no plano cartesiano o sentido. Vector2(x,y), representa um vetor, "um segmento orientado", esse 2 que acompanha Vector, significa que estamos trabalhando no plano 2D, e x e y são as coordenadas. Como não vamos deslocar nem para cima, nem para baixo, a coordenada y ficou com valor 0, no entanto a coordenada x, assumiu dois valores, -1 e 1, que são respectivamente as unidades de  movimento que faremos no eixo x, -1 é quando estamos indo para esquerda e 1 quando estamos indo para direita.

Agora vamos criar uma variável que será a velocidade do nosso carro, que será var velocidade, daremos um valor inicial de 500, com esse valor teremos um movimento razoável, se você preferir poderá alterar esse valor para maior ou menor . Dentro do jogo também em tempo de execução você poderá tá sempre alterando essa velocidade para que o carro fique mais ou menos veloz.

Depois de criarmos a variável velocidade, criaremos duas condicionais com implementações que farão o carro se deslocar para direita ou esquerda de acordo com o retorno true ou false que as variáveis direita e esquerda recebem do método Input. E dentro dessas condicionais, vamos usar o método translate, que é o método responsável por atualizar a posição do personagem a cada quadro, em unidades 1 e -1.

extends Node2D

var esquerda
var direita
var desl_esquerda = Vector2(-1,0)
var desl_direita = Vector2(1,0)
var velocidade = 500


func _ready():

_process(true)


func _process(delta):


direita = Input.is_action_pressed("ui_direita")
esquerda = Input.is_action_pressed("ui_esquerda")

if direita:


translate(velocidade*desl_direita*delta)
if esquerda:

translate(velocidade*desl_esquerda*delta)



No código acima, temos as condicionais mencionadas, e a função translate que recebe como argumento o valor da expressão, que é o produto da velocidade, desl_diretia e delta. O parâmetro delta contém o tempo decorrido em segundos, como um ponto flutuante, desde a chamada anterior para _process ().

Se tudo tiver sido feito conforme o post, ao rodar o jogo, você perceberá que já poderá controlar o carro, com as setas esquerda e direita do teclado, conforme o vídeo abaixo.



Mas observe, que ao controlarmos o carro, este não tem limitações, ou seja, se você colocar para direita e segurar, ele segue esse sentido infinitamente, perceba que até some da sua tela de visão de jogo. Então não queremos isso, queremos que ele fique limitado a se movimentar apenas dentro da pista.E isso é o que vamos fazer no próximo post.

Se você perdeu o post anterior, clique abaixo:

Godot - Parte 5 (adicionando o carro ao jogo)


Se você ainda não cadastrou seu email para receber atualizações de postagens, vá a nossa página inicial e cadastre, ou se preferir clique Aqui
Autor
Maclaine Sabino

Maclaine Sabino Graduado em Matemática, Administração, finalizando Análise e Desenvolvimento de Sistemas.
Ama aprender coisas novas, tecnologia e música.