Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Camadas de canvas

Janela de Exibição e itens de Canvas

CanvasItem é a base para todos os nós 2D, seja nós 2D regulares, como Node2D, ou Control. Ambos herdam de CanvasItem. Você pode organizar canvas items em árvores. Cada item vai herdar a transformação de seus pais : Quando um pai se move, seus filhos se movem também.

Os nós CanvasItem, e os nós que herdam deles, são filhos diretos ou indiretos de um Viewport, que os exibe.

A propriedade Viewport.canvas_transform do Viewport permite aplicar uma transformação personalizada Transform2D à hierarquia de CanvasItems que ele contém. Nós como Camera2D funcionam alterando essa transformação.

Para obter efeitos como rolagem, manipular a propriedade de transformação da tela é mais eficiente do que mover o item de lona raiz e toda a cena com ela.

Normalmente, porém, não queremos que tudo no jogo ou aplicativo estejam sujeitos à transformação de canvas. Exemplos disso são:

  • Planos de fundo Paralax: planos de fundo que se movem mais lentamente do que o resto do estágio.

  • UI: Pense em uma Interface de Usuário (UI) ou uma head-up display (HUD) sobreposta à nossa visão do mundo do jogo. Queremos um contador de vida, uma exibição de pontuação e outros elementos para manter suas posições na tela mesmo quando nossa visão do mundo do jogo está mudando.

  • Transições: Podemos desejar que os efeitos visuais usados para as transições (fades, misturas) permaneçam em um local fixo na tela.

Como resolver esses problemas em uma única árvore de cena?

CanvasLayers

A resposta é CanvasLayer, que é um nó que adiciona uma camada de renderização 2D separada para todos os seus filhos e netos. Filhos da janela de visualização desenharão por padrão na camada "0", enquanto um CanvasLayer desenhará em qualquer camada numérica. Camadas com um número maior serão desenhadas acima daquelas com um número menor. CanvasLayers também têm sua própria transformação e não dependem da transformação de outras camadas. Isso permite que a UI seja fixada no espaço da tela enquanto nossa visão do mundo do jogo muda.

Um exemplo disso é a criação de um fundo de paralax. Isso pode ser feito com um CanvasLayer na camada "-1". A tela com os pontos, contador de vida e botão de pausa também pode ser criada na camada "1".

Aqui está um diagrama de como ele se parece:

../../_images/canvaslayers.png

CanvasLayers são independentes da ordem da árvore e dependem apenas do número da camada, portanto, podem ser instanciados quando necessário.

Nota

As CanvasLayers não são necessárias para controlar a ordem de desenho dos nós. A maneira padrão de garantir que um nó seja desenhado corretamente 'na frente' ou 'atrás' dos outros é manipular a ordem dos nós no painel de cena. Talvez de forma contraintuitiva, os nós mais acima no painel de cena são desenhados atrás dos que estão mais abaixo na janela de exibição (viewport). Os nós 2D também possuem a propriedade CanvasItem.z_index para controlar sua ordem de desenho.