Transformações de janela de exibição e tela¶
Introdução¶
Esta é uma visão geral das transformações 2D que ocorrem para os nós desde o momento em que eles desenham seu conteúdo localmente até o momento em que são desenhados na tela. Esta visão geral discute detalhes de nível muito baixo do mecanismo.
Transformação de tela¶
Como mencionado no tutorial anterior, Camadas de canvas, cada nó CanvasItem (lembre-se que os nós baseados em Node2D e Control usam CanvasItem como sua raiz comum) residirão em uma Canvas Layer. Cada camada de canvas tem uma transformação (translação, rotação, escala, etc.) que pode ser acessada como Transform2D.
Também abordado no tutorial anterior, os nós são desenhados por padrão na Camada 0, na tela embutida. Para colocar nós em uma camada diferente, um nó CanvasLayer pode ser usado.
Transformação global de canvas¶
Viewports também possuem uma transformação Global Canvas (também uma Transform2D). Esta é a transformação principal e afeta todas as transformações individuais de Canvas Layer. Geralmente, essa transformação não é muito útil, mas é usada no CanvasItem Editor no editor do Godot.
Transformação de alongamento¶
Finalmente, as viewports possuem uma Stretch Transform, que é usada ao redimensionar ou esticar a tela. Esta transformação é usada internamente (conforme descrito em Resoluções múltiplas), mas também pode ser configurada manualmente em cada viewport.
Os eventos de entrada recebidos na chamada de retorno MainLoop._input_event() são multiplicados por esta transformação, mas faltam os anteriores. Para converter as coordenadas InputEvent em coordenadas CanvasItem locais, a função CanvasItem.make_input_local() foi adicionada por conveniência.
Ordem de transformação¶
Para que uma coordenada nas propriedades locais do CanvasItem se torne uma coordenada de tela real, a seguinte cadeia de transformações deve ser aplicada:
Funções de transformação¶
Cada transformação pode ser obtida com as seguintes funções:
Tipo |
Transformar |
---|---|
CanvasItem |
|
CanvasLayer |
|
CanvasLayer+GlobalCanvas+Stretch |
Finalmente, para converter as coordenadas locais de um CanvasItem em coordenadas de tela, basta multiplicar na seguinte ordem:
var screen_coord = get_viewport_transform() * (get_global_transform() * local_pos)
var screenCord = (GetViewportTransform() * GetGlobalTransform()).Xform(localPos);
Tenha em mente, no entanto, que geralmente não é desejável trabalhar com coordenadas de tela. A abordagem recomendada é simplesmente trabalhar nas coordenadas do Canvas (CanvasItem.get_global_transform()
), para permitir que o redimensionamento automático da resolução da tela funcione corretamente.
Alimentando eventos de entrada personalizados¶
Muitas vezes, é desejado alimentar eventos de entrada personalizados para a árvore de cena. Com o conhecimento acima, para fazer isso corretamente, deve ser feito da seguinte maneira:
var local_pos = Vector2(10, 20) # local to Control/Node2D
var ie = InputEventMouseButton.new()
ie.button_index = BUTTON_LEFT
ie.position = get_viewport_transform() * (get_global_transform() * local_pos)
get_tree().input_event(ie)
var localPos = new Vector2(10,20); // local to Control/Node2D
var ie = new InputEventMouseButton();
ie.ButtonIndex = (int)ButtonList.Left;
ie.Position = (GetViewportTransform() * GetGlobalTransform()).Xform(localPos);
GetTree().InputEvent(ie);