Управление центром программно

#javascript #godot

#javascript #годо

Вопрос:

Есть ли удобный способ центрировать узел или, точнее, текстурный объект на экране? Обратите внимание, что в моем случае мое окно отображения настроено на растягивание в 2D-аспекте «сохранить».

Очевидно, что позиция может быть рассчитана по формуле:

 x = WindowWidth / 2   TextureWidth / 2
y = WindowHeight / 2   TextureHeight / 2
 

Но я не нашел, как получить исходный размер окна проекта Godot. Я получаю ширину экрана this.get_tree().root.size.x , и она варьируется в зависимости от того, как изменяется размер окна. Например, ширина моего проекта равна 1024, и я бы не хотел выражать эту ширину в своем коде. Возможно ли это?

Движок Godot, похоже, также имеет понятие привязки и центрирования при использовании его визуального редактора, поэтому я подозреваю, что есть способ центрирования узла без ручного вычисления.

Обновить

В ответе @Theraot показан метод позиционирования узла в центр на основе предустановки, но он позиционирует узел в другом месте, а не в центре:

(Примечание «состояние» означает «сцена»)

 import State from '../State.jsx';
import RecoyxLogo from 'res://img/company-logo/recoyx.png';

export default class PresentsState extends State {
    constructor() {
        super();
    }

    async _ready() {
        await godot.yield(this.get_tree(), 'idle_frame');
        let recoyxLogo = new godot.TextureRect;
        recoyxLogo.texture = RecoyxLogo;
        recoyxLogo.expand = true;
        recoyxLogo.rect_size = new godot.Vector2(1200 / 2, 600 / 2);
        // recoyxLogo.rect_position = new godot.Vector2(this.get_tree().root.size.x / 2   (1200 / 2 / 2), this.get_tree().root.size.y / 2   (600 / 2) / 2);
        recoyxLogo.set_anchors_and_margins_preset(godot.Control.PRESET_CENTER);
        this.add_child(recoyxLogo);
    }

    _process(delta) {
    }
}

 

Вот State.jsx :

 export default class State extends godot.Node2D {
    constructor() {
        super();
        // this.scale = new godot.Vector2(0.47, 0.47);
    }
}
 

Ответ №1:

Вы можете изменить размер вашего элемента управления из кода, установив его rect_size и rect_position .

И вы можете сделать это в методе, подключенном к "resized" сигналу корня дерева сцены (корнем сцены является a Viewport , и, как и следовало ожидать, он выдает "resized" каждый раз, когда изменяется его размер).

В соответствии с исходным размером окна, вы можете прочитать его из настроек проекта, вызвав ProjectSettings.get_setting передачу пути к свойству в качестве параметра. Свойствами для размера окна являются "display/window/size/width" и "display/window/size/height" (вы можете выяснить это, посмотрев в окне настроек проекта или в документации для ProjectSettings ).

И да, вы можете устанавливать поля (с помощью метода set_margin ) и привязки (с помощью метода set_anchor ) из кода, а также использовать предварительные настройки (с помощью методов set_margins_preset , set_anchors_preset , и set_anchors_and_margins_preset — этот последний метод является удобным способом установки обоих одновременно). Настройка пресета Control.PRESET_CENTER должна выполняться.

Комментарии:

1. Интересно, я пытаюсь установить привязки / поля, заданные для центра узла, но это помещает узел далеко от центра. Я не масштабировал ни один из родительских узлов. Мой узел, который должен быть центрирован, имеет только один родительский узел; Я попытался масштабировать корневой узел, чтобы он был меньше 1, но он продолжается далеко от места назначения. Есть идеи о том, что происходит?

2. @Klaider Установлен ли родительский узел для заполнения экрана? Я думаю, что он центрируется на родительском узле, но родительский узел не центрирован.

3. Я раскрыл свой корневой узел в вопросе, который является сценой (или тем, что называется «состоянием»), кажется, нет способа указать ему заполнить экран, согласно документам API ( Node2D ).

4. @Klaider я вижу. Да, это проблема. Node2D У него нет размера, который Годо использует для центрирования вещей внутри. Control Работает ли это для вас? В противном случае вам придется использовать центр set_global_position .

5. Я попытался наследовать состояние godot.Control , а затем godot.TextureRect (установив rect_size в соответствии с разрешением экрана проекта), оба потерпели неудачу: (