For the complete documentation index, see llms.txt. This page is also available as Markdown.

Справочник по UI

Справочные заметки и шаблоны для отрисовки UI в CSL.

На этой странице собраны правила, шаблоны и примеры UI, которые полезны, когда вы уже знаете основы.

Прочтите Основы UI сначала.

Основные принципы

  1. Y растёт вверх. Координаты экрана используют (0, 0) в левом нижнем углу.

  2. Начинайте с прямоугольников экрана. Используйте UI.get_safe_screen_rect() или UI.get_screen_rect(), а затем выводите всё остальное из этих прямоугольников.

  3. Паттерн push/pop. Используйте defer для каждого push, чтобы не допустить утечки состояния UI.

  4. Mobile-first. Избегайте взаимодействий только по наведению.

  5. Текст использует UTF-8, но покрытие символов неполное. Для символа всё ещё нужен глиф в выбранном шрифте или в его резервных шрифтах. Некоторые символы, включая эмодзи, пока не поддерживаются.

  6. Используйте стек позднего обновления игрока. Рисуйте весь UI игрока из ao_late_update этого игрока в is_local_or_server().

Быстрый старт: простая кнопка HUD

Player :: class : Player_Base {
    ao_late_update :: method(dt: float) {
        if this.is_local_or_server() {
            draw_my_hud(this);
        }
    }
}

draw_my_hud :: proc(player: Player) {
    rect := UI.get_safe_screen_rect()
        .bottom_right_rect()
        .grow(40, 150, 40, 150)
        .offset(-50, 50);

    bs := UI.default_button_settings();
    ts := UI.default_text_settings();

    if UI.button(rect, bs, ts, "Action").clicked {
        log_info("action from %", {player.get_username()});
    }
}

Базовое рисование

Квадраты и изображения

Текст

Макет: начинайте с rect'ов

Используйте cut для макета

Функции cut должны использоваться для построения макета при размещении нескольких элементов UI:

Автомасштабирование и не масштабируемые rect'ы

Обычные функции rect принимают точки и масштабируют их с помощью UI.get_current_scale_factor() (на основе эталонного холста высотой 1080 пунктов).

Используйте _unscaled варианты только тогда, когда значение уже выражено в фактических пикселях экрана, например размер, измеренный по существующему rect:

Кнопки

Правила спрайта кнопки

UI.default_button_settings() уже предоставляет полный стиль кнопки. Для пользовательской кнопки задайте sprite и при необходимости sprite_hovered и sprite_pressed. Когда необязательные спрайты равны null, базовый спрайт используется повторно.

Модальные окна

Используйте UI.begin_modal / UI.end_modal для затемнённого фона, который закрывается, когда игрок нажимает вне модального окна или нажимает Escape.

Управление состоянием UI

Используйте defer для каждой пары push/pop:

ID для повторяющихся элементов

При рисовании списков или повторяющихся элементов задавайте уникальные ID:

Распространённые размеры

Некоторые размеры, которые хорошо выглядят на разных устройствах:

  • Точки текста на экране: Заголовок 52, Основной текст 36

  • Точки rect экрана: Простой диалог 600x400, Стандартная кнопка 210x74, Кнопка выхода 65x65

  • Размер текста в мировом пространстве: 0.30 метра

Лучшие практики

  • Используйте defer для каждой пары push/pop.

  • Задавайте ID для повторяющихся элементов.

  • Используйте не масштабированные функции с вычисленными размерами.

  • Подгоняйте соотношение сторон иконок с помощью rect.fit_aspect(texture.get_aspect()).

  • Всегда проверяйте is_local_or_server() перед рисованием интерактивного UI.

Последнее обновление