kerbal.ruвики сборки «Оператор»
Оператор / Вики / Автоматика

kOS: интерфейс, графика и HUD

Что kOS умеет рисовать: полноценные окна с кнопками и слайдерами, стрелки-векторы прямо в полётном виде, надписи на HUD, подсветка деталей и форматирование терминала.

kOS — не только текстовый терминал. Начиная с версии 1.1 в нём есть полноценная система виджетов: окна, кнопки, слайдеры, выпадающие меню. Плюс отдельно — рисование векторов в 3D, надписи на HUD и подсветка деталей.

В сборке стоит kOS 1.6.0.1, всё описанное ниже доступно.

Окна и виджеты

Окно создаётся функцией GUI(ширина[, высота]) и само является контейнером — «коробкой», в которую добавляются виджеты.

SET win TO GUI(220).
SET win:X TO 80.            // отрицательное значение — отсчёт от правого края
SET win:Y TO 120.
win:ADDLABEL("Дальняк-1 · пульт").

SET bStart TO win:ADDBUTTON("Старт подъёма").
SET chkRCS TO win:ADDCHECKBOX("РСУ", FALSE).
SET sAlt TO win:ADDHSLIDER(80, 70, 250).   // начальное, мин, макс

win:SHOW().

Полный набор того, что можно положить в коробку:

Метод Что создаёт
ADDLABEL(текст) надпись
ADDBUTTON(текст) кнопка, отжимается сама
ADDCHECKBOX(текст, вкл) переключатель, залипает
ADDRADIOBUTTON(текст, вкл) группа, где включён только один
ADDTEXTFIELD(текст) редактируемое поле
ADDPOPUPMENU выпадающее меню
ADDHSLIDER(нач, мин, макс) горизонтальный слайдер
ADDVSLIDER(нач, мин, макс) вертикальный слайдер
ADDHLAYOUT / ADDVLAYOUT невидимая коробка для раскладки
ADDHBOX / ADDVBOX видимая коробка с рамкой
ADDSTACK стопка, показывается одна страница за раз
ADDSCROLLBOX прокручиваемая область
ADDSPACING(размер) пустое место, -1 — резиновое

Свойства самого окна: X, Y, DRAGGABLE (можно ли таскать мышкой), SKIN, TOOLTIP, методы SHOW и HIDE. Убрать всё разом — CLEARGUIS().

Два способа читать нажатия

Опрос. Проверяешь состояние в своём цикле. Работает у кнопок через TAKEPRESS — чтение возвращает «была ли нажата» и одновременно отпускает её:

UNTIL done {
  IF bStart:TAKEPRESS { PRINT "поехали". }
  IF chkRCS:PRESSED { RCS ON. } ELSE { RCS OFF. }
  WAIT 0.1.
}

Обратный вызов. Вешаешь функцию, kOS зовёт её сам:

FUNCTION onStart { PRINT "кнопка нажата". }
SET bStart:ONCLICK TO onStart@.
SET chkRCS:ONTOGGLE TO { PARAMETER on. rcsAssist(on). }.

Символ @ после имени — это ссылка на функцию, а не её вызов. У переключателей callback получает новое состояние параметром.

Стрелки в полётном виде

VECDRAW рисует настоящий вектор в 3D — прямо поверх корабля, с подписью:

SET arrow TO VECDRAW(
    V(0,0,0),                    // начало, от центра масс
    SHIP:VELOCITY:SURFACE,       // сам вектор
    RGB(1,0,0),                  // цвет
    "скорость",                  // подпись
    1.0,                         // масштаб
    TRUE,                        // показывать
    0.2,                         // толщина
    TRUE,                        // со стрелкой на конце
    TRUE).                       // «стирать» хвост

SET arrow:VEC TO SHIP:VELOCITY:SURFACE.   // обновлять каждый тик
SET arrow:SHOW TO FALSE.                  // спрятать

Это лучший инструмент отладки рулевых законов: рисуешь рядом вектор скорости и вектор команды — и видишь глазами, куда скрипт целится и насколько расходится с потоком. То, что мы полполёта вычисляли по логам, видно сразу.

Сбросить все стрелки — CLEARVECDRAWS().

HUD и подсветка

HUDTEXT("апоцентр набран", 5, 2, 24, GREEN, FALSE).

Аргументы: текст, сколько секунд висит, положение на экране, размер шрифта, цвет, «эхо в терминал».

SET hl TO HIGHLIGHT(SHIP:PARTSNAMED("kOSMachine1m")[0], GREEN).

Подсвечивает деталь цветом — удобно показывать, какой прибор сейчас работает.

Терминал

Никуда не делся и остаётся самым дешёвым по ресурсам способом:

PRINT "Ap: " + ROUND(SHIP:APOAPSIS/1000,1) + " км    " AT (0,3).

Печать в фиксированную позицию не прокручивает экран. Хвост из пробелов обязателен — строка перезаписывается, а не стирается, и остатки прошлого длинного значения повиснут. Размер окна — TERMINAL:WIDTH и TERMINAL:HEIGHT.

Важное ограничение

Виджеты нельзя трогать через telnet. Это прямо сказано в документации kOS: GUI живёт в окне игры и требует мыши. Если управляешь кораблём снаружи (kOS по telnet: пульт снаружи игры) — интерфейсом будет терминал, а не окна.

Отсюда практический вывод: не делай GUI единственным способом управления скриптом. Параметры лучше держать переменными в начале файла, а окно — как удобную надстройку.

Что чего стоит

Средство Нагрузка Когда брать
PRINT AT копеечная всегда, база
HUDTEXT копеечная разовые события: ступень, выход на орбиту
VECDRAW небольшая отладка ориентации и рулевых законов
GUI-виджеты заметная пульт для ручных операций, не для полёта
HIGHLIGHT небольшая показать деталь

Помни про лимит инструкций: CONFIG:IPU по умолчанию 200, и тяжёлый интерфейс отъедает такты у самого управления. Разбор — в kOS: отладка и лимиты.

Связанные статьи