Escolar Documentos
Profissional Documentos
Cultura Documentos
William Tumeo
Figura 2: Sistema de cenas na Godot Engine. Figura 4: Sistema de herança e scripts na Godot Engine.
Figura 10: Básico da checagem de inputs e loop. Figura 12: Criando input actions para cada player.
Para fazer o pad se mover, precisaremos atualizar a sua posição Agora precisamos fazer uma pequena modificação na checagem
levando em consideração a velocidade do movimento. Primeiro dos inputs. Em vez de usar “ui_up” e “ui_down”, vamos trocar
guardamos a posição atual do pad em uma variável utilizando o pelos nomes novos, porém, no lugar do número do player,
método “get_pos”, antes de capturar os inputs. Em cada usaremos um template de string simples, que nesse caso vai ser o
condicional dos inputs, deve-se adicionar ou subtrair no atributo termo “%s”. Por exemplo: “pad_up_%s”, e logo em seguida deve-
“y” dessa variável o produto da velocidade com o delta do se aplicar o template da mesma forma como é feito na linguagem
processo. No canvas 2D da Godot Engine, o eixo Y é contado de Python, utilizando a variável que guarda o número do player.
cima para baixo, ou seja, para ir para baixo, deve-se adicionar e
para ir para cima, deve-se subtrair. Após o bloco das condicionais,
é possível limitar o movimento utilizando a função matemática
“clamp(valor, mínimo, máximo)”, sendo o mínimo zero (topo de
tela) e o máximo a altura da tela, que é o atributo “y” (ou
“height”) do Vector2 da variável em que foi guardado o tamanho
da tela. Após isso, basta usar essa variável para chamar o método
“set_pos(position)”.
Salvando este node como uma nova cena, será possível usá-lo
como origem de ambos player 1 e 2. Tudo que for adicionado
nessa cena será herdado por todas as instâncias dessa cena. Agora
já é possível duplicar esse node com segurança e configurar o
número do player para cada um dos nodes.
Para diferenciar visualmente os pads, pode-se alterar a Figura 17: Movimentação básica da bola.
propriedade “Modulate” de cada um deles. Isso mudará a cor dos
pads. 3.1.8 Interagindo com os pads
Até o momento, a disposição da árvore ficará da forma
mostrada na imagem abaixo. Lembrando que sempre que um node Para fazer a bola bater nos pads, vamos precisar interagir com
for uma instância de alguma cena, aparecerá um ícone de “cena” eles de duas formas. Primeiro, precisamos obter uma referência de
ao lado do nome. ambos os pads em array e precisamos saber o tamanho e a posição
deles. Para obter os pads, vamos utilizar um recurso que destaca
um node adicionando ele a um grupo, similar às tags da Unity3D.
É possível adicionar nodes em algum grupo pela aba Node no
editor. Vamos adicionar o node da cena pad ao grupo “pad”, assim
todas as instâncias também serão adicionadas.
3.3.2 Enums
Para facilitar a leitura do código, criaremos algumas variáveis
que contenham apenas números inteiros para indicar direções (up,
down, left, right). Em vez de utilizar uma variável ou constante,
podemos usar enums (constantes otimizadas para guardar somente
números inteiros e também utilizáveis sem valor específico), que
iria gerar uma sequência numérica começando em zero (ou Figura 26: Lista de sinais acessíveis pelo editor.
qualquer outro número definido no primeiro enum).
Vamos utilizar esses enums para o sinal da bola saindo da tela.
3.3.4 Singletons
Depois de criar o sinal na bola, vamos criar um script no node
raíz da árvore, que vai ser usado para conectar o sinal e checar
quem foi o ganhador da partida. Para facilitar a estrutura do jogo,
deixaremos o script da pontuação para outro tipo de node, o
singleton.
Singletons são cenas, ou somente scripts, que se carregam
durante o load inicial do projeto e se mantém ativos e acessíveis
globalmente. Não é preciso saber o caminho deste tipo de node
para acessá-lo, apenas saber seu nome global. Basta criar uma
cena qualquer (chamaremos de Score) com um node qualquer na
raíz e um script nela. Então só é preciso adicionar esta cena à lista
de singletons na aba “AutoLoad” das configurações do projeto. É
Figura 24: Adicionando enums ao script. possível escolher um nome global para o singleton, desde que não
conflite com outros termos nativos da engine.
3.3.3 Conectando e Emitindo Sinais No script de score adicionaremos duas variáveis para score
(uma para cada player), uma função que será utilizada para
Qualquer sinal é emitido utilizando o método incrementar o score e um sinal que será emitido sempre que o
“emit_signal(name, *args)”, sendo que a quantidade de score for atualizado, avisando qual player teve o score atualizado
argumentos vai depender do sinal. Nesse caso será somente um e o valor desse score.
argumento, o lado da tela. Esse sinal é muito importante pois torna o acesso ao score
muito mais fácil. Qualquer cena ou node poderia saber facilmente
quando o score é atualizado sem realmente depender do jogo em isso será irrelevante para a performance, podemos utilizar a fonte
si. dinâmica mesmo.
Podemos então criar duas labels (um para cada player), mudar o
texto para zero (sem score) e posicionar sobre a tela. Como o
score será atualizado pelo singleton Score, é possível criar um
script na raíz da cena para poder conectar o sinal de atualização de
score.
Para atualizar o texto das labels, vamos criar dois sinais no
script: um para quando o score do player 1 for atualizado e outro
para o player 2. Deve-se emitir o sinal convertendo o valor do
score para string pois o node Label aceita somente string e não faz
conversão automática.
4 CONCLUSÃO
Após a conclusão do tutorial, teremos um pequeno jogo que,
apesar de simples, já possui várias funcionalidades importantes
que em outras engines e frameworks podem ser consideradas
muito mais difíceis de se implementar, como por exemplo,
animações e interface gráfica do usuário.
Este tutorial mostra por que e como a Godot Engine está se
tornando uma opção viável além das engines mais usadas
atualmente, como Unity3D e Unreal Engine. Mesmo que a versão
2.1 não tenha um suporte ostensivo para o desenvolvimento 3D,
ainda vemos vários usuários utilizando a Godot Engine para esse
fim, com o foco em dispositivos que possuem um hardware
considerado fraco, já que a versão 2.1 utiliza GLES2 (OpenGL
ES2) como driver de vídeo, que é acessível para vários tipos de
hardware.
O próximo lançamento da Godot Engine (versão 3) dará vários
passos a frente para melhorar o suporte 3D da engine,
implementando o driver GLES3 e vários outros recursos focados
no desenvolvimento de jogos 3D.
REFERÊNCIAS
[1] VERSCHELDE, Rémi. FIRST PUBLIC RELEASE. Disponível em
<https://godotengine.org/article/first-public-release>.
[2] VERSCHELDE, Rémi. GODOT HISTORY IN IMAGES.
Disponível em <https://godotengine.org/article/godot-history-
images>.
[3] LINIETSKY, Juan. MORE PROGRAMMING LANGUAGES IN
GODOT, WANT TO HELP. Disponível em
<https://godotengine.org/article/godot-getting-more-languages>.