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: отладка и лимиты.