Árvore de cena

Introdução

In previous tutorials, everything revolved around the concept of nodes. Scenes are collections of nodes. They become active once they enter the scene tree.

Loop principal

A maneira como Godot trabalha internamente é a seguinte. Existe a classe: ref: OS <class_OS>, que é a única instância que é executada no começo. Depois disso, todos os drivers, servidores, linguagens de script, sistema de cena, etc são carregados.

Quando a inicialização estiver completa,: ref: OS <class_OS> precisa ser fornecido a: ref: MainLoop <class_MainLoop> para ser executado. Até este ponto, tudo isso é funcionamento interno (você pode verificar o arquivo main / main.cpp no código-fonte, se você estiver interessado em ver como isso funciona internamente).

O programa do usuário, ou jogo, inicia no MainLoop. Essa classe tem alguns métodos, para inicialização, ocioso (retorno de chamada com sincronia de quadros), fixo (retorno de chamada com sincronização física) e entrada. Novamente, isso é de baixo nível e ao fazer jogos na Godot, escrever seu próprio MainLoop raramente faz sentido.

Árvore de cena

Uma das maneiras de explicar como Godot funciona é que é um mecanismo de jogo de alto nível sobre um middleware de baixo nível.

O sistema de cena é o mecanismo do jogo, enquanto o: ref: OS <class_OS> e os servidores são a API de baixo nível.

The scene system provides its own main loop to OS, SceneTree. This is automatically instanced and set when running a scene, no need to do any extra work.

É importante saber que essa classe existe porque tem alguns usos importantes:

  • Ele contém a raiz: ref: Viewport <class_Viewport>, para a qual uma cena é adicionada como uma criança quando é aberta pela primeira vez, para se tornar parte da * Scene Tree * (mais sobre isso a seguir)
  • Ele contém informações sobre os grupos e tem meios para chamar todos os nós de um grupo ou obter uma lista deles.
  • Ela contém alguma funcionalidade de estado global, como configurar o modo de pausa ou encerrar o processo.

When a node is part of the Scene Tree, the SceneTree singleton can be obtained by calling Node.get_tree().

Viewport raiz

A raiz: ref: `Viewport <class_Viewport> está sempre no topo da cena. De um nó, ele pode ser obtido de duas maneiras diferentes:

get_tree().get_root() # Access via scene main loop.
get_node("/root") # Access via absolute path.
GetTree().GetRoot(); // Access via scene main loop.
GetNode("/root"); // Access via absolute path.

This node contains the main viewport. Anything that is a child of a Viewport is drawn inside of it by default, so it makes sense that the top of all nodes is always a node of this type otherwise nothing would be seen.

Enquanto outras viewports podem ser criadas na cena (para efeitos de tela dividida e tal), esta é a única que nunca é criada pelo usuário. É criado automaticamente dentro do SceneTree.

Árvore de cena

Quando um nó é conectado, direta ou indiretamente, à viewport raiz, ele se torna parte da * árvore de cena *.

Isso significa que, como explicado nos tutoriais anteriores, ele obterá os retornos de chamada _enter_tree () e _ready () (assim como _exit_tree ()).

../../_images/activescene.png

When nodes enter the Scene Tree, they become active. They get access to everything they need to process, get input, display 2D and 3D visuals, receive and send notifications, play sounds, etc. When they are removed from the scene tree, they lose these abilities.

Ordem da árvore

Most node operations in Godot, such as drawing 2D, processing, or getting notifications are done in tree order. This means that parents and siblings with a lower rank in the tree order will get notified before the current node.

../../_images/toptobottom.png

“Tornando-se ativo” entrando na * Scene Tree *

  1. Uma cena é carregada do disco ou criada pelo script.
  2. O nó raiz dessa cena (apenas uma raiz, lembra?) É adicionado como um filho da viewport “root” (de SceneTree), ou para qualquer filho ou neto dela.
  3. Cada nó da cena recém-adicionada receberá a notificação “enter_tree” (callback _enter_tree () no GDScript) na ordem de cima para baixo.
  4. Uma notificação extra, “ready” (retorno de chamada _ready () no GDScript) é fornecida por conveniência, quando um nó e todos os seus filhos estão dentro da cena ativa.
  5. Quando uma cena (ou parte dela) é removida, eles recebem a notificação “exit scene” (retorno de chamada _exit_tree() na GDScript) na ordem de baixo para cima

Alterando a cena atual

Depois que uma cena é carregada, muitas vezes é desejado mudar essa cena para outra. A maneira simples de fazer isso é usar a função: ref: SceneTree.change_scene() <class_SceneTree_method_change_scene>:

func _my_level_was_completed():
    get_tree().change_scene("res://levels/level2.tscn")
public void _MyLevelWasCompleted()
{
    GetTree().ChangeScene("res://levels/level2.tscn");
}

Em vez de usar caminhos de arquivo, também é possível usar recursos prontos: ref: PackedScene <class_PackedScene> usando a função equivalente: ref: SceneTree.change_scene_to(PackedScene cena) <class_SceneTree_method_change_scene_to>:

var next_scene = preload("res://levels/level2.tscn")

func _my_level_was_completed():
    get_tree().change_scene_to(next_scene)
public void _MyLevelWasCompleted()
{
    var nextScene = (PackedScene)ResourceLoader.Load("res://levels/level2.tscn");
    GetTree().ChangeSceneTo(nextScene);
}

These are quick and useful ways to switch scenes but have the drawback that the game will stall until the new scene is loaded and running. At some point in the development of your game, it may be preferable to create proper loading screens with progress bar, animated indicators or thread (background) loading. This must be done manually using autoloads (see next chapter) and Background loading.