Reposicionar controles dentro de un CanvasLayer para distintas resoluciones

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By newold

EDIT - resuelto. Solución al final de este post

A ver si me podéis ayudar, porque llevo varios días dándole vueltas a esto y no consigo hacer nada. Primero os muestro esta imagen de de lo que me pasa y ahora explico.

Cómo se puede ver en la imagen en la resolución original (ventana de la derecha: 640 x 480) los botones de exit y map esán pegados a la derecha pero al cargar el juego por ejemplo en mi móvil, con una resolución de pantalla de 1980 x 1080, y usando los modos de estiramiento de pantalla 2D + Expandir o Viewport + Expandir, esos botones no salen correctamente donde deberían. Los botones están metidos en un canvaslayer.

os cuento lo que he estado haciendo hasta ahora:

  • Conseguir tamaño de la pantalla: _size = OS.window_size
  • Calcular porcentaje que la pantalla se ha expandido: _scale = _size / Vector2(640, 480)
  • Intentar ubicar los botones usando los valores calculados. Pero esto no funciona. Según mi lógica, para poner el botón en la derecha sería tan fácil como calcular el tamaño horizontal de la pantalla, restarle el tamaño horizontal del botón y ya estaría, pero no funciona si usas un canvasLayer (por ejemplo en la imagen, para posicionar el botón a la derecha en la resolución de 1980 x 1080 la fórmula me da unos 1600 píxeles pero eso ubica el botón fuera de la pantalla, ya que para que el botón no se salga por la derecha lo fui mirando con el inspector y me daba un máximo de 800 píxeles antes de que el botón empezara a salir por la derecha). Lo que si me ha funcionado para otro menú, siguiendo esta lógica, es crear el botón en una escena sin canvas layer, guardar esta escena, y por último añadirla por script como hijo de un canvas layer, entonces si funciona lo usado anteriormente para reposicionar los controles, pero si no el resultado es como las imágenes de la izquierda.

Así que, ¿alguna idea? ¿Es esto algún bug del canvas layer o del método de stretch del godot? me tiene loco este error. también decir que no estoy usando anchors ni nada de eso porque no se muy bien como funcionan (intenté poniendo los anchors de right, left o ambos a 1 pero no notaba ninguna diferencia, el resultado siempre era como en las imágenes de la izquierda)

EDIT: Encontré la diferencia con el menú que me funcionaba frente a este: El problema era que para calcular el tamaño de la pantalla usaba esto: OS.window_size pero necesitaba usar esto: get_viewport_rect().size Ya funciona bien. Vaya despiste que me ha tenido varios días bloqueado