BearLibTerminal

Материал из Клуб любителей рогаликов
Перейти к: навигация, поиск

BearLibTerminal — это небольшая (в интерфейсном плане) библиотека для организации терминал-подобного окна, вывода текста, обработки простого ввода.

Большое количество roguelike совершенно осознанно используют аскетичное символьное/псевдографическое оформление. Однако, использование стандартных средств вывода (командной строки ОС) сопряжено с досадными ограничениями скорости вывода, цветовой гаммы, используемого шрифта. Нетривиальной задачей оказывается и применение расширенного набора символов, например нескольких языков и псевдографики. BearLibTerminal позволяет обойти упомянутые ограничения оставаясь в рамках простой концепции "терминала": пользователю предоставляется прямоугольная сетка ячеек-знакомест, средства для вывода текста и чтения ввода с клавиатуры.

Достойными внимания особенностями терминала являются:

  • Легкость использования Unicode.
  • Использование тайловых (в виде картинки) и векторных (TrueType) шрифтов.
  • Расширенный вывод символов: композиция, центрирование, смещение.
  • Высокая скорость вывода (в основе лежит OpenGL).
  • Поддержка как клавиатуры, так и мыши.
  • Сборки под Windows, Linux и OS X.
  • Привязки к нескольким языкам: С/С++, C#, Lua, Pascal, Python, Ruby.

BearLibTerminal не является:

  • Фреймворком roguelike: в библиотеке нет и никогда не будет генераторов случайных чисел, уровней или имен персонажей, механизмов расчета FOV/LOS и освещения, средств для работы с файлами или сетью.
  • Графическим движком общего назначения: функциональность библиотеки сознательно ограничивается функциональностью псевдотерминала (спорное утверждение для версий 0.9+).

Похожие инструменты: Tinycurses, libtcod.

Документация

Наиболее актуальная документация размещена на сайте библиотеки:

Установка

В большинстве случаев нужно взять заголовочный файл/враппер и бинарник динамической библиотеки из архива, который можно скачать на сайте библиотеки или по ссылкам в первом сообщении форума.

C/C++

Используется заголовочный файл BearLibTerminal.h

При использовании MSVC приложение линкуется с "интерфейсной библиотекой" BearLibTerminal.lib

При использовании MinGW приложение нужно линковать непосредственно с BearLibTerminal.dll (файл .lib содержит лишь перечень функций для MSVC).

При использовании GCC под Linux приложение линкуется с libBearLibTerminal.so

C#

Используется враппер BearLibTerminal.cs, который должен быть включен в состав проекта.

Nim

Используется враппер BearLibTerminal.nim, который должен быть включен в состав проекта.

Lua

Интерфейс для Lua включен непосредственно в библиотеку.

Под Windows достаточно использовать любой динамически собранный интерпретатор Lua, например Lua for Windows. Вызов require "BearLibTerminal" подгрузит файл BearLibTerminal.dll как бинарный модуль.

Под Linux файл библиотеки имеет имя libBearLibTerminal.so, но так как бинарные модули Lua не имеют префикса lib, придется переименовать его в BearLibTerminal.so

FreePascal/Delphi

Используется враппер BearLibTerminal.pas, который должен быть включен в состав проекта.

Python

Для Python есть пакеты библиотеки для Windows, Linux и OS X (включающие в себя соответствующий бинарный файл: .dll/.so/.dylib). Поэтому для установки достаточно просто выполнить:

pip install bearlibterminal

Команда установки может отличаться: для Python3 утилита pip обычно называется pip3, также может быть полезно добавить флаг --user (установка только для текущего пользователя).

Ruby

Используется враппер BearLibTerminal.rb, который должен быть включен в состав проекта.

Примеры использования

"Hello, world" на нескольких языках:

C/C++

#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();
}

Python

from bearlibterminal import terminal

terminal.open()

# Выводим текст
terminal.printf(2, 1, 'Hello, world!')
terminal.refresh()

# Ждем, пока пользователь не закроет окно
while terminal.read() != terminal.TK_CLOSE:
  pass

terminal.close()

FreePascal/Delphi

uses
  BeaRLibTerminal;

begin
  terminal_open();
 
  // Выводим текст
  terminal_print(1, 1, 'Hello, world!');
  terminal_refresh();

  // Ждем, пока пользователь не закроет окно
  while (terminal_read() <> TK_CLOSE) do; 
 
  terminal_close();
end.

C#

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();
    }
  }
}

Nim

import BearLibTerminal

terminal_open()

# Выводим текст
discard terminal_print(1, 1, "Hello, world!")
terminal_refresh()

var key = terminal_read()

# Ждем, пока пользователь не закроет окно
while key != TK_CLOSE and key != TK_ESCAPE:
  key = terminal_read()

terminal_close()

Lua

local T = require "BearLibTerminal"

T.open()
-- Выводим текст
T.print(1, 1, "Hello, World!")
T.refresh()
repeat
	key = T.read()
-- Ждем, пока пользователь не закроет окно
until key == T.TK_CLOSE or key == T.TK_ESCAPE
T.close()