Criando seu primeiro script

Nesta lição, você irá programar seu primeiro script para fazer o ícone do Godot girar em círculos usando GDScript. Como nós mencionamos na introdução, assumimos que você tem os fundamentos de programação. O código em C# equivalente será incluído em outra aba para conveniência.

../../_images/scripting_first_script_rotating_godot.gif

Ver também

Para aprender mais sobre GDScript, suas palavras-chave, e sua sintaxe, veja as referências GDScript.

Ver também

Para aprender mais sobre C#, vá para a página Conceitos Básicos de C#.

Configuração do projeto

Crie um novo projeto para começar do zero. Seu projeto deve conter uma imagem: o ícone Godot, que costumamos usar para prototipagem na comunidade.

Nós precisamos criar um nó de Sprite para mostrá-lo no jogo. No painel de cena, clique em "Outro Nó".

../../_images/scripting_first_script_click_other_node.png

Digite "Sprite" na barra de pesquisa para filtrar os nós e clique duas vezes no Sprite para criar o nó.

../../_images/scripting_first_script_add_sprite_node.png

Sua aba de cena agora deve ter apenas um nó Sprite.

../../_images/scripting_first_script_scene_tree.png

Um nó Sprite precisa de uma textura para mostrá-la. No inspetor na direita, você pode ver que a propriedade Textura diz "[vazio]". Para mostrar o ícone do Godot, clique e arraste o arquivo icon.png do painel de Arquivos para o slot de Textura.

../../_images/scripting_first_script_setting_texture.png

Nota

Você pode criar nós Sprite automaticamente arrastando e soltando imagens no viewport.

../../_images/scripting_first_script_dragging_sprite.png

E então, clique e arraste o ícone no viewport para centralizá-lo na visualização do jogo.

../../_images/scripting_first_script_centering_sprite.png

Criando um novo script

Para criar e anexar um novo script para o nosso nó, clique com o botão direito no Sprite no painel de cena e selecione "Adicionar Script".

../../_images/scripting_first_script_attach_script.png

A janela Adicionar Script ao Nó será exibida. Permite selecionar a linguagem do script e o caminho do arquivo, entre outras opções.

Mude o modelo de Padrão para Vazio para começar com um arquivo vazio. Deixe as outras opções no padrão e clique em Criar para criar o script.

../../_images/scripting_first_script_attach_node_script.png

O espaço de trabalho do script deve aparecer com o seu novo arquivo Sprite.gd aberto com a seguinte linha de código:

extends Sprite

Todo arquivo GDScript é implicitamente uma classe. A palavra-chave extends``define qual classe este script herda ou estende. Neste caso, é o ``Sprite, significa que nosso script terá acesso a todas as propriedades e funções do nó Sprite, incluindo as classes que a estende, como Node2D, CanvasItem, e Node.

Nota

No GDScript, se você omitir a linha com a palavra-chave extends, sua classe vai implicitamente estender Reference, que o Godot usa para gerenciar a memória do seu aplicativo.

Propriedades herdadas inclui as que você pode ver no painel Inspetor, que nem o texture do nosso nó.

Nota

Por padrão, o Inspetor exibe as propriedades de um nó em "Title Case", com palavras em maiúsculas separadas por um espaço. No código GDScript, essas propriedades estão em "snake_case", que é minúscula com palavras separadas por sublinhado.

Você pode passar o mouse sobre o nome de qualquer propriedade no Inspetor para ver uma descrição e seu identificador no código.

Olá, mundo!

Nosso script por enquanto não está fazendo nada. Vamos fazê-lo imprimir o texto "Olá, mundo!" no painel de Saída em baixo para começarmos.

Adicione o seguinte código no seu script:

func _init():
    print("Hello, world!")

Vamos decompô-lo. A palavra-chave func define uma nova função chamada _init. Este é um nome especial para o construtor da nossa classe. A engine chama o _init() em cada objeto ou nó ao criá-lo na memória, se você definir esta função.

Nota

GDScript é uma linguagem baseada em recuo. A aba no início da linha que diz print() é necessária para que o código funcione. Se você omitir ou não recuar uma linha corretamente, o editor a destacará em vermelho e exibirá a seguinte mensagem de erro: "Esperado recuo do bloco".

Salve a cena se você não salvou ainda, e então pressione F6 (Cmd + R no macOS) para rodá-la. Olhe no painel Saída em baixo que pode ser expandido. Deve estar mostrando "Olá, mundo!".

../../_images/scripting_first_script_print_hello_world.png

Delete a função _init(), para que você tenha apenas a linha extends Sprite.

Adicionando movimento

Está na hora de fazer nosso nó se mover e girar. Para fazer isso, nós iremos adicionar duas variáveis para o nosso script: a velocidade de movimento em pixels por segundo, e a velocidade angular em radianos por segundo.

var speed = 400
var angular_speed = PI

As variáveis de definição ficam próximas ao topo do script, depois de qualquer linha "extends", mas antes das funções. Cada instância de nó com este script anexado a ela terá sua própria cópia das propriedades speed e angular_speed.

Nota

Os ângulos no Godot trabalham com radianos por padrão, mas há funções e propriedades embutidas disponíveis se você preferir calcular ângulos em graus ao invés de radianos.

Para mover nosso ícone, precisamos atualizar sua posição e rotação a cada quadro no loop do jogo. Podemos usar a função virtual _process() da classe Node. Se você definir em qualquer classe que estenda a classe Node, como Sprite, Godot chamará a função a cada quadro e passará a ela um argumento chamado delta, o tempo decorrido desde o último quadro.

Nota

Os jogos funcionam renderizando muitas imagens por segundo, cada uma chamada de quadro, e fazem isso em um loop. Medimos a taxa na qual um jogo produz imagens em quadros por segundo (FPS). A maioria dos jogos aponta para 60 FPS, embora você possa encontrar números como 30 FPS em dispositivos móveis mais lentos ou 90 a 240 para jogos de realidade virtual.

A engine e os desenvolvedores de jogos fazem seu melhor para atualizar o mundo do jogo e renderizar imagens em um intervalo de tempo constante, mas sempre terá pequenas variações no tempo de renderização de frames. É por isso que a engine nos oferece o valor de tempo delta, fazendo com que o movimento ocorra independente da taxa de quadros.

No fim do script, defina a função:

func _process(delta):
    rotation += angular_speed * delta

A palavra-chave func define uma nova função. Depois disso, devemos escrever o nome da função e os argumentos que ela recebe entre parênteses. Dois pontos terminam a definição e os blocos recuados que seguem são o conteúdo ou as instruções da função.

Nota

Observe como _process() e _init(), começam com um sublinhado à esquerda. Por convenção, as funções virtuais do Godot, ou seja, funções integradas que você pode substituir para se comunicar com a engine, começam com um sublinhado.

A linha dentro da função, rotation += angular_speed * delta, incrementa a rotação do nosso sprite a cada frame. Aqui, rotation é uma propriedade herdada da classe Node2D, onde Sprite estende. Isso controla a rotação do nosso nó e trabalha com radianos.

Dica

No editor de código, você pode clicar com botão esquerdo enquanto segura Ctrl em qualquer propriedade ou função embutida, como position, rotation, ou _process para abrir a correspondente documentação em uma nova aba.

Execute a cena para ver o ícone Godot girar.

../../_images/scripting_first_script_godot_turning_in_place.gif

Adicionando movimento

Agora vamos fazer o nó se deslocar. Adicione estas duas linhas de código na função _process(), garantindo que as novas linhas são espaçadas da mesma forma que as linhas anteriores.

var velocity = Vector2.UP.rotated(rotation) * speed

position += velocity * delta

Como já vimos, a palavra-chave var define uma nova variável. Se você colocá-lo no início do script, ela define uma propriedade da classe. Dentro de uma função, define uma variável local: ela só existe dentro do escopo da função.

Definimos uma variável local chamada velocity, um vetor 2D representando uma direção e uma velocidade. Para fazer o nó se mover, partimos da constante Vector2.UP da classe Vector2, um vetor apontando para cima, e o giramos chamando o método Vector2.rotated(). Esta expressão, Vector2.UP.rotated(rotation), é um vetor apontando para frente em relação ao nosso ícone. Multiplicado por nossa propriedade velocidade, nos dá uma velocidade que podemos usar para mover o nó para frente.

Adicionamos velocity * delta à posição do nó para movê-lo. A própria posição é do tipo Vector2, um tipo embutido em Godot representando um vetor 2D.

Execute a cena para ver a cabeça do Godot se mover em círculos.

../../_images/scripting_first_script_rotating_godot.gif

Nota

Mover um nó assim não leva em consideração a colisão com paredes ou o chão. Em Seu primeiro jogo 2D, você aprenderá outra abordagem para mover objetos enquanto detecta colisões.

Nosso nó atualmente se move sozinho. Na próxima parte Capturando os controles de entrada do jogador, usaremos a entrada do jogador para controlá-lo.

Script completo

Aqui está o arquivo Sprite.gd completo, para referência.

extends Sprite

var speed = 400
var angular_speed = PI


func _process(delta):
    rotation += angular_speed * delta

    var velocity = Vector2.UP.rotated(rotation) * speed

    position += velocity * delta