BearLibTerminal - псевдоконсольное окно для рогалика
Модератор: Apromix
Re: BearLibTerminal - псевдоконсольное окно для рогалика
будет дальше развиваться?
и я так понял - нет возможности щелкать мышкой?
и эта любовь автора к строкам....
ну серьезно:
- конфигурирование через строчки.. может писателям в блокнотах и пофиг, но тем кто пишет в нормальных IDE... не хватает IntellIsence
Все таки вместо того чтобы написать SetSize(800, 600). я должен по идиотски изворачиваться со строками
Но это пол беды.
- но зачем было изображения идентифицировать символами? а если у меня 100500 тайлов? я запутаюсь минимум
и я так понял - нет возможности щелкать мышкой?
и эта любовь автора к строкам....
ну серьезно:
- конфигурирование через строчки.. может писателям в блокнотах и пофиг, но тем кто пишет в нормальных IDE... не хватает IntellIsence
Все таки вместо того чтобы написать SetSize(800, 600). я должен по идиотски изворачиваться со строками
Но это пол беды.
- но зачем было изображения идентифицировать символами? а если у меня 100500 тайлов? я запутаюсь минимум
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Щелкать даже в обычной консоли можно. А тут и попиксельная точность есть.
- Apromix
- Мастер
- Сообщения: 1236
- Зарегистрирован: 04 июл 2011, 10:44
- Откуда: Украина, Черновцы
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Только так кажется, что сложно. Я вот использую нечто такое (паскаль):
Код: Выделить всё
terminal_set(Format('window: size=%dx%d, icon=%s', [AWidth, AHeight,
'resources\icon.ico']));
Энум и массив констант оч. помогут не запутаться

Re: BearLibTerminal - псевдоконсольное окно для рогалика
про выбор мышкой разобрался - пример не увидел.
но вот про про строки...
Короче, а вот как сейчас получилось у меня
такое себе безобразие
но вот про про строки...
в С++ форматируемые строки - плохой стиль, дырявые они.Только так кажется, что сложно. Я вот использую нечто такое (паскаль):
Короче, а вот как сейчас получилось у меня
Код: Выделить всё
terminal_set
(
("window: size=" + std::to_string(WindowWidth) + "x" + std::to_string(WindowHeight) + ";").c_str()
);
terminal_set
(
"window: cellsize=auto;"
"window: title='YARL';"
"font: default;"
"input: filter={keyboard, mouse}"
);
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Может лучше через потоки?
Код: Выделить всё
std::stringstream ss;
ss << "window: size=" << WindowWidth << "x" << WindowHeight << ";";
terminal_set(ss.str().c_str());
terminal_set(
((std::stringstream&)(std::stringstream() << "window: size=" << WindowWidth << "x" << WindowHeight << ";")).str().c_str()
);
Код: Выделить всё
namespace Terminal
{
namespace Window
{
void setSize(const int &width, const int &height)
{
std::stringstream ss;
ss << "window: size=" << width << "x" << height << ";";
terminal_set(ss.str().c_str());
}
}
}
Terminal::Window::setSize(640, 480);
Код: Выделить всё
const std::string windowsSize(const int &width, const int &height)
{
std::stringstream ss;
ss << "window: size=" << width << "x" << height << ";";
return ss.str();
}
terminal_set((windowsSize(640, 480) + windowСellsize("auto")).c_str());
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Можно еще как-то так поизвращатся
но это уже для любителей.

Код: Выделить всё
struct ForTerminalStringContructor
{
std::stringstream buffer;
mutable std::string str;
ForTerminalStringContructor &operator<< (const ForTerminalStringContructor &other)
{
this->buffer << other.buffer.str();
return *this;
}
operator const char*() const { str = buffer.str(); return str.c_str();}
};
ForTerminalStringContructor windowSizeFTS(const int &width, const int &height)
{
ForTerminalStringContructor t;
t.buffer << "window: size=" << width << "x" << height << ";";
return t;
}
ForTerminalStringContructor windowCellsizeFTS(const std::string &value)
{
ForTerminalStringContructor t;
t.buffer << "window: cellsize=" << value << ";";
return t;
}
terminal_set(windowSizeFTS(640, 480) << windowCellsizeFTS("auto"));
Re: BearLibTerminal - псевдоконсольное окно для рогалика
ну вот это и не нравится.
но ладно, буду писать рогалик))
но ладно, буду писать рогалик))
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
ну тебе надо один раз написать фукционал для изменяемых настроек. неизменяемые можно не заморачиваться, Cfyz`у есть чем занятся кроме улучшений которые можно сделать самому. Строка помниться была выбрана для минимизации интерфейса взаимодействия с терминалом.
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Есть же замечательный libfmt. Безопасное и быстрое форматирование! 
Но с++11 only, что в 2018-м году уже не должно быть проблемой.

Но с++11 only, что в 2018-м году уже не должно быть проблемой.
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Ой, вей.
Некоторые свойства будут доступны и отдельно. Большая часть настроек текущего терминала -- это статичные, глобальные настройки, раз в начале задал и забыл. В терминале mk.II будут самостоятельные объекты-субтерминалы, некоторые свойства которых (как минимум размер и расположение) могут быть столь же динамичны, как и текущий цвет. Логично для этого предоставить методы настройки. Наверное, не менее логично будет предоставить их и для корневого терминала.
Проблема провести границу, что должно быть отдельным методом, а что конфигурацией. Я стараюсь разделять их по частоте использования. Например установка заголовка окна -- это штучная операция, а установка текущего слоя -- частая. Довольно очевидно, что эта граница во многом субъективна. Но все взять и переделать на методы/структуры непросто, это свяжет руки в дальнейшем. Я склоняюсь к позиции, что в любом проекте несложно набросать обертки для конкретных используемых настроек (более того, любой проект покрупнее неизбежно обрастает такими обертками независимо от интерфейса библиотеки).
Если не нужен текст, то можно просто пользоваться числами, функция terminal_put делает именно это. Достаточно выбрать для тайлов индексы далеко от используемых в выводе текста, чтобы они не пересеклись.
Будет. Период творческого кризиса подходит, надеюсь, к концу =). Скорее всего, это будет почти полный рефакторинг с максимально разумным сохранением интерфейса.warchief писал(а):будет дальше развиваться?
Как правильно отметил Jesus05, строковая конфигурация очень помогла в минимизации API. Она расширяема и кросс-платфоменна (в смысле языков программирования). Это то, что позволило сделать тучу оберток под всякие ЯП и долго поддерживать их в более-менее актуальном состоянии. Строковая конфигурация попросту очень гибкая (как динамическая типизация, т. е. это и плюс и минус). Форматирование строк это тлен, хуже когда настройка требует структуры на структурах и фабрики на фабриках. Строки позволяют записать лаконично и потом не сломать при обновлении.warchief писал(а):и эта любовь автора к строкам....
ну серьезно:
- конфигурирование через строчки.. может писателям в блокнотах и пофиг, но тем кто пишет в нормальных IDE... не хватает IntellIsence
Все таки вместо того чтобы написать SetSize(800, 600). я должен по идиотски изворачиваться со строками
Некоторые свойства будут доступны и отдельно. Большая часть настроек текущего терминала -- это статичные, глобальные настройки, раз в начале задал и забыл. В терминале mk.II будут самостоятельные объекты-субтерминалы, некоторые свойства которых (как минимум размер и расположение) могут быть столь же динамичны, как и текущий цвет. Логично для этого предоставить методы настройки. Наверное, не менее логично будет предоставить их и для корневого терминала.
Проблема провести границу, что должно быть отдельным методом, а что конфигурацией. Я стараюсь разделять их по частоте использования. Например установка заголовка окна -- это штучная операция, а установка текущего слоя -- частая. Довольно очевидно, что эта граница во многом субъективна. Но все взять и переделать на методы/структуры непросто, это свяжет руки в дальнейшем. Я склоняюсь к позиции, что в любом проекте несложно набросать обертки для конкретных используемых настроек (более того, любой проект покрупнее неизбежно обрастает такими обертками независимо от интерфейса библиотеки).
Кстати, вот этот момент. Я думаю разделить интерфейс С/С++ на отдельно С99 и отдельно C++11, уж больно это разные языки (одни строки чего стоят, а уж когда объекты появятся...). Версия для С++ в этом случае будет содержать компактную printf-подобную реализацию форматирования по мотивам tinyformat.Xecutor писал(а):Есть же замечательный libfmt. Безопасное и быстрое форматирование!
Но с++11 only, что в 2018-м году уже не должно быть проблемой.
Скорее наоборот, это все символы идентифицированы числами (из таблицы Unicode). Общее индексное пространство позволяет поштучно подменять символы в шрифте картинками и наоборот, вставлять пиктограммы в выводимый текст. Терминал просто оперирует пронумерованными картинками, а символы там или тайлы -- ему без разницы.warchief писал(а):но зачем было изображения идентифицировать символами? а если у меня 100500 тайлов? я запутаюсь минимум
Если не нужен текст, то можно просто пользоваться числами, функция terminal_put делает именно это. Достаточно выбрать для тайлов индексы далеко от используемых в выводе текста, чтобы они не пересеклись.
Пытается раскуклиться
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Начал знакомиться с библиотекой. Подскажите, пожалуйста, как поменять размер выводимых букв, и как поменять шрифт?
В справке на странице http://foo.wyrd.name/ru:bearlibterminal ... figuration указана опция cellsize в группе window, но её поменять не удаётся.
UPD: нашёл примеры на гитхабе
В справке на странице http://foo.wyrd.name/ru:bearlibterminal ... figuration указана опция cellsize в группе window, но её поменять не удаётся.
UPD: нашёл примеры на гитхабе

Re: BearLibTerminal - псевдоконсольное окно для рогалика
Столкнулся с небольшой неочевидностью. Следующий код (Питон) сначала берёт и сохраняет цвет фона клетки 3, 3 в переменную mem, дальше печатает туда красным шрифтом и с белым фоном, а потом делают t.bkcolor(mem), и это не работает.
Хотя кажется, что pick_bkcolor должен сохранять даже цвет фона клетки, в которую не печатал никто, и так, чтобы этот цвет можно было загрузить в bkcolor, этого не происходит.
Встретился и с другой штукой подобного типа...
Хотя кажется, что pick_bkcolor должен сохранять даже цвет фона клетки, в которую не печатал никто, и так, чтобы этот цвет можно было загрузить в bkcolor, этого не происходит.
Встретился и с другой штукой подобного типа...
Код: Выделить всё
t.open()
t.refresh()
t.color('red')
mem = t.pick_bkcolor(3, 3)
print(mem)
t.bkcolor(t.color_from_name('white'))
t.put(3, 3, ord('#'))
t.refresh()
t.delay(4000)
print('2')
t.bkcolor(mem)
t.put(3, 3, ord('#'))
t.refresh()
t.delay(4000)
t.close()
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
По умолчанию цвет фона равен нулю, в основном чтобы не рисовать лишнего, когда чаще всего надо просто черный цвет (нет цвета в ячейке -- проглядывает и так черный фон окна). При этом тот же прозрачный/нулевой цвет используется чтобы выключить изменение фона при выводе (выставлен прозрачный -- игнорируем фон).Tookser писал(а):Следующий код <..> берёт и сохраняет цвет фона клетки <...> а потом делают t.bkcolor(mem), и это не работает.
Наверное идея с прозрачным цветом, выключающим работу с цветом фона (чтобы типа дальше печатать отдельно от настроенного фона), сама по себе не очень. Особенно в свете возможных субтерминалов, у которых прозрачный цвет фона это совершенно честный вариант цвета и его как-то надо уметь выставлять наравне с остальными.
Надо поправить. В данном конкретном случае можно временно сделать так, превратив любой цвет фона в непрозрачный:
Код: Выделить всё
mem = t.pick_bkcolor(x, y) | 0xFF000000
Пытается раскуклиться
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Понял, спасибо.
Ещё один вопрос. У меня есть цикл, в котором key = t.read() и проверка состояния клавиш, это основная часть интерфейса. Включена опция input.filter = keyboard+ , как в каком-то примере. Но эта опция мешает в другой части программы ждать нажатия любой клавиши с помощью terminal_read (так как туда попадает отжатие клавиши). Как проще всего разрешить этот конфликт?:?
Ещё один вопрос. У меня есть цикл, в котором key = t.read() и проверка состояния клавиш, это основная часть интерфейса. Включена опция input.filter = keyboard+ , как в каком-то примере. Но эта опция мешает в другой части программы ждать нажатия любой клавиши с помощью terminal_read (так как туда попадает отжатие клавиши). Как проще всего разрешить этот конфликт?:?
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Я, лично, сделал так:Tookser писал(а): ↑22 апр 2018, 16:33Начал знакомиться с библиотекой. Подскажите, пожалуйста, как поменять размер выводимых букв, и как поменять шрифт?
В справке на странице http://foo.wyrd.name/ru:bearlibterminal ... figuration указана опция cellsize в группе window, но её поменять не удаётся.
UPD: нашёл примеры на гитхабе![]()
Код: Выделить всё
terminal.set('font: UbuntuMono-R.ttf, size = ' + str(font_size))
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость