BearLibTerminal - псевдоконсольное окно для рогалика

Форум библиотеки BeaRLib

Модератор: Apromix

Аватара пользователя
warchief
Сообщения: 300
Зарегистрирован: 11 янв 2008, 09:55
Откуда: Озеро снов

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение warchief » 03 апр 2018, 03:04

будет дальше развиваться?

и я так понял - нет возможности щелкать мышкой?

и эта любовь автора к строкам....

ну серьезно:
- конфигурирование через строчки.. может писателям в блокнотах и пофиг, но тем кто пишет в нормальных IDE... не хватает IntellIsence
Все таки вместо того чтобы написать SetSize(800, 600). я должен по идиотски изворачиваться со строками

Но это пол беды.

- но зачем было изображения идентифицировать символами? а если у меня 100500 тайлов? я запутаюсь минимум

Аватара пользователя
kipar
Сообщения: 2107
Зарегистрирован: 10 мар 2010, 13:16
Откуда: Москва

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение kipar » 04 апр 2018, 08:02

Щелкать даже в обычной консоли можно. А тут и попиксельная точность есть.

Аватара пользователя
Apromix
Мастер
Сообщения: 1154
Зарегистрирован: 04 июл 2011, 10:44
Откуда: Украина, Черновцы
Контактная информация:

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Apromix » 04 апр 2018, 13:22

warchief писал(а):
03 апр 2018, 03:04
- конфигурирование через строчки.. может писателям в блокнотах и пофиг, но тем кто пишет в нормальных IDE... не хватает IntellIsence
Все таки вместо того чтобы написать SetSize(800, 600). я должен по идиотски изворачиваться со строками
Только так кажется, что сложно. Я вот использую нечто такое (паскаль):

Код: Выделить всё

terminal_set(Format('window: size=%dx%d, icon=%s', [AWidth, AHeight,
    'resources\icon.ico']));
warchief писал(а):
03 апр 2018, 03:04
- но зачем было изображения идентифицировать символами? а если у меня 100500 тайлов? я запутаюсь минимум
Энум и массив констант оч. помогут не запутаться :D
Изображение Изображение

Аватара пользователя
warchief
Сообщения: 300
Зарегистрирован: 11 янв 2008, 09:55
Откуда: Озеро снов

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение warchief » 05 апр 2018, 04:11

про выбор мышкой разобрался - пример не увидел.

но вот про про строки...
Только так кажется, что сложно. Я вот использую нечто такое (паскаль):
в С++ форматируемые строки - плохой стиль, дырявые они.
Короче, а вот как сейчас получилось у меня

Код: Выделить всё

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
Сообщения: 1828
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Jesus05 » 05 апр 2018, 09:29

warchief писал(а):
05 апр 2018, 04:11
...
Короче, а вот как сейчас получилось у меня
Скрытый текст: ПОКАЗАТЬ

Код: Выделить всё

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

такое себе безобразие
Может лучше через потоки?

Код: Выделить всё


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

Или через helper`ы

Код: Выделить всё


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
Сообщения: 1828
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Jesus05 » 05 апр 2018, 09:52

Можно еще как-то так поизвращатся :) но это уже для любителей.

Код: Выделить всё

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"));

Аватара пользователя
warchief
Сообщения: 300
Зарегистрирован: 11 янв 2008, 09:55
Откуда: Озеро снов

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение warchief » 06 апр 2018, 05:03

ну вот это и не нравится.

но ладно, буду писать рогалик))

Аватара пользователя
Jesus05
Сообщения: 1828
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Jesus05 » 06 апр 2018, 05:12

ну тебе надо один раз написать фукционал для изменяемых настроек. неизменяемые можно не заморачиваться, Cfyz`у есть чем занятся кроме улучшений которые можно сделать самому. Строка помниться была выбрана для минимизации интерфейса взаимодействия с терминалом.

Аватара пользователя
Xecutor
Мастер
Сообщения: 734
Зарегистрирован: 25 мар 2008, 08:32

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Xecutor » 06 апр 2018, 12:40

Есть же замечательный libfmt. Безопасное и быстрое форматирование! :)
Но с++11 only, что в 2018-м году уже не должно быть проблемой.

Аватара пользователя
Cfyz
Сообщения: 764
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Cfyz » 10 апр 2018, 16:46

Ой, вей.
warchief писал(а):будет дальше развиваться?
Будет. Период творческого кризиса подходит, надеюсь, к концу =). Скорее всего, это будет почти полный рефакторинг с максимально разумным сохранением интерфейса.
warchief писал(а):и эта любовь автора к строкам....
ну серьезно:
- конфигурирование через строчки.. может писателям в блокнотах и пофиг, но тем кто пишет в нормальных IDE... не хватает IntellIsence
Все таки вместо того чтобы написать SetSize(800, 600). я должен по идиотски изворачиваться со строками
Как правильно отметил Jesus05, строковая конфигурация очень помогла в минимизации API. Она расширяема и кросс-платфоменна (в смысле языков программирования). Это то, что позволило сделать тучу оберток под всякие ЯП и долго поддерживать их в более-менее актуальном состоянии. Строковая конфигурация попросту очень гибкая (как динамическая типизация, т. е. это и плюс и минус). Форматирование строк это тлен, хуже когда настройка требует структуры на структурах и фабрики на фабриках. Строки позволяют записать лаконично и потом не сломать при обновлении.

Некоторые свойства будут доступны и отдельно. Большая часть настроек текущего терминала -- это статичные, глобальные настройки, раз в начале задал и забыл. В терминале mk.II будут самостоятельные объекты-субтерминалы, некоторые свойства которых (как минимум размер и расположение) могут быть столь же динамичны, как и текущий цвет. Логично для этого предоставить методы настройки. Наверное, не менее логично будет предоставить их и для корневого терминала.

Проблема провести границу, что должно быть отдельным методом, а что конфигурацией. Я стараюсь разделять их по частоте использования. Например установка заголовка окна -- это штучная операция, а установка текущего слоя -- частая. Довольно очевидно, что эта граница во многом субъективна. Но все взять и переделать на методы/структуры непросто, это свяжет руки в дальнейшем. Я склоняюсь к позиции, что в любом проекте несложно набросать обертки для конкретных используемых настроек (более того, любой проект покрупнее неизбежно обрастает такими обертками независимо от интерфейса библиотеки).
Xecutor писал(а):Есть же замечательный libfmt. Безопасное и быстрое форматирование! :)
Но с++11 only, что в 2018-м году уже не должно быть проблемой.
Кстати, вот этот момент. Я думаю разделить интерфейс С/С++ на отдельно С99 и отдельно C++11, уж больно это разные языки (одни строки чего стоят, а уж когда объекты появятся...). Версия для С++ в этом случае будет содержать компактную printf-подобную реализацию форматирования по мотивам tinyformat.
warchief писал(а):но зачем было изображения идентифицировать символами? а если у меня 100500 тайлов? я запутаюсь минимум
Скорее наоборот, это все символы идентифицированы числами (из таблицы Unicode). Общее индексное пространство позволяет поштучно подменять символы в шрифте картинками и наоборот, вставлять пиктограммы в выводимый текст. Терминал просто оперирует пронумерованными картинками, а символы там или тайлы -- ему без разницы.

Если не нужен текст, то можно просто пользоваться числами, функция terminal_put делает именно это. Достаточно выбрать для тайлов индексы далеко от используемых в выводе текста, чтобы они не пересеклись.
Cfyz теперь - наглая морда.

Tookser
Сообщения: 152
Зарегистрирован: 08 апр 2010, 11:09

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Tookser » 22 апр 2018, 16:33

Начал знакомиться с библиотекой. Подскажите, пожалуйста, как поменять размер выводимых букв, и как поменять шрифт?
В справке на странице http://foo.wyrd.name/ru:bearlibterminal ... figuration указана опция cellsize в группе window, но её поменять не удаётся.
UPD: нашёл примеры на гитхабе :)

Tookser
Сообщения: 152
Зарегистрирован: 08 апр 2010, 11:09

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Tookser » 27 апр 2018, 18:58

Столкнулся с небольшой неочевидностью. Следующий код (Питон) сначала берёт и сохраняет цвет фона клетки 3, 3 в переменную mem, дальше печатает туда красным шрифтом и с белым фоном, а потом делают t.bkcolor(mem), и это не работает.
Хотя кажется, что 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
Сообщения: 764
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Cfyz » 28 апр 2018, 16:10

Tookser писал(а):Следующий код <..> берёт и сохраняет цвет фона клетки <...> а потом делают t.bkcolor(mem), и это не работает.
По умолчанию цвет фона равен нулю, в основном чтобы не рисовать лишнего, когда чаще всего надо просто черный цвет (нет цвета в ячейке -- проглядывает и так черный фон окна). При этом тот же прозрачный/нулевой цвет используется чтобы выключить изменение фона при выводе (выставлен прозрачный -- игнорируем фон).

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

Надо поправить. В данном конкретном случае можно временно сделать так, превратив любой цвет фона в непрозрачный:

Код: Выделить всё

mem = t.pick_bkcolor(x, y) | 0xFF000000
Cfyz теперь - наглая морда.

Tookser
Сообщения: 152
Зарегистрирован: 08 апр 2010, 11:09

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение Tookser » 04 май 2018, 19:28

Понял, спасибо.
Ещё один вопрос. У меня есть цикл, в котором key = t.read() и проверка состояния клавиш, это основная часть интерфейса. Включена опция input.filter = keyboard+ , как в каком-то примере. Но эта опция мешает в другой части программы ждать нажатия любой клавиши с помощью terminal_read (так как туда попадает отжатие клавиши). Как проще всего разрешить этот конфликт?:?

vapekreng
Сообщения: 54
Зарегистрирован: 22 фев 2016, 22:33

Re: BearLibTerminal - псевдоконсольное окно для рогалика

Сообщение vapekreng » 04 май 2018, 21:55

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))
По-моему, во многих рогаликах не хватает как раз возможности сменить размер игрового окна под свой монитор - в том же адоме, уж на что мой любимый, приходится лезть в конфиг. У себя реализовал прямо в игровом меню со стартового экрана.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя