location-dotUI в мировом пространстве

Используйте UI в мировом пространстве, чтобы рисовать текст над головами игроков и любой другой текст, который должен ощущаться частью самого игрового мира.

Интерфейс в мировом пространстве рисуется во 2D-мире, а не на экране. Используйте его для табличек с именами, полосок здоровья, знаков и любого текста, который должен быть привязан к игровым объектам.

circle-info

Мировой интерфейс использует метры для размеров. Если вы будете использовать пиксельные размеры в стиле экрана, ваш интерфейс будет огромным.

Основные правила

  • Всегда вызывайте UI.push_world_draw_context() и defer UI.pop_draw_context().

  • Используйте метры для размеров и смещений прямоугольников.

  • Сдвигайте по Z для правильной сортировки по глубине (обычно используют pos.y).

  • Используйте subrect только для процентного заполнения (например, полосок здоровья).

Примеры

Отображение уровня игрока

draw_player_level :: proc(player: Player) {
    UI.push_world_draw_context();
    defer UI.pop_draw_context();

    pos := player.world_position;
    UI.push_z(pos.y);
    defer UI.pop_z();

    ts := UI.default_text_settings();
    ts.size = 0.30; // Размер текста в мировом пространстве
    ts.halign = .CENTER;
    ts.valign = .CENTER;

    text_pos := pos + v2{0, 1.7};
    rect := Rect{text_pos, text_pos}->grow(0.05, 0.4, 0.05, 0.4);
    UI.text(rect, ts, "Lvl %", {player.level});
}

Таблички у базы игрока

Полосы здоровья

Преобразование координат

Советы

  • Держите мировой интерфейс минимальным и читабельным на расстоянии. Если у вас есть масштабируемая камера, убедитесь, что вы корректируете размер текста при отдалении.

  • Используйте fit_aspect(texture->get_aspect()) если вы рисуете иконки в мировом пространстве.

  • Если текст мерцает или перекрывается, проверьте значения Z и интервалы.

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