Creating instances

Na parte anterior, nós vimos que uma cena é uma coleção de nós organizados em uma estrutura de árvore, com um único nó como sua raiz. Você pode dividir seu projeto em qualquer número de cenas. Essa funcionalidade ajuda você a dividir e organizar os diferentes componentes do seu jogo.

You can create as many scenes as you'd like and save them as files with the .tscn extension, which stands for "text scene". The Label.tscn file from the previous lesson was an example. We call those files "Packed Scenes" as they pack information about your scene's content.

Here's an example of a ball. It's composed of a RigidBody2D node as its root named Ball, which allows the ball to fall and bounce on walls, a Sprite node, and a CollisionShape2D.

../../_images/instancing_ball_scene.png

Once you saved a scene, it works as a blueprint: you can reproduce it in other scenes as many times as you'd like. Replicating an object from a template like this is called instancing.

../../_images/instancing_ball_instances_example.png

Como mencionámos na parte anterior, as cenas instanciadas se comportam como um nó: o editor esconde o seu conteúdo por padrão. Quando você instancia a Bola, você vê apénas o nó Bola. Note também que cada duplicata tem um nome único.

Cada instância da cena Ball começa com a mesma estrutura e propriedades que Ball.tscn. Porém, você pode modificar cada uma independentemente, tal como mudar como ela quica, o quão pesada ela é, ou qualquer propriedade exposta pela cena de origem.

In practice

Let's use instancing in practice to see how it works in Godot. We invite you to download the ball's sample project we prepared for you: instancing.zip.

Extraia o arquivo em seu computador. Depois, abra o Godot e no gerenciador de projects, clique no botão Importar para importar o projeto.

../../_images/instancing_import_button.png

No pop-up que apareceu, clique o botão explorar e navegue até a pasta que você extraiu.

../../_images/instancing_import_browse.png

Clique duas vezes no arquivo ``project.godot ` para abri-lo.

../../_images/instancing_import_project_file.png

Por fim, clique no botão Importar & Editar.

../../_images/instancing_import_and_edit_button.png

O projeto contém duas Cenas Empacotadas: Main.tscn, contendo paredes contra as quais a bola colide, e Ball.tscn. A cena principal deve abrir automaticamente.

../../_images/instancing_main_scene.png

Vamos adicionar uma bola como um filho do nó principal. Na doca de Cena, selecione o nó Principal. Depois, clique no ícone de ligação na parte superior da doca de cena. Este botão permite-lhe adicionar uma instância de uma cena como filho do nó atualmente selecionado.

../../_images/instancing_scene_link_button.png

Clique duas vezes na cena da bola para instancia-la.

../../_images/instancing_instance_child_window.png

The ball appears in the top-left corner of the viewport.

../../_images/instancing_ball_instanced.png

Clique nele e arraste-o para o centro da visualização.

../../_images/instancing_ball_moved.png

Aperte F5 para jogar o jogo. Você deve vê-la cair.

Agora, queremos criar mais instâncias do nó Bola. Com a bola ainda selecionada, aperte Ctrl-D (Cmd-D no macOS) para chamar o comando duplicar. Clicque e arraste para mover a nova bola para um local diferente.

../../_images/instancing_ball_duplicated.png

Você pode repetir esse processo até que você tenha vários na cena.

../../_images/instancing_main_scene_with_balls.png

Jogue o jogo novamente. Agora você deve ver cada bola cair independentemente de uma da outra. Isso é o que instâncias fazem. Cama uma é uma reprodução independente de uma cena modelo.

Editing scenes and instances

Instâncias possuem mais do que isso. Com essa funcionalidade, você pode:

  1. Change the properties of one ball without affecting the others using the Inspector.

  2. Change the default properties of every Ball by opening the Ball.tscn scene and making a change to the Ball node there. Upon saving, all instances of the Ball in the project will see their values update.

Nota

Mudar uma propriedade em uma instância sempre terá prioridade sobre os valores da Cena Empacotada correspondente.

Vamos testar isso. Abra ``Ball.tscn``e selecione o nó Ball. No Inspetor à direita, clique na propriedade PhysicsMaterial para expandi-la.

../../_images/instancing_physics_material_expand.png

Clique no campo número e digite ``2``e aperte Enter para definir a propriedade Bounce como 2.

../../_images/instancing_property_bounce_updated.png

Rode o jogo apertando :kbd:`F5`e perceba que as bolas agora quicam muito mais. Como a cena Ball é um modelo para todas as instâncias, modificar e salvá-la causa que todas as instâncias atualizem de acordo.

Agora vamos ajustar uma instância individual. Clique na aba correspondente acima da janela de exibição para voltar para a cena Main.

../../_images/instancing_scene_tabs.png

Selecione um dos nós Ball instanciados e, no Inspetor, mude sua Escala de Gravidade para 10.

../../_images/instancing_property_gravity_scale.png

A grey "revert" button appears next to the adjusted property.

../../_images/instancing_property_revert_icon.png

This icon indicates you are overriding a value from the source packed scene. Even if you modify the property in the original scene, the value override will be preserved in the instance. Clicking the revert icon will restore the property to the value in the saved scene.

Rode o jogo de novo e perceba que essa bola agora caí muito mais rápida que as outras.

Nota

Se você mudar um valor no PhysicsMaterial de uma instância, isso afetará todas as outras. Isso é porque PhysicsMaterial é um recurso, e recursos são compartilhados entre instâncias. Para fazer um recurso único para uma instância, clique nele com o botão direito no Inspetor e clique Tornar Único no menu contextual.

Recursos são outro bloco de construção essencial de jogos Godot que cobriremos em uma lição posterior.

Instâncias de Cenas como uma linguagem de design

Instâncias e cenas no Godot oferecem uma excelente linguagem de design, distinguindo a engine de outras. Concebemos o Godot em torno deste conceito desde o início.

Nós recomendamos ignorar padrões de código de arquitetura, tal como o Model-View-Control (MVC) ou diagramas Relação-Entidade, ao fazer jogos com Godot. Ao invés disso, você pode começar imaginando os elementos que jogadores verão em seu jogo e estruturar seu código ao redor deles.

For example, you could break down a shooter game like so:

../../_images/instancing_diagram_shooter.png

You can come up with a diagram like this for almost any type of game. Each rectangle represents an entity that's visible in the game from the player's perspective. The arrows tell you which scene owns which.

Once you have a diagram, we recommended creating a scene for each element listed in it to develop your game. You'll use instancing, either by code or directly in the editor, to build your tree of scenes.

Programmers tend to spend a lot of time designing abstract architectures and trying to fit components into it. Designing based on scenes makes development faster and more straightforward, allowing you to focus on the game logic itself. Because most game components map directly to a scene, using a design based on scene instantiation means you need little other architectural code.

Here's the example of a scene diagram for an open-world game with tons of assets and nested elements:

../../_images/instancing_diagram_open_world.png

Imagine que começamos criando a sala. Poderíamos fazer algumas cenas de salas diferentes, com arranjos únicos de móveis nelas. Mais tarde, poderíamos fazer uma cena de casa que usa várias instâncias de sala para o interior. Criaríamos uma cidadela com muitas casas instanciadas e um grande terreno no qual colocaríamos a cidadela. Cada uma delas seria uma cena instanciando uma ou mais sub-cenas.

Later, we could create scenes representing guards and add them to the citadel. They would be indirectly added to the overall game world.

With Godot, it's easy to iterate on your game like this, as all you need to do is create and instantiate more scenes. We designed the editor to be accessible to programmers, designers, and artists alike. A typical team development process can involve 2D or 3D artists, level designers, game designers, and animators, all working with the Godot editor.

Resumo

Instanciar, o processo de produzir um objeto a partir de um plano tem muitos usos úteis. Com cenas, ele lhe dá:

  • A capacidade de dividir seu jogo em componentes reutilizáveis.

  • Uma ferramenta para estruturar e encapsular sistemas complexos.

  • Uma linguagem para pensar sobre a estrutura do seu projeto de jogo de uma forma natural.