#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 в соответствии с разрешением экрана проекта), оба потерпели неудачу: (