BearLibTerminal — различия между версиями
Cfyz (обсуждение | вклад) |
Cfyz (обсуждение | вклад) |
||
Строка 159: | Строка 159: | ||
|align | |align | ||
|center/top-left | |center/top-left | ||
− | |Точка отсчета координат для центрирования тайла в ячейке. Возможные значения: center, top-left, top-right, bottom-left, bottom-right | + | |Точка отсчета координат для центрирования тайла в ячейке. Возможные значения: center, top-left, top-right, bottom-left, bottom-right. |
|- | |- | ||
|bbox | |bbox |
Версия 19:26, 27 декабря 2013
BearLibTerminal — это небольшая (в интерфейсном плане) библиотека для организации терминал-подобного окна, вывода текста, обработки простого ввода.
Большое количество roguelike совершенно осознанно используют аскетичное символьное/псевдографическое оформление. Однако, использование стандартных средств вывода (командной строки ОС) сопряжено с досадными ограничениями скорости вывода, цветовой гаммы, используемого шрифта. Нетривиальной задачей оказывается и применение расширенного набора символов, например нескольких языков и псевдографики. BearLibTerminal позволяет обойти упомянутые ограничения оставаясь в рамках простой концепции "терминала": пользователю предоставляется прямоугольная сетка ячеек-знакомест, средства для вывода текста и чтения ввода с клавиатуры.
Достойными внимания особенностями терминала являются:
- Высокая скорость вывода (в основе лежит OpenGL).
- Возможность использования тайловых (в виде картинки) и векторных (TrueType) шрифтов.
- Легкость использования Unicode.
- Полная TrueColor палитра.
- Возможность комбинации нескольких символов в одном знакоместе.
- Поддержка ввода с клавиатуры и мыши.
BearLibTerminal не является:
- Фреймворком roguelike: в библиотеке нет и никогда не будет генераторов случайных чисел, уровней или имен персонажей, механизмов расчета FOV/LOS и освещения, средств для работы с файлами или сетью.
- Графическим движком общего назначения: функциональность библиотеки сознательно ограничивается функциональностью псевдотерминала (спорное утверждение для версий 0.9+).
Похожие инструменты: Tinycurses, libtcod.
Найти библиотеку можно в соответствующей теме форума (см. первое сообщение).
Содержание
- 1 Элементарный пример использования
- 2 Справка по интерфейсу библиотеки
- 2.1 terminal_open
- 2.2 terminal_close
- 2.3 terminal_set
- 2.4 terminal_put
- 2.5 terminal_put_ext
- 2.6 terminal_color
- 2.7 terminal_bkcolor
- 2.8 terminal_composition
- 2.9 terminal_layer
- 2.10 terminal_print
- 2.11 terminal_clear
- 2.12 terminal_clear_area
- 2.13 terminal_refresh
- 2.14 terminal_has_input
- 2.15 terminal_read
- 2.16 terminal_read_ext
- 2.17 terminal_read_str
- 2.18 terminal_state
- 2.19 color_from_argb
- 2.20 color_from_name
- 3 Ввод
- 4 Примеры
Элементарный пример использования
C/C++<source lang="cpp">
- include <BearLibTerminal.h>
TERMINAL_TAKE_CARE_OF_WINMAIN // Но можно и самостоятельно определить WinMain
int main() {
terminal_open();
// Выводим текст terminal_printf(1, 1, "Hello, world!"); terminal_refresh();
// Ждем, пока пользователь не закроет окно while (terminal_read() != VK_CLOSE);
terminal_close();
} </source>
Справка по интерфейсу библиотеки
BearLibTerminal оформлен в виде динамически подключаемой библиотеки (.dll). Используемое соглашение вызова — cdecl.
terminal_open
<source lang="cpp">
int terminal_open();
</source>
Для начала работы с библиотекой необходимо вызвать функцию terminal_open. До вызова terminal_open
все остальные функции библиотеки мгновенно завершаются, не выполняя никаких действий.
terminal_open
производит инициализацию терминала со "стандартными" параметрами: размер рабочей области 80x25 ячеек, шрифт Fixedsys Excelsior. Вызов terminal_open
не приводит к немедленному выводу окна терминала на экран, окно отображается в момент первого вызова функции #terminal_refresh
.
terminal_close
<source lang="cpp">
void terminal_close();
</source>
Симметричный terminal_open
вызов, закрывающий терминал и освобождающий используемые библиотекой ресурсы. Поведение программы, не вызвавшей terminal_open перед своим завершением, неопределено.
terminal_set
Данная функция представляет собой универсальный способ задания разнообразных настроек библиотеки и описания используемых тайлсетов. Опции задаются в виде строки с группами значений в следующем формате: group1.option1=value1; group1.option2=value2; ...
Эта запись может быть сокращена до: group1: [option1=]value1, option2=value2; ...
Например:
<source lang="cpp">
terminal_set("window: size=80x25, title='Заголовок'; log.level=trace");
</source>
Динамическая библиотека предоставляет три варианта для строки из 8, 16 и 32-битных символов: terminal_set8, terminal_set16 и terminal_set32. Детали о разрядности символов должны быть скрыты хедером для конкретного языка программирования с учетом разрядности исрользуемых в языке строк. Например, для С/С++ этот вызов доступен в виде следующих функций:
<source lang="cpp">
int terminal_set(const char* s);
int terminal_wset(const wchar_t* s);
</source>
Кроме того, хедер для C/C++ предоставляет варианты с printf-подобным форматированием строки: terminal_[w]set[f](...);
Перечень доступных параметров
Наименование | Значение по умолчанию | Описание |
Настройки окна, группа атрибутов window | ||
size | 80x25 | Размер окна терминала в знакоместах в формате <ширина>x<высота>. |
cellsize | auto | Размер ячейки знакоместа, в пикселях в формате <ширина>x<высота> или auto |
title | BearLibTerminal | Заголовок окна терминала. |
icon | app.ico | Имя .ico-файла с иконкой, которая будет использована для окна. |
Настройки ввода, группа атрибутов input | ||
events | keypress | Фильтр событий ввода, комбинация из флагов none, keypress, keyrelease, mousemove, mousescroll, all. |
nonblocking | false | Если выставлен в true, вызовы terminal_read[_xxx] не приостанавливают выполнение программы, если очередь ввода пуста. |
precise-mousemove | false | Флаг, указывающий, будет ли считаться движением мыши попиксельное (true) или познакоместное (false) перемещение указателя. |
sticky-close | true | Если выставлен в false, то по закрытию окна событие VK_CLOSE генерируется однократно. Если выставлен в true, то по закрытию окна terminal_read будет постоянно возвращать VK_CLOSE. |
cursor-symbol | 95 (ASCII 0x5F, подчеркивание) | Код символа, используемого в качестве курсора в terminal_read_str. |
cursor-blink-rate | 500 | Скорость мерцания курсора в terminal_read_str, в миллисекундах. |
Настройки вывода, группа атрибутов output | ||
postformatting | true | Флаг, включающий или выключающий постформатирование при выводе текста. |
vsync | true | Флаг, включающий или выключающий вертикальную синхронизацию при отрисовке. |
Настройки растрового тайлсета, группа атрибутов font или U+xxxx (см. ниже) | ||
name | Описательное имя растрового ресурса: имя файла или адрес памяти. | |
size | Размер одиночного тайла в пикселях в формате <ширина>x<высота>. Необязательный атрибут, если он не указан, считается что все изображение это один тайл. | |
resize | <size> | Размер, до которого нужно переразмерить растровое изображение. Необязательный атрибут. |
resize-filter | bilinear | Фильтр, который будет использован при переразмерении изображения. Возможные варианты: nearest, bilinear, bicubic. |
resize-mode | stretch | Режим переразмерения. Возможные варианты: stretch (растянуть), fit (вписать по большей стороне), crop (вписать по меньшей стороне). |
raw-size | <size> | Размер исходного изображения в случае загрузки из памяти. Если этот атрибут не указан, используется значение атрибута size (и считается, что все изображение это один тайл). |
codepage | ascii | Кодовая таблица соответствия отдельных тайлов в тайлсете кодам Unicode. Возможные варианты: ascii, utf8, 437, 866, 1250, 1251 или имя файла с таблицей. |
align | center/top-left | Точка отсчета координат для центрирования тайла в ячейке. Возможные значения: center, top-left, top-right, bottom-left, bottom-right. |
bbox | 1x1 | Размер логической ячейки, в которой выполняется центрирование тайла, в знакоместах. |
transparent | auto | Цвет прозрачного фона для изображений без альфа-канала. Необязательный атрибут (и вообще используйте PNG). |
Настройки TrueType тайлсета, группа атрибутов font или U+xxxx (см. ниже) | ||
name | Имя .ttf-файла шрифта | |
size | Размер шрифта: либо средняя высота строчного символа в пикселях, либо размер ячейки в пикселях для автоматического подбора размера шрифта. | |
size-reference | @ | Необязательный атрибут. Код символа, используемого для оценки/подбора размера шрифта. |
mode | normal | Режим растеризации. Возможные варианты: monochrome, normal или lcd. |
codepage | utf-8 | Кодовая таблица нестандартного соответствия кодов Юникода и символов шрифта. |
align | center | Точка отсчета координат для центрирования символа в ячейке. Возможные значения: center, top-left, top-right, bottom-left, bottom-right. |
bbox | 1x1 | Размер логической ячейки, в которой выполняется центрирование тайла, в знакоместах. |
Настройки логгирования, группа атрибутов log | ||
file | bearlibterminal.log | Имя файла, куда в библиотека будет писать свой лог. |
level | error | Уровень важности логгирования: none, fatal, error, warning, info, debug, trace |
mode | truncate | Режим ведения лога. Возможные варианты: truncate (начинать файл заново при каждом новом старте) и append (дописывать в конец файла). |
Использование тайлсетов
Растровые тайлсеты
Технически, терминал предоставляет ~65 тысяч слотов под символы (16-битное кодовое пространство UCS-2/UTF-16). Каждому слоту может быть назначен тайл произвольного размера.
Тайлы могут быть загружены индивидуально: <source lang="cpp"> terminal_set("0xE000: tile.png"); </source> В таком случае изображение из файла однозначно соответствует указанному "коду символа" и может быть помещено в ячейку на сцене посредством #terminal_put или #terminal_print.
Также, тайлы могут быть загружены в составе одного тайлсета: <source lang="cpp"> terminal_set("0xE100: tileset.png, size=32x32"); </source> В этом случае изображение из файла нарезается на кусочки указанного размера (в приведенном примере это 32x32) и эти кусочки-тайлы назначается кодам символов начиная с указанного (в приведенном примере это 0xE100). Например, если tileset.png является картинкой 64x64 пикселей, то она будет нарезана на четыре части, и указанная выше команда подгрузит тайлы с кодами 0xE100, 0xE101, 0xE102 и 0xE103. Порядок выбора кусочков из исходного изображения -- построчно, слева направо.
В качестве стартового кода (кода символа, с которого начинается отсчитываться тайлсет) может быть указано любое число от 0x0000 до 0xFFFD в десятичном или шестнадцатиричном формате. Коды 0xFFFE и 0xFFFF зарезервированы. Основной шрифт, задаваемый посредством тайлсета "font", имеет стартовый код 0. Фактически, слово "font" в этом контексте является просто синонимом числа 0.
Кодовые страницы
Тайлсет шрифта может содержать тайлы, коды символов которых не располагаются последовательно. Например тайлсет шрифта в кодировке Windows-1251, где первая половина соответствует ASCII и имеет коды 0-127, а вторая половина содержит символы национального алфавита и разбросана в большом промежутке кодов вплоть до 0x044F. Для того, чтобы тайлы в тайлсете могли быть назначены не только строго последовательно, при его загрузке используется параметр codepage: <source lang="cpp"> terminal_set("font: tileset_1251.png, size=8x16, codepage=1251"); </source> В таком случае, коды для тайлов выбираются по порядку из указанной кодовой страницы. Таблицы некоторых кодовых страниц встроены в терминал: 437, 866, 1250, 1251. Недостающие таблицы могут быть заданы явно, для этого в качестве значения параметра codepage надо указать имя файла с таблицей в следующем формате: <source lang="plaintext"> U+0000-U+007F, U+0402, U+0403, ... </source>
Выравнивание
Каждый тайл/тайлсет имеет свойство выравнивания в ячейке. Одиночные растровые тайлы выровнены по верхнему левому углу (верхний левый угол изображения будет совпадать с верхним левым углом ячейки, куда положен тайл). Растровые тайлсеты, даже из пары тайлов, выравниваются по центру (центр изображения совпадает с центром ячейки). Для того, чтобы изменить это (например, загружается тайлсет не с символами, для которых необходимо центрирование, а набор тайлов для карты), следует использовать параметр align, принимающие одно из следующих значений: center, top-left, top-right, bottom-left, bottom-right. Например: <source lang="cpp"> terminal_set("0xE200: terrain.png, size=32x32, align=top-left"); </source>
Помимо выравнивания в одной ячейке, может возникнуть необходимость выравнивания тайла в пределах большей области. Например, большой символ, которым обозначается многоклеточный монстр. Выравнивание таких символов в области из 2x2 знакомест может оказаться нетривиальной задачей даже с применением попиксельного смещения. В этом случае можно указать параметр bbox, относительно которого будет производиться выравнивание: <source lang="cpp"> terminal_set("0xE300: monsters.png, size=32x32, align=center, bbox=2x2"); </source> Тогда изображение будет отцентрировано в блоке из четырех ячеек, начиная с той, в которую помещен тайл.
TrueType тайлсеты
Помимо вышеописанных растровых тайлсетов, тайлы могут быть загружены из TrueType шрифта: <source lang="cpp"> terminal_set("font: VeraMono.ttf, size=12"); </source>
Размер символа в TrueType тайлсете можно задать двумя способами. Во-первых, указав средний размер строчного символа, как в примере выше. Во-вторых, указав размер некоторой ячейки (может не совпадать с размерами ячейки-знакоместа): <source lang="cpp"> terminal_set("font: VeraMono.ttf, size=16x16"); </source> В этом случае библиотека самостоятельно подберет размер шрифта таким, чтобы его символы вписывались в указанные пределы (без изменения пропорций).
В растровом тайлсете-картинке отдельные тайлы расположены последовательно и для трансляции индексов в коды символов пространства Unicode используется кодовая страница. В шрифте TrueType символам уже назначены правильные коды Unicode. Это удобно для установки основного шрифта в терминале, но является проблемой, если хочется иметь в распоряжении символы из нескольких TrueType шрифтов. В этом случае также используется кодовая страница, однако ее смысл противоположен таковой у растрового тайлсета. Если при загрузке тайлсета из TrueType шрифта указана некоторая кодовая страница, то она определяет порядок в котором символы из шрифта будут помещены в последовательные слоты тайлов. Например: <source lang="cpp"> terminal_set("0xE400: UbuntuMono-R.ttf, size=12, codepage=1251"); </source> В приведенном примере, начиная с 0xE400 будут загружены 255 последовтельных тайлов (0xE400-0xE4FF), в порядке кодовой страницы Windows-1251. В частности, тайл с кодом 0xE4DF (0xE400 + 0xDF) будет содержать изображение буквы 'Я' (код 0xDF в Windows-1251). Это позволяет, пожертвовав полноценной поддержкой Unicode, иметь в распоряжении более-менее полные наборы символов из разных шрифтов. В комбинации с тегом постформатирования base функции #terminal_print это позволяет выводить текст несколькими шрифтами одновременно.
Параметры align и bbox имеют такой же смысл, как и для растрового тайлсета.
terminal_put
<source lang="cpp"> void terminal_put(int x, int y, int code); </source> Одна из основных функций библиотеки, позволяет вывести символ в знакоместо с указанными координатами. В зависимости от выбранного режима смешения, выводимый символ может заменить собой все содержимое указанного знакоместа или быть добавленным поверх уже имеющихся (см. #terminal_composition). Для ячеек первого слоя terminal_put применяет цвет фона.
terminal_put_ext
<source lang="cpp"> void terminal_put_ext(int x, int y, int dx, int dy, int code, color_t* corners); </source> Расширенный вывод символа в ячейку. Позволяет задать смещение в пикселях относительно обычного положения тайла (dx, dy) и индивидуальные цвета углов тайла (corners). Если цвета не заданы (последним аргументом передано 0), то используется текущий цвет, установленный #terminal_color.
terminal_color
<source lang="cpp"> void terminal_color(color_t color); </source> Устанавливает основной цвет выводимого текста (тайлов). Функция принимает целое беззнаковое 32-битное число, представляющее цвет в формате 0xAARRGGBB. В хедере для C++ имеется перегруженный вариант, принимающий строку с именем цвета.
См. #color_from_argb, #color_from_name, #Постформатирование.
terminal_bkcolor
<source lang="cpp">
void terminal_bkcolor(color_t color);
</source>
Аналогичная terminal_color
функция, но устанавливающая цвет фона выводимых символов.
Цвет фона применяется к знакоместам только в первом слое (см. #terminal_layer).
terminal_composition
<source lang="cpp">
void terminal_composition(int mode);
</source>
Функция устанавливает режим наложения тайлов в одной ячейке: TK_COMPOSITION_ON
или TK_COMPOSITION_OFF
.
В режиме TK_COMPOSITION_OFF
выводимый символ полностью замещает содержимое соответствующего знакоместа, цвет фона устанавливается в выбранный посредством #terminal_bkcolor цвет. Это обычное поведение терминал-подобных приложений.
В режиме TK_COMPOSITION_ON выводимый символ "накладывается" на уже имеющиеся в ячейке символы, причем каждый отдельный символ в получившейся "стопке" может иметь индивидуальный цвет (и даже индивидуальное смещение и цвета углов, см. #terminal_put_ext. Таким образом можно комбинировать глифы и/или тайлы для получения более сложных фигур.
terminal_layer
<source lang="cpp"> void terminal_layer(int layer); </source> Функция устанавливает текущим слой с указанным номером. Доступны слои с номерами от 0 до 255. Цвет фона у ячеек имеется только у первого слоя, ячейки остальных слоев имеют прозрачный фон. Функция #terminal_clear_area работает только с текущим слоем, в то время как #terminal_clear очищает все содержимое сцены, все слои.
terminal_print
<source lang="cpp">
int terminal_print(int x, int y, const char* s);
</source>
Аналогично #terminal_set, библиотека предоставляет несколько вариантов функции для строк различной разрядности, но хедер к С/С++ скрывает это и вызов доступен для char* и wchar_t* строк с форматированием и без: terminal_[w]print[f]
. В строке, передаваемой в функцию terminal_print могуть присутствовать теги постформатирования, модифицирующие производимый вывод:
Цвет текста и фона:
terminal_print(2, 1, "[color=amber]Amber[/color] letters, [bkcolor=darkest gray]gray background[/bkcolor].");
Произвольный символ:
terminal_print(2, 1, "Earth rune: [U+E001]");
Комбинация символов:
terminal_print(2, 1, "a[+]^");
Такой тег комбинирует два тайла как будто бы они были положены в одну ячейку с включенным наложением (TK_COMPOSITION_ON).
Межсимвольный интервал:
terminal_print(2, 1, "[spacing=2x2]sparse text");
Межсимвольный/межстрочный интервал необходим для вывода текста тайлами размером более одного знакоместа.
Сдвиг кодовой страницы:
terminal_print(2, 1, "[base=0xE000:1251]Русский текст");
Сдвиг страницы позволяет выводить текст тайлсетом в произвольной кодировке и загруженным по произвольному коду.
terminal_clear
<source lang="cpp"> void terminal_clear(); </source> Функция очистки экрана. Содержимое всех ячеек-знакомест во всех слоях удаляется, цвет фона устанавливается в выбранный посредством #terminal_bkcolor цвет.
terminal_clear_area
<source lang="cpp"> void terminal_clear_area(int x, int y, int w, int h); </source> Функция частичной очистки экрана. Удаляется содержимое ячеек-знакомест в указанной области экрана текущего слоя.
terminal_refresh
<source lang="cpp">
void terminal_refresh();
</source>
Функция обновления экрана. Эта функция должна быть вызвана, чтобы изменения содержимого терминала на самом деле отобразились на экране. Окно терминала выводится на экран при первом вызове terminal_refresh
.
terminal_has_input
<source lang="cpp"> int terminal_has_input(); </source> Позволяет узнать, есть ли события в очереди ввода. Возвращает 0, если очередь пуста или 1, если есть непрочитанные события.
terminal_read
<source lang="cpp"> int terminal_read(); </source> Возвращает код следующего событие из очереди ввода.
Если очередь ввода пуста, поведение зависит от параметра input.nonblocking:
- false: выполнение программы блокируется до поступления следующего события ввода.
- true: блокирования выполнения программы не производится, в случае пустой очереди ввода функция немедленно возвращает TK_INPUT_NONE.
См. #Ввод
terminal_read_ext
<source lang="cpp"> int terminal_read_ext(int flags); </source> Расширенная версия чтения очереди ввода. Параметр flags может включать в себя следующие флаги:
- TK_READ_CHAR: функция пытается выбрать из очереди текстовый символ. В случае, если следующее событие в очереди ввода не порождает текcтовый ввод, возвращается TK_INPUT_CALL_AGAIN, не убирая событие из очереди.
- TK_READ_NOREMOVE: функция не убирает прочитанное событие из очереди. Следующий вызов вернет такое же значение.
terminal_read_str
<source lang="cpp">
int terminal_read_str(int x, int y, char* buffer, int max);
int terminal_read_wstr(int x, int y, wchar_t* buffer, int max);
</source>
Функция чтения текста с клавиатуры с учетом локалей и раскладок пользователя. Набираемые пользователем символы добавляются к строке в буфере buffer
, при этом максимальный размер получаемой строки ограничивается max
символами.
Поведение функции сильно зависит от параметра input.nonblocking. Если он равен false (по умолчанию), то в процессе работы функции ввод полностью обрабатывается терминалом. В это время содержимое строки и курсор ввода отображается в терминале начиная с позиции (x
, y
). Чтение ввода функцией terminal_read_str
в блокирующем режиме производится до:
- Подтверждения ввода (поступления события TK_RETURN). Функция возвращает количество введенных символов (значение больше либо равное нулю).
- Отмены ввода (поступления события TK_ESCAPE или TK_CLOSE). Функция возвращает TK_INPUT_CANCELLED.
По завершении, terminal_read_str
убирает введенную строку и курсор ввода с экрана, восстанавливая предыдущее содержимое использованных ячеек-знакомест.
Если input.nonblocking равен true (неблокирующее чтение), функция terminal_read_str
не трогает экран, а только производит чтение доступной очереди ввода. В неблокирующем режиме:
- По подтверждению ввода (TK_RETURN) функция возвращает количество введенных символов.
- По отмене ввода (TK_ESCAPE или TK_CLOSE) функция возвращает TK_INPUT_CANCELLED.
- Если очередь ввода пуста, функция возвращает TK_INPUT_CALL_AGAIN.
Задача отрисовки процесса ввода (текст, курсор) ложится на пользователя библиотеки.
Размер передаваемого в функцию буфера должен быть достаточно большим, чтобы вместить максимально возможную вводимую строку. Так как параметр max указывается в символах, без учета нуль-терминатора, это означает, что для вызова в кодировке UTF-8 (terminal_read_str
) буфер должен быть размером не менее max*3+1 (каждый символ может занять до трех байт + нуль-терминатор), а для UTF-16/32 вызова (terminal_read_wstr
) -- не менее max+1.
См. #Ввод
terminal_state
<source lang="cpp"> int terminal_state(int code); </source> Данная функция позволяет получить текущее состояние некоторых переменных терминала. Код переменной берется из перечисления TK_xxx.
- Состояние клавиш: коды TK_ESCAPE, TK_0, TK_NUMPAD0, TK_A и т. д. Функция возвращает 1, если клавиша нажата или 0, если отпущена.
- Состояние мыши: TK_MOUSE_X и TK_MOUSE_Y (в знакоместах), TK_MOUSE_PIXEL_X, TK_MOUSE_PIXEL_Y (в пикселях), TK_MOUSE_WHEEL (в шагах колесика).
- Размеры экрана в знакоместах: TK_WIDTH, TK_HEIGHT.
- Размеры знакоместа в пикселях: TK_CELL_WIDTH, TK_CELL_HEIGHT.
- Текущие параметры сцены: TK_COMPOSITION, TK_COLOR, TK_BKCOLOR, TK_LAYER.
В зависимости от выбранного фильтра событий ввода (input.events), состояние клавиш и мыши возвращается не на момент вызова, а соответствующее текущему состоянию очереди ввода. Обновление значений, возвращаемых функцией terminal_state
, производится по мере выбора соответствующих событий из очереди ввода посредством terminal_read
.
Например, если пользователь нажмет сочетание клавиш Shift+Z, в очереди ввода оно будет представлено как Shift(нажато), Z(нажато), Z(отпущено), Shift(отпущено). На момент выбора из очереди ввода события о нажатии клавиши Z, состояние клавиши Shift будет точно "нажато", даже если обработка ввода будет произведена несвоевременно и на самом деле клавиша Shift к тому моменту будет уже отпущена. Это позволяет производить проверку нажатия сочетаний клавиш элементарным образом: <source lang="cpp"> int code = terminal_read();
if (code == TK_Z) {
if (terminal_state(TK_SHIFT)) { // Нажато Shift+Z } else if (terminal_state(TK_CTRL)) { // Нажато Ctrl+Z } else { // Нажата просто Z }
}
</source>
Однако, если событие не попадает под фильтр событий ввода (input.events), оно не может быть выбрано из очереди посредством terminal_read
и будет обработано автоматически. В пределе, если фильтр равен none, то все события обрабатываются автоматически и terminal_state
всегда возвращает текущее (последнее) состояние.
color_from_argb
<source lang="cpp"> color_t color_from_argb(int a, int r, int g, int b); </source> Простая вспомогательная функция, собирающая из отдельных R, G, B и A компонент одно 32-битное число, которым представляется цвет в библиотеке (0xAARRGGBB).
color_from_name
<source lang="cpp"> color_t color_from_name(const char* name); </source> Данная функция возвращает цвет (его числовое представление) по имени из встроенной в библиотеку палитры. Эта палитра практически полностью повторяет палитру из libtcod. Имя указывается в виде "оттенок" или "яркость оттенок", где возможными значениями являются:
Яркость | lightest, lighter, light, dark, darker, darkest |
Оттенок | grey или gray, red, flame, orange, amber, yellow, lime, chartreuse, green, sea, turquoise, cyan, sky, azure, blue, han, violet, purple, fuchsia, magenta, pink, crimson |
Также, по имени цвет можно использовать в тегах color и bkcolor функции terminal_printf
:
<source lang="cpp">
terminal_color("lighter gray"); // Основным цветом выбран светло-серый
terminal_printf(1, 1, "You see a [color=dark red]glowing[/color] stone."); // Слово glowing будет темно-красным
</source>
Ввод
...
Примеры
FreePascal<source lang="pascal"> uses
BeaRLibTerminal, Windows;
begin
terminal_open(); // Выводим текст terminal_print(1, 1, 'Hello, world!'); terminal_refresh();
// Ждем, пока пользователь не закроет окно while (terminal_get() <> TK_CLOSE) do; terminal_close();
end. </source>
C#<source lang="csharp">
using System;
using BearLib;
namespace HelloWorld {
static class Program { static void Main() { Terminal.Open();
// Выводим текст Terminal.Print(1, 1, "Hello, world!"); Terminal.Refresh();
// Ждем, пока пользователь не закроет окно while (Terminal.Read() != Terminal.Keys.Close);
Terminal.Close(); } }
} </source>