Перейти к содержимому






Фотография
* * * * * 3 голосов

Advanced Term [OpenOS 1.6]

Написано Fingercomp , в OpenComputers, Tutorials 12 Декабрь 2016 · 227 просмотров

Тут полгода назад я описывал изменения в OpenOS 1.6 и среди прочего я упомянул какие-то окна в либе term. Пришло время описать всю либу term.

 

Прежде всего, рассмотрим понятие окна. Окно — это таблица типа такой:

 

{x = 1,
 y = 1,
 fullscreen = true,
 dx = 0,
 dy = 0,
 w = 0,
 h = 0,
 blink = true}
По порядку.
  • x, y — это позиция курсора. Ну тут всё предельно ясно.
  • fullscreen — тоже достаточно очевидно. Находится ли окно в фулл-скрине или нет.
  • dx, dy — это смещение окна отновительно левого верхнего края видеокарты.
  • w, h — это всё ширина и высота окна.
  • blink — опция, с помощью которой можно отрубить (и потом вернуть) мерцание курсора.
Ещё одно понятие, которое нужно обязательно ввести, — это viewport (далее обзывать буду это как вьюпорт). Переводится как "окно просмотра", применительно к нашему контексту это слово означает пространство, в котором можно рисовать всякие символы.

 

Вот есть монитор из OC. Какой у него вьюпорт? Вроде как очевидно, прямоугольник от левого верхнего символа с шириной и высотой, равный разрешению. Говоря проще, это то, что вы видите в интерфейсе монитора, когда по нему кликнете.

 

Это было так до версии 1.6. В новой версии появилась функция setViewport, которая позволяет уменьшить видимую часть экрана, оставляя разрешение прежним.
То есть, если вы на мониторе 3 уровня пропишете gpu.setViewport(80, 25), то всё, что было в пределах прямоугольника шириной в 80 и высотой в 25 символов, останется видимым. Остальное пропадёт. А для вас это будет выглядеть, будто просто сменили разрешение.
Но при этом вы можете продолжать использовать оставшуюся, невидимую часть экрана. Сетить символы, рисовать квадраты. Как прежде. Только вот юзеры это не увидят.
А потом можно будет скопировать область из невидимой части в видимую, чтобы показать готовую картинку.

 

Вернёмся к либе term. Вот то самое "окно", о котором я говорил чуть ранее, — это же и есть самый что ни на есть вьюпорт. Поэтому, когда в либе будут функции с умонинанием window или viewport, нужно понимать, что речь там идёт именно про окно, описанное нами ранее.

 

Итак, это всё была теория. Теперь будем, наконец, изучать функции либы term.

 

Первая функция, которую изучим, — это term.internal.open([dx: number[, dy: number[, w: number[, h: number]]]]). Принимает 4, как видно, аргумента, которыми можно задать параметры окна. По умолчанию равны 0.
Возвращает простую таблицу с установленными параметрами. Её я указывал выше. Ничего особенного.

 

Этому окну следует присвоить gpu с прокси видеокарты для данного окна и keyboard с адресом клавиатуры для данного окна, опять же.
Можно просто вызвать term.keyboard(window) — тогда автоматически выберется главный компонент.
А ещё нужно к выбранной видеокарте прицепить нужный монитор.

 

Как-то так:

 

local com = require("component")
local term = require("term")

local screenAddr = "7d0180fd-541c-dacc-579f-683a3a3e2b67"
local gpu = com.proxy("58fa8c35-60f9-d49a-5e14-4a57f3769463")

local window = term.internal.open()
window.gpu = gpu
gpu.bind(screenAddr)
term.keyboard(window)
Есть функция term.setViewport([w: number[, h: number[, dx: number[, dy: number[, x: number[, y: number[, window: table]]]]]]]). Если последним аргументом передать наше окно инициализированное, то значения для остальных аргументов подберутся автоматически, используя параметры видеокарты окна. Этой командой мы завершаем подготовку окна для работы.

 

Но есть вариант попроще. term.bind([gpu: table[, window: table]]) — привязывает видеокарту к окну и вызывает функцию выше для установки стандартных значений. Очень удобно.

 

Вот итоговый код:

 

local com = require("component")
local term = require("term")

local screenAddr = "7d0180fd-541c-dacc-579f-683a3a3e2b67"
local gpu = com.proxy("58fa8c35-60f9-d49a-5e14-4a57f3769463")

local window = term.internal.open()
gpu.bind(screenAddr)
term.bind(gpu, window)
term.keyboard(window)
Давайте теперь использовать это окно во всю мощь. Чтобы потом не отвлекаться, сначала перечислю список скучных функций.
  • term.gpu([window: table]) — возвращает прокси видеокарты для данного окна.
  • term.isAvailable([window: table]) — говорит, готово ли окно к работе.
  • term.keyboard([window: table]) — возвращает адрес клавиатуры для данного окна.
  • term.screen([window: table]) — возвращает адрес монитора для данного окна.
  • term.getGlobalArea([window: table]) — возвращает значения dx + 1, dy + 1, w и h для данного окна.
  • term.getViewport([window: table]) — возвращает значения w, h, dx, dy, x, y для данного окна.
А теперь настало время кое-чего поинтереснее. Например, term.drawText(text: string[, wrap: boolean[, window: table]]). Рисует текст, как io.write, но, во-первых, позволяет задать вторым аргументом true, а тогда текст будет переноситься на новую строку, если он длиннее ширины окна; во-вторых, можно задать окно для рисования — и писать текст, например, на другом мониторе, имея в распоряжении при этом обработку \t, \n.

 

А ещё есть term.scroll(n: number[, window: table]). Он копирует область внутри окна и вставляет её — ниже на n строк, если n > 0, или выше на -n строк, если n < 0. Остальное очищается.

 

Можно очистить строку, на которой находится в данный момент курсор, с помощью term.clearLine([window: table]). К слову, в прошлой версии первым аргументом был номер строки, которую нужно очистить. Теперь этого нет.

 

Как видно, во всех функциях аргумент window опционален. Если его не указывать, возьмётся стандартное окно, которое используется системой. Ничего особенного.

 

Собственно, это всё по окнам. В функциях, которые я перечислю ниже, нет возможности, к сожалению, указать окно аргументом — будет использоваться стандартное. Вот эти функции:

  • term.read([options: table]) — функция, с помощью которой можно получить значение от пользователя. Создаёт строку ввода, её обрабатывает и возвращает результат. Можно передать таблицу с опциями:
    • dobreak — если равен false, то после нажатия Enter курсор не переместится на новую строку.
    • hintHandler — функция (принимает текущее значение поля ввода и номер подсказки, переключаемый Tab/Shift-Tab, и возвращает строку с подсказкой) или таблица с подсказками, которые будут предлагаться юзеру по нажатию Tab (или Shift-Tab для возврата назад).
    • pwchar ­— символ, который будет показываться вместо введённых пользователем. Этим можно воспользоваться, чтобы, например, писать пароль.
    • filter — функция, которая принимает значение поля ввода и возвращает true при валидном вводе и false при невалидном, или строка с паттерном Lua, с помощью которых будет проверяться валидность введённых данных. Например, можно разрешить вводить только цифры. Если попытаться ввести невалидные данные, то комьютер радостно пропищит.
    • nowrap — если не задан или равен false, то при достижении конца строки, последующие символы переходят на следующую строку. Иначе будет вести себя, как в версиях до 1.6 — скроллить горизонтально.
    • И, наконец, под числовыми индексами ([1], [2], [3], ...) история ввода — строки, между которыми можно переключаться с помощью стрелочек вверх и вниз.
  • term.clear() — вообще 0 идей, с чего вдруг здесь нельзя задавать окно, но тем не менее. Очищает экран.
  • term.pull() — ожидает ивентов, рисуя мерцающий курсор.
  • term.write(value: string[, wrap: boolean]) — то же, что и io.write.
  • term.getCursor() — возвращает позицию курсора.
  • term.setCursor(x: number, y: number) — устанавливает позицию курсора.
  • term.setCursorBlink(enabled: boolean) — включает/выключает мерцание курсора.
  • term.getCursorBlink() — проверяет, включено ли мерцание курсора.
И вот здесь я предлагаю закончить, наконец, этот туториал. Я описал все функции публичного API этой интересной либы, которая пополнилась очень забавными и прикольными фичами. Теперь думайте сами, что будете делать со всем этим добром :P






Ннифигассе~

Замечательно! Все подробно и понятно. Продолжай в том-же духе писать гайды.

Зачатки сиего уже давно в системе замечал, и наконецто)


Обратные ссылки на эту запись [ URL обратной ссылки ]

Обратных ссылок на эту запись нет

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

Стабильная: 1.6.1+hotfix.1
Последняя: 1.6.1+hotfix.1

Мои программы

Автокрафт на OpenComputers и AE

http://computercraft...-opencomputers/

 

Минималистичные и красивые часы

http://computercraft...0-finger-clock/

 

Чат на GoogolGlasses

http://computercraft...-googolglasses/

 

Лампомат

http://computercraft...-oc-lamp-o-mat/

 

Автокрафт 2: без АЕ

http://computercraft...2-teper-bez-ae/

 

Клиент Гиста

http://computercraft...-opencomputers/

 

Управление нанитами

http://computercraft...nanitami-snova/

 

Чат на OpenPeripheral а-ля IRC

http://computercraft.ru/topic/1517-

Искать в моем блоге

Новые записи

Новые комментарии

Январь 2017

В П В С Ч П С
1234567
891011121314
15161718 19 2021
22232425262728
293031    

Полезные ссылки

Официальный сайт OpenComputers

http://oc.cil.li/

 

Официальный форум OpenComputers

http://oc.cil.li/index.php?/index

 

Репозиторий OpenComputers на ГитХабе

https://github.com/M...s/OpenComputers

 

Последние релизы OpenComputers

https://github.com/M...puters/releases

 

Jenkins-сервер

http://ci.cil.li/job...s-dev-MC1.7.10/
 

Репозиторий OpenPrograms

https://github.com/OpenPrograms

 

Репозиторий моих программ

https://github.com/O...rcomp-Programs/

1 посетителей

0 пользователей, 1 гостей, 0 анонимных

Последние посетители

  • Фотография
    NEO
    Сегодня, 17:35
  • Фотография
    Arseniy10
    Сегодня, 16:19
  • Фотография
    Programist135
    Сегодня, 08:12
  • Фотография
    PyshkinAC
    Сегодня, 04:23
  • Фотография
    ivan52945
    Вчера, 23:18
  • Фотография
    _Star_Craft_
    Вчера, 23:16
  • Фотография
    Strateg
    Вчера, 21:24
  • Фотография
    Cinobi
    Вчера, 15:49
  • Фотография
    Kazak11
    Вчера, 13:54
  • Фотография
    SDV
    17 янв 2017 - 20:53
  • Фотография
    Vait
    17 янв 2017 - 20:26
  • Фотография
    Alex
    16 янв 2017 - 02:53
  • Фотография
    vx13
    15 янв 2017 - 20:09
  • Фотография
    Stanislavich
    14 янв 2017 - 23:24
  • Фотография
    Xytabich
    13 янв 2017 - 14:30
  • Фотография
    Litvinov
    13 янв 2017 - 03:24
  • Фотография
    electronic_steve
    12 янв 2017 - 21:11
  • Фотография
    Stirn
    12 янв 2017 - 19:48
  • Фотография
    MeXaN1cK
    12 янв 2017 - 18:29
  • Фотография
    Saintmare
    11 янв 2017 - 08:26
  • Фотография
    Asior
    11 янв 2017 - 07:45
  • Фотография
    Fedel
    11 янв 2017 - 03:30
  • Фотография
    Cleveron
    10 янв 2017 - 20:28
  • Фотография
    slavik95_ua
    10 янв 2017 - 01:28
  • Фотография
    LeshaInc
    08 янв 2017 - 14:52
  • Фотография
    ALeXeR
    08 янв 2017 - 11:00
  • Фотография
    cyber01
    07 янв 2017 - 23:16
  • Фотография
    POMAH3
    07 янв 2017 - 19:44
  • Фотография
    incvIZ
    07 янв 2017 - 17:31
  • Фотография
    Totoro
    07 янв 2017 - 15:48
  • Фотография
    qwertyMAN
    07 янв 2017 - 12:52
  • Фотография
    Sharplook
    07 янв 2017 - 00:10
  • Фотография
    cloud
    05 янв 2017 - 14:16
  • Фотография
    mrlobaker
    04 янв 2017 - 16:19
  • Фотография
    Kartograf
    04 янв 2017 - 13:43
  • Фотография
    DimaZCOM
    03 янв 2017 - 21:29
  • Фотография
    mrGreen
    02 янв 2017 - 18:43
  • Фотография
    Nikitat
    02 янв 2017 - 14:51
  • Фотография
    Zabqer
    02 янв 2017 - 12:17
  • Фотография
    prostoshu
    02 янв 2017 - 09:32
  • Фотография
    YuRaNnNzZZ
    30 дек 2016 - 20:58
  • Фотография
    Kid
    29 дек 2016 - 15:38
  • 26 дек 2016 - 11:07
  • Фотография
    LuaGamer
    26 дек 2016 - 08:23
  • Фотография
    Misha123
    25 дек 2016 - 17:23
  • Фотография
    DarthWirthe
    25 дек 2016 - 16:09
  • Фотография
    Quant
    24 дек 2016 - 11:42
  • Фотография
    VankaPapanka
    23 дек 2016 - 12:26
  • Фотография
    GeorgSorok16
    23 дек 2016 - 10:33
  • Фотография
    HalfLolek
    21 дек 2016 - 14:21

Лицензия


Яндекс.Метрика