Com esse documento você vai aprender a trabalhar com componentes globais dentro do Godot. Com eles é possível salvar dados e repassar esses valores para outras cenas, mesmo se ela for reiniciada por exemplo.

Criando Scripts Globais

Os scripts globais são fundamentais para que dados sejam salvos e repassados para outras cenas no Godot. Pense em um simples exemplo: O personagem principal de um jogo coletou na primeira fase algumas moedas, e com elas é possível comprar itens em uma outra fase. Então na fase atual em que o personagem se encontra deve ser salvo a quantidade de moedas que ele possui antes de mudar de fase, senão tudo será perdido.

Funcionamento de um script global.

Para criar um script global, podemos ir até a aba FileSystem e com o botão direito do mouse criar uma pasta para armazenar o script. Depois novamente com o botão direito dentro da pasta criada basta inserir um novo script. Apenas o renomeie para Script Global.

O Script Global deve ficar armazenado em uma pasta separada.

É importante informar que o Script Global não fica atrelado a nenhum node. Ele apenas existe no projeto como um arquivo separado dos demais, guardando as informações que forem necessárias. Mas depois de tê-lo criado, precisamos ativá-lo dentro do projeto. Para isso basta ir até o menu Project > Project Settings. Na janela que aparecer basta selecionar a guia AutoLoad.

Na opção Path selecionamos o script a ser utilizado como Global. Se quiser pode depois mudar o nome desse AutoLoad em Node Name, mas não é necessário. Clique apenas em ADD e pronto! O Script Global está ativado dentro do projeto.

Utilizando os Scripts Globais

Vamos por agora o Script Global para trabalhar. Nesse exemplo será construído um sistema de Hi-Score (Pontuação Máxima) que vai conter:

Antes precisamos inserir essas informações dentro do Script Global sendo cada uma como variável. Ele apenas receberá valores, ou seja, apenas variáveis serão adicionadas dentro dele. playerName recebe o nome do jogador; actualChampion recebe o recordista atual e o hiScore recebe a pontuação máxima obtida até o momento.

Agora precisamos acessar e modificar essas variáveis com um outro script. Nesse exemplo, dentro da cena do menu, vamos adicionar um script que recebe o nome do jogador e automaticamente o salva na variável global playerName quando o botão Play for pressionado. Lembre-se de criar o novo script no node raíz da cena ( Veja o Compendium - Criando Menus caso tenha dúvidas ):

Print da aba scene com o nome e o tipo do node utilizados para o menu.

Deve ser inserido o signal “pressed()” do botão dentro do script raíz.

No script raíz da cena deve ser chamado dentro da função pressed() além da mudança de cena a variável global para que seja salvo o texto inserido na caixa de edição. Basta identificar o nome do Script Global e por fim identificar o nome da variável que vai receber o valor:

Também é necessário fazer com que assim que a cena menu seja novamente aberta, o texto de Hi-Score seja atualizado com o nome e valor do score máximo atual. Podemos utilizar a função _ready() para realizar essa ação. Chamamos o node responsável pelo texto (Label) e depois seu atributo (text) para alterarmos. O str() é uma função que converte dados para string, ou seja, caracteres. Podemos concatenar com outras strings utilizando vírgula e aspas duplas.

Na cena do jogo, precisamos fazer apenas que a pontuação seja salva. Nesse exemplo o personagem coleta algumas moedas na fase e aumenta a sua pontuação. Antes é necessário que seja criado a cena da moeda:

Depois deve ser inserido no node raiz (Area2D) um script. Basta selecionar o node e clicar em Attach New Script:

Com o script criado, é importante passar o signal de colisão com o personagem. Para isso basta ir até a guia Node > Signals. Lá adicionamos o signal de body_entered ao código:

Agora dentro da função basta comparar se o corpo que colidiu pertence ao personagem. Podemos inserir um grupo a ele e utilizá-lo para esse fim indo até sua cena e depois em Node > Groups:

Perceba que aparece um ícone quando é adicionado um grupo ao node.

Já aproveitando que estamos na cena do personagem, vamos adicionar uma função no seu script que será chamada toda vez que o personagem colidir com a moeda. Essa função vai adicionar sempre  +1 em uma variável criada dentro do código responsável pela pontuação do jogo:

Criamos uma variável dentro do código do personagem, e depois criamos uma função que soma sempre +1 à variável criada.

Com esse grupo, no script da moeda, vamos criar a comparação se colidimos com o grupo do “Player”. Depois basta chamar a função que está dentro do personagem e destruir a moeda:

A função is_in_group() compara se o body (corpo) colidido pertence a um certo grupo. Já o queue_free() o destrói.

Depois adicione um node vazio para agrupar as moedas e adicioná-las na cena principal do jogo:

Um Node2D vazio é útil para agrupar vários objetos dentro dele.

Podemos ainda fazer com que algum node de texto mostre para o jogador na tela principal do jogo o placar. Basta criar um node CanvasLayer e Label e depois renomeá-los . Dessa forma aonde o personagem for instanciado, o placar o acompanha:

Cena do personagem com placar.

No script do personagem, basta atualizar o texto do placar toda vez que a moeda for coletada. Podemos fazer isso dentro da função updateScore() que foi criado anteriormente também:

 

Agora vem a parte final: programar para o jogador voltar ao menu principal e registrar o recorde caso ele tenha batido. Nesse exemplo foi criado um portal que faz o personagem voltar ao menu:

Também foi adicionado um script e um signal de body_entered a ele:

Dentro do script foi feito a mesma condição que a da moeda. A diferença é que dessa vez antes de mudar para o menu, deve ser comparado se a variável de pontos do personagem é maior que o recorde atual:

Como o  portal está dentro de um único node raíz, basta chamar apenas uma vez o get_parent().

Caso obedeça a condição, o novo valor é registrado na variável global hiScore e o nome do jogador atual dentro da variável global playerName é registrado na variável global actualChampion:

  Por último apenas mudamos de cena com a variável toGo e a função change_scene(). Mas ela fica fora da condição:

A cena deve ser instanciada na fase do jogo, e a variável toGo preenchida com o Path da cena que deve ser mudada.

Agora dessa maneira, enquanto o jogo estiver ativo, os recordes serão gravados no script global. Infelizmente dessa maneira não é salvo permanentemente as informações: assim que o projeto for fechado, os valores são zerados.

Utilizando Cenas Globais

Você viu acima que é possível utilizar scripts globais para salvar dados, mas também é possível utilizar cenas globais no Godot. Cenas globais servem para realizar a mesma tarefa de um script global, mas nesse caso ele consegue salvar nodes e transferi-los de cena a cena. Veja um exemplo: uma música tocada no menu tem que continuar a ser tocada na outra fase, mas sem reiniciá-la. Sem as cenas globais não é possível fazer isso.

Vamos recriar esse exemplo aqui. Primeiro deve ser criado no Godot uma cena onde apenas o node AudioStreamPlayer será adicionado. Nele vai ficar o áudio que deve ser tocado entre as cenas ( Veja o Compendium - Utilizando áudio no Godot para mais informações ):

Marcamos a opção “Autoplay” para a música ser tocada automaticamente.

Renomeie sempre os nodes e salve sua cena. Agora Podemos realizar o processo de inserir essa cena dentro do AutoLoad indo no menu Project > Project Settings. Depois selecionamos a aba AutoLoad:

Aqui agora apenas selecionamos qual a cena deve ser carregada na opção Path e depois clicamos em Add. A cena será adicionada ao AutoLoad do Godot:

Pronto! Agora a cena será sempre carregada e a música dentro do node será executada. Qualquer cena pode se tornar global e salvar dados presentes em nodes do Godot seguindo esse processo.