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

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

Модератор: Apromix

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

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

Сообщение Cfyz » 17 дек 2012, 11:40

Последняя версия 0.15.3, архив со сборками для Windows, для Linux и для OS X.
Хедеры для C/C++, C#, Go, Pascal, Python и Ruby в архиве, привязка к Lua встроена в бинарник.
Документация на wiki, исходный код на Bitbucket.

Для Python библиотеку (бинарник + модуль) можно установить через pip:

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

pip install bearlibterminal
Последний раз редактировалось Cfyz 20 май 2017, 13:39, всего редактировалось 43 раза.
Cfyz теперь - наглая морда.

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

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

Сообщение Apromix » 17 дек 2012, 11:46

Ага :lol: Ну планы грандиозные)) У меня задумка была поскромнее... Тогда успехов и ждем-с с нетерпением-с... :D А сюрприз все равно получился :)
Изображение Изображение

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

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

Сообщение Cfyz » 22 дек 2012, 18:53

Итак, чтобы не быть голословным, небольшая демонстрация.

Лирическое отступление:
Скрытый текст: ПОКАЗАТЬ
Я тут разжился занятной клавиатурой и моя скорость набора упала на порядок; надеюсь, что временно. Ох, лол.
Предупреждая недоумение -- это клавиатура с Cherry-MX Brown механикой.

Изображение
Выкладывается бинарник библиотеки и код тривиального приложения на паскале. Вот так, даже на паскале, а не на С. Сама библиотека, впрочем, на С++11, но кому какое дело.

Данный вариант -- нечто за полшишечки до беты. Внутри у меня уже реализован весь интерфейс и почти весь функционал, осталось некоторое количество тривиальной, но необходимой рутины. Как следствие, в прилагаемой привязке к паскалю (юнит bearlibterminal.pas) отсутствуют некоторые уже фактически реализованные функции. Также оставлено некоторое дебажное поведение типа окошек с сообщениями об исключении.

Ну и разумеется никакой внятной документации пока нет. А ее придется делать, ой придется. Пока в два слова об отдельных функциях:
  • terminal_open(options)/terminal_close() -- вызываются до и после всего, инициализация библиотеки; в open передается строка со всякими возможными фиксированными опциями типа кодировки строк, используемой компилятором; всегда можно передать просто пустую строку.
  • terminal_size(width, height) -- задает размер терминала в знакоместах.
  • terminal_title(title) -- задает заголовок окна.
  • terminal_font(description) -- инициализирует шрифт согласно переданному в строке описанию; в ближайшее время будут поддерживаться только растеризованные в картинку и векторные TrueType шрифты; пример описания для растеризованного: "type=bitmap; filename=somename.png; size=8x14; codepage=cp1251"; пример описания для векторного: "type=freetype; filename=somename.ttf; size=14"; теперь должно быть понятно, почему без документации никуда =) ах да, пока по имени гарнитуры из системы оно шрифт изымать не умеет, нужно именно .ttf файл.
  • terminal_begin()/terminal_end() -- начать/закончить блок отрисовки; во время блока картинка на экране не обновляется, иначе -- после каждого изменения каждого символа; вывод целых строк, впрочем, всегда завернут в свой отдельный блок.
  • terminal_clear() -- весь экран вжииих прочь.
  • terminal_color(color) -- задает цвет, с которым будут выводиться символы; цвет -- целое беззнаковое 32-битное число, BGRA: $AARRGGBB; например, $FFFF8000 -- это оранжевый.
  • terminal_put(x, y, code) -- ставит в указанное знакоместо указанный код; в шрифте (что в картинке, что в векторном) запросто может быть более 256 глифов; можно указать любой, хоть всякие уголки из юникода, если они, конечно, в шрифте есть.
  • terminal_puts(x, y, s) -- выводит сразу строку.
  • terminal_kbhit() -- возвращает 1, если в очереди клавиатуры есть несчитанный символ; виртуальной клавиатуры, разумеется, никуда нажатия не денутся, как бы медленно программа не работала, как бы редко эта функция не вызывалась.
  • terminal_get() -- возвращает следующий символ из очереди клавиатуры; btw, нажатие на "крестик" окна ставит в очередь VK_CLOSE.
Полностью за бортом вопрос трансляции кодировок строк. Это в двух словах не объяснишь, это надо отдельную страницу с картинками. Пока считай, что кодировка -- ASCII и символов за пределами 127 как будто бы и нет.

Вот такие пироги с котятами. Когда допилю до честной беты, когда уже нужно будет искать и ругаться на всякие баги, оформлю отдельную ветку; а пока можно и тут погудеть.
Вложения
bearlibterminal-sub-beta.zip
(612.41 КБ) 202 скачивания
Cfyz теперь - наглая морда.

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

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

Сообщение Apromix » 10 янв 2013, 11:09

Замечательная новость :D Почти все то, что я хотел реализовать, но сделано более удобно. По коду demo.pas видно, сколько функционала перебрала на себя либа и как проще делать на ней псевдоконсоль :D Ждем новых релизов :)
Изображение Изображение

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

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

Сообщение kipar » 10 янв 2013, 20:37

Классно, не хватает только поддержки мыши. И тогда - прощай libtcod с ее квадратными шрифтами и проблемами с русскими буквами.

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

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

Сообщение Cfyz » 10 янв 2013, 21:52

Apromix писал(а):Почти все то, что я хотел реализовать, но сделано более удобно. По коду demo.pas видно, сколько функционала перебрала на себя либа и как проще делать на ней псевдоконсоль
Это хорошо =) Вообще, BearLibTerminal мною предполагается как некоторый даже не микро, а фемто-движок. Не такой, который с генераторами чисел и миров или тем паче принуждающий к определенной архитектуре, а эдакий функциональный базис. Но все-таки чуточку больше, чем просто окно.
Apromix писал(а):Ждем новых релизов
Скоро будет >_< Я тут кучу, огромную кучу времени убил в попытках сделать полноценный субпиксельный anti-aliasing для TrueType шрифтов. Но дело оказалось в том, что:
* Во-первых, результат не слишком заметен, ну вот ей-богу; сделал дему где субпиксельное сглаживание включается-отключается одним нажатием клавиши и... результат виден лишь если знать куда глядеть. Увеличение шрифта на лишний пункт дает куда больший выигрыш в качестве изображения.
* Во-вторых, это технологически невозможно, лол. У меня в качестве подсистемы вывода используется OpenGL, старый добрый OpenGL 1.2. Это дает и приличную скорость, и широкую программно-аппаратную поддержку (дадада, linux будет). Но аппаратный пайплайн (как противоположность программному типа GDI или GTK/Cairo) не в состоянии выполнить необходимое количество действий в нужном порядке на один пиксель. Там далеко не просто A*x+B*y, и даже WPF и Qt научились полноцветной субпиксельной растеризации текста лишь с шейдерами. Ну, с шейдерами и я могу, но это поднимет требования к аппаратуре до OpenGL 1.4 минимум, что несколько расходится с изначальной концепцией. Кроме того, см. предыдущий пункт, оно того не стоит.
Эта эпопея заняла у меня порядка недели праздников, большую часть времени которых я бессовестно тупил. Поэтому растеризация будет либо обычная ("grayscale"), либо субпиксельная без возможности смены черного фона у символов. Полностью отказаться от хоть какой-то субпикселизации я не смог, потому что у windows-порта ADOMа она есть, лол, пусть там и наверное и самый заметный в этом плане шрифт.
kipar писал(а):Классно, не хватает только поддержки мыши. И тогда - прощай libtcod с ее квадратными шрифтами и проблемами с русскими буквами.
Ха, как раз libtcod я нередко мысленно и противопоставляю свою поделку. Ибо в libtcod на интернационализацию положен болт М20 по ГОСТ. Возможность легко и просто вывести красивую, например, кириллицу в консоль -- одно из желаний, давших начало данному проекту.

По поводу мыши -- в принципе, почему бы и нет? Единственно, я навскидку не могу придумать как полноценно и красиво вписать это в интерфейс библиотеки. Мышь по сути своей -- событийный ввод, а BearLibTerminal проектировалась по образу блокирующего потокового ввода настоящих терминалов. Одно событие -- одно число (int, целое 32-битное со знаком). Для нажатой клавиши это <ее код>, для отпущенной -- <ее код> -побитовое-или- <флаг отпущенной клавиши>. Но для мыши во-первых, надо три числа, а то и больше (x, y, клавиши, колесико), а во-вторых (хоть в целом, наверное, и приемлемо) не хотелось бы терять само движение мыши (так сказать, OnMouseMove) если кому-то придет в голову делать эффекты от ее движения или вообще реалтайм. Делать целую забитую полями на все случаи жизни структуру для событие ввода что-то не хочется. От упакованных в "младший байт старшего слова" координат в стиле WinAPI тоже скулы уже сводит. =(

Вообще, можно так: события нажатия клавиш мыши попадают в общую очередь клавиш (у Microsoft даже соответствующие виртуальные коды клавиш уже есть), а конкретная позиция курсора выбирается по необходимости отдельными вызовами. Плюсы: логическая простота интерфейса и тривиальная возможность использования в реалтайме. Минусы: потребуется еще аж две функции (С не умеет возвращать пары) и еще если программа окажется нерасторопной и выберет событие VK_LBUTTON из очереди не сразу, реальное положение мыши может уже измениться.

В общем, над этим еще надо подумать.
Cfyz теперь - наглая морда.

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

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

Сообщение kipar » 11 янв 2013, 07:38

Cfyz писал(а):Вообще, можно так: события нажатия клавиш мыши попадают в общую очередь клавиш (у Microsoft даже соответствующие виртуальные коды клавиш уже есть), а конкретная позиция курсора выбирается по необходимости отдельными вызовами. Плюсы: логическая простота интерфейса и тривиальная возможность использования в реалтайме. Минусы: потребуется еще аж две функции (С не умеет возвращать пары) и еще если программа окажется нерасторопной и выберет событие VK_LBUTTON из очереди не сразу, реальное положение мыши может уже измениться.
По-моему, как-то кривовато. Я не понимаю, зачем нужна очередь сообщений для мыши. Если пользователь щелкнул пять раз, а программа не успела отработать, то уж лучше среагировать на последний щелчок, чем обработывать по порядку, щелкая на окна которых пользователь не успел увидеть и нажимая в них кнопки "Удалить все", "Подтвердить".

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

Аватара пользователя
Uvadzucumi
Сообщения: 364
Зарегистрирован: 29 ноя 2011, 07:13
Откуда: Дубай, ОАЭ (Минск, Беларусь)
Контактная информация:

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

Сообщение Uvadzucumi » 11 янв 2013, 08:35

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

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

про TrueType и генерацию текстуры - а оно точно надо? просто для поддержки utf8 (в определенных рамках, конечно) у меня просто вот такая текстура, в ней русский, английский и спецсимволы всякие:
Изображение
и файл с описанием соответствий позиций глифов и кодов символов.
Скрытый текст: ПОКАЗАТЬ

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

Ubuntu 12pt
32 0 0 0 0 4 19 4 19
97 0 96 6 8 1 7 9 19
98 50 16 7 12 1 3 10 19
99 114 89 6 8 1 7 8 19
100 42 17 7 12 1 3 10 19
101 66 20 7 8 1 7 9 19
102 29 17 5 12 1 3 7 19
103 95 65 7 11 1 7 10 19
104 58 16 7 12 1 3 10 19
105 125 0 1 12 1 3 5 19
106 84 0 2 15 0 3 5 19
107 35 17 6 12 1 3 9 19
108 25 17 3 12 1 3 5 19
109 26 78 11 8 1 7 14 19
110 58 20 7 8 1 7 10 19
111 17 78 8 8 1 7 10 19
112 5 53 7 11 1 7 10 19
113 87 65 7 11 1 7 10 19
114 29 21 5 8 1 7 7 19
115 122 78 5 8 1 7 8 19
116 0 53 4 11 1 4 7 19
117 66 89 7 8 1 7 10 19
118 58 78 7 8 0 7 9 19
119 52 78 13 8 0 7 13 19
120 49 87 8 8 0 7 9 19
121 13 54 7 11 0 7 8 19
122 28 96 6 8 1 7 8 19
65 24 30 11 11 0 4 11 19
66 30 54 8 11 1 4 11 19
67 98 41 9 11 1 4 10 19
68 67 41 9 11 1 4 12 19
69 76 4 7 11 1 4 10 19
70 95 77 7 11 1 4 9 19
71 47 42 9 11 1 4 11 19
72 57 42 9 11 1 4 12 19
73 44 5 1 11 1 4 5 19
74 31 66 7 11 0 4 8 19
75 37 42 9 11 1 4 11 19
76 47 66 7 11 1 4 9 19
77 48 30 11 11 1 4 14 19
78 77 53 9 11 1 4 12 19
79 0 17 10 11 1 4 13 19
80 39 54 8 11 1 4 10 19
81 114 0 10 14 1 4 13 19
82 67 53 9 11 1 4 11 19
83 71 65 7 11 1 4 9 19
84 27 42 9 11 0 4 10 19
85 107 54 9 11 1 4 11 19
86 57 54 9 11 0 4 11 19
87 87 29 13 11 0 4 15 19
88 17 42 9 11 0 4 11 19
89 117 54 9 11 0 4 10 19
90 55 66 7 11 1 4 10 19
48 79 65 7 11 1 4 10 19
49 2 65 4 11 1 4 10 19
50 63 66 7 11 1 4 10 19
51 7 66 7 11 1 4 10 19
52 87 77 7 11 1 4 10 19
53 79 77 7 11 1 4 10 19
54 119 66 7 11 1 4 10 19
55 39 66 7 11 1 4 10 19
56 15 66 7 11 1 4 10 19
57 23 66 7 11 1 4 10 19
46 1 13 1 2 1 13 4 19
44 23 11 2 5 0 13 4 19
33 0 65 1 11 1 4 5 19
63 1 41 5 11 1 4 7 19
45 70 2 4 1 1 10 5 19
43 44 96 7 7 1 7 10 19
92 8 0 7 16 0 2 8 19
47 0 0 7 16 0 2 8 19
40 33 0 4 16 1 2 6 19
41 28 0 4 16 0 2 6 19
58 1 77 1 8 1 7 4 19
59 76 77 2 11 0 7 4 19
37 60 29 12 11 1 4 14 19
38 118 42 9 11 1 4 11 19
96 34 13 3 3 1 3 7 19
39 18 3 1 4 1 2 4 19
42 84 98 7 6 1 4 9 19
35 108 42 9 11 1 4 11 19
36 68 0 7 15 1 2 10 19
61 92 98 7 4 1 8 10 19
91 38 0 3 16 2 2 6 19
93 42 0 3 16 0 2 6 19
64 104 15 13 13 1 4 16 19
94 76 98 7 6 1 4 10 19
123 16 0 5 16 0 2 6 19
125 22 0 5 16 0 2 6 19
95 78 39 8 1 0 17 8 19
126 117 98 7 2 1 9 10 19
34 112 98 4 4 1 2 7 19
62 35 96 8 7 1 7 10 19
60 60 98 7 7 1 7 10 19
14844051 78 39 8 1 0 10 8 19
14844052 111 103 16 1 0 10 16 19
49835 52 96 7 7 0 7 8 19
49851 68 98 7 7 0 7 8 19
14844060 106 98 5 4 2 3 8 19
14844061 100 98 5 4 0 3 7 19
124 44 0 1 16 1 2 5 19
53424 0 96 6 8 1 7 9 19
53425 74 16 8 12 1 3 10 19
53426 58 87 7 8 1 7 9 19
53427 14 96 6 8 1 7 7 19
53428 66 78 9 10 0 7 10 19
53429 66 20 7 8 1 7 9 19
53649 66 16 7 12 1 3 9 19
53430 38 78 13 8 0 7 13 19
53431 21 96 6 8 1 7 8 19
53432 83 20 8 8 1 7 10 19
53433 83 16 8 12 1 3 10 19
53434 90 89 7 8 1 7 9 19
53435 20 87 9 8 0 7 10 19
53436 30 87 9 8 1 7 12 19
53437 82 89 7 8 1 7 10 19
53438 17 78 8 8 1 7 10 19
53439 106 89 7 8 1 7 10 19
53632 5 53 7 11 1 7 10 19
53633 114 89 6 8 1 7 8 19
53634 74 89 7 8 0 7 8 19
53635 13 54 7 11 0 7 8 19
53636 46 0 11 15 1 3 13 19
53637 49 87 8 8 0 7 9 19
53638 114 78 7 10 1 7 10 19
53639 98 89 7 8 1 7 9 19
53640 0 87 9 8 1 7 14 19
53641 103 78 10 10 1 7 14 19
53642 10 87 9 8 0 7 10 19
53643 3 78 10 8 1 7 13 19
53644 121 89 6 8 1 7 9 19
53645 7 96 6 8 1 7 8 19
53646 14 78 11 8 1 7 13 19
53647 40 87 8 8 0 7 9 19
53392 24 30 11 11 0 4 11 19
53393 21 54 8 11 1 4 10 19
53394 30 54 8 11 1 4 11 19
53395 111 66 7 11 1 4 9 19
53396 102 0 11 14 0 4 12 19
53397 76 4 7 11 1 4 10 19
53377 76 0 7 15 1 0 10 19
53398 101 29 13 11 0 4 15 19
53399 48 54 8 11 0 4 10 19
53400 58 4 9 11 1 4 12 19
53401 58 0 9 15 1 0 12 19
53402 37 42 9 11 1 4 11 19
53403 87 41 10 11 0 4 12 19
53404 48 30 11 11 1 4 14 19
53405 57 42 9 11 1 4 12 19
53406 0 17 10 11 1 4 13 19
53407 87 53 9 11 1 4 12 19
53408 39 54 8 11 1 4 10 19
53409 98 41 9 11 1 4 10 19
53410 27 42 9 11 0 4 10 19
53411 7 41 9 11 0 4 10 19
53412 92 15 11 12 1 3 14 19
53413 17 42 9 11 0 4 11 19
53415 103 66 7 11 1 4 11 19
53414 118 15 9 14 1 4 12 19
53416 73 29 13 11 1 4 16 19
53417 87 0 14 14 1 4 17 19
53418 36 30 11 11 0 4 12 19
53419 12 29 11 11 1 4 14 19
53420 39 30 8 11 1 4 10 19
53421 77 41 9 11 0 4 10 19
53422 11 17 13 11 1 4 17 19
53423 97 53 9 11 0 4 11 19
49833 115 30 11 11 1 4 14 19
49838 0 29 11 11 1 4 14 19 
текста в utf-8. но. это не будет, конечно, работать, если пользователь будет набирать текст в кодировке, символы которой отсутствуют в текстуре. но при TrueType все равно, придется тогда на лету рендерить новые символы в текстуру. оно точно нужно?
Меня окружали милые, добрые люди... медленно сжимая кольцо

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

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

Сообщение Cfyz » 11 янв 2013, 10:32

kipar писал(а):Я не понимаю, зачем нужна очередь сообщений для мыши. Если пользователь щелкнул пять раз, а программа не успела отработать, то уж лучше среагировать на последний щелчок, чем обработывать по порядку
Uvadzucumi писал(а):не нужно никакой очереди мыши. только получение текущего состояния кнопок (битовая маска) и координаты.
Вы начинаете делать необоснованные предположения об алгоритме обработки событий. Взять, к примеру, такой очевидный (и, наверняка, в том или ином виде самый распространенный):
1. Нарисовать.
2. Для каждого нажатия выполнить какое-то действие (здесь опцинально висим пока пользователь что-то не нажмет).
3. Обсчитать мир.
4. GOTO 1

Итак, что значит очередь не нужна? В момент события какая клавиша была нажата? A? Shift+A? Городить структуру с кучей полей "левый шифт", "правый альт" и пр? Ну порнография же. И что, теперь нельзя сделать нажатие Shift+A+B? А если "обсчитать мир" займет чуть подольше? Быстро нажатая комбинация "Z, a" (скастовать что-то) может взять и не выполниться? Не, гипотенуза, так не катет.

А теперь к мыши. Собственно, чем мышь, логически, отличается от клавиш? Координатами, которые могут генерироваться в большом количестве. Еще? Ничем. В некоторый произвольный момент пользователь елозит мышкой и нажимает клавиши, в некоторый произвольный момент программа считывает состояние мыши. Обсчет подвис, ОС проглюкнула, программа не успела считать в нужный, но короткий миг -- все, не повезло? Справка по F1 об объекте под курсором мыши -- все, нельзя? Или я нажал мышь на каком-нибудь счетчике дважды быстрым двойным кликом -- где я узнаю, что нажатия было два? Реагировать только на последний щелчок? Да ладно? Тупящие проги, выполняющие твои команды как им вздумается, никогда не бесили?

У нас только две серьезно отличающиеся модели ввода -- событийная (OnKeyPressCallback, OnMouseMoveCallback) и потоковая (GetNextInputEvent). Событийная модель красива, эффективна и все дела, но требует очень специальной архитектуры. Без выделенного потока или строгого контроля над таймингом обсчета это быстро скатывается в бесящую фигню. Во-первых, я отчаянно не желаю делать что-то вносящим лишние ограничения способом. Во-вторых, давайте вспомним, кто является доброй долей ЦА библиотеки (ааа как сделать @ бегающую по экрану) и не будем требовать невозможного.

Очередь мыши будет, смиритесь с этим =)
Uvadzucumi писал(а):сглаживание шрифтов - хм, просто альфу добавлять для крайних пикселей в текстуру и все, разве не так?. делается один раз при загркзке (или генерации) текстуры, на CPU. и никаких шейдеров.
"Просто альфу" -- это и есть тривиальный "grayscale". Противопоставляется "lcd subpixel", когда мы оперируем цветом не отдельного пикселя, а его RGB компонент, каждая из которых на LCD-мониторах размером в треть целого пикселя, см. технологию ClearType. На grayscale, действительно, ничего сложного не надо, там тривиальная математика. На обсчет субпикселей обычного железа уже не хватает, так как там надо учитывать цвета фона, текста и отдельного субпикселя разом.
Uvadzucumi писал(а):про TrueType и генерацию текстуры - а оно точно надо? <...> и файл с описанием соответствий позиций глифов и кодов символов
Точно надо. Возможность без бубна вывести в консоль латиницу (да еще с умлаутами), кириллицу и немного хираганы (если, конечно, такие глифы вообще есть в шрифте) -- базовый императив проектируемой библиотеки. Текстуры, описания позиций и кодов, на лету-не на лету -- все это скрыто от пользователя полностью:
1. terminal_font("type=truetype; name=Lucida Console; size=12");
2. terminal_printf(10, 10, "Abc Абв Αβγ");
3. ?????
4. PROFIT

Разумеется, если шрифт -- уже растеризованный в картинку, например из библиотеки Dwarf Fortress, то будут только те, что в картинке, что тут поделаешь.

edit: Uvadzucumi, если же ты по поводу "стоит ли заморачиваться так делать, кучу времени займет" -- поздно, это уже все сделано; вообще вся библиотека, фактически, сделана, за исключением относительно рутинных мелочей типа вложить внутрь шрифт "по умолчанию", вычистить все FIXME места, сделать лог на случай серьезных ошибок, запилить полноценные биндинги к С/Pascal/еще-что-нибудь. Ну вот только мышь тут внезапно нарисовалась >_<
Cfyz теперь - наглая морда.

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

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

Сообщение kipar » 11 янв 2013, 10:53

Cfyz писал(а): А теперь к мыши. Собственно, чем мышь, логически, отличается от клавиш? Координатами, которые могут генерироваться в большом количестве. Еще? Ничем.
Тем, что предполагает интерактивность. Да, клавиатурой можно набрать Z, a, *, space и ожидать что заклинание выстрелит. Мышью, за исключением кликов (ну и двойных кликов, ты правильно подметил) так не делают. Мышкой: - нажимаем на инвентарь
- нажимаем на предмет в нем
- нажимаем в появившемся списке "уничтожить"
- нажимаем "подтвердить" в появившемся окне.

Другой пример: кликаем по карте для ее обследования пока не встретим монстра. Если монстр встречен - клики означают стрельбу или скажем одиночные шаги.

Что будет в этих случаях если программа медленно отрабатывает: в первом случае пользователь нажимает "Инвентарь", программа ничего не отобразила, он кликает еще несколько раз в ту же область, ну или в рандомные точки. Программа запоминает все клики и они складываются, например, в последовательность уничтожения предмета.
Во втором случае: пользователь кликает по карте скучая обследует территорию, если игра вдруг тормознет - он этого даже не заметит (т.к. красной надписи "обнаружен монстр" не возникнет) и будет кликать дальше. Игра все это запомнит и в результате он встретит монстра, и успеет совершить несколько рандомных выстрелов или шагов, в результате YASD.

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


----
а, ну и не только поэтому, а из корыстного интереса тоже - получение статуса, я так понимаю, сделать можно за полчаса, я даже готов отпускание мыши у себя обрабатывать. А очередь - можно и потом запилить.

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

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

Сообщение Apromix » 11 янв 2013, 11:26

Cfyz
Рассмотри вариант использования для либы движка HGE или SDL )) В движок там много чего встроено и не нужно придумывать самому.
Изображение Изображение

Аватара пользователя
Uvadzucumi
Сообщения: 364
Зарегистрирован: 29 ноя 2011, 07:13
Откуда: Дубай, ОАЭ (Минск, Беларусь)
Контактная информация:

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

Сообщение Uvadzucumi » 11 янв 2013, 15:04

по вводу, я бы делал в либе приблизительно так:
возможность повесить каллбэк на функуии
void OnKeyPressed(key_code)
void OnKeyUnPressed(key_code)
void OnMouseButtonPressed(mouse_button_code)
void OnMouseButtonUnPressed(mouse_button_code);
void OnMoueMove(dx,dy);
и функции чтения возможность чтения состояний:
bool IsKeyPressed(key_code);
bool IsMouseButton(mouse_button_code);
void GetMousePosition(int *x, int y*), или даже GetMouseState(int *x, int *y, int *buttons=NULL);
все. этого достаточно для всего. разве что для джойстика еще функций добавить.
Меня окружали милые, добрые люди... медленно сжимая кольцо

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

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

Сообщение Cfyz » 11 янв 2013, 16:09

kipar писал(а):Мышью, за исключением кликов (ну и двойных кликов, ты правильно подметил) так не делают
Очень даже делают. Всегда, что по личному опыту, что по чужому (в свое время был сисадмином, у меня эти пользовательские привычки поперек горла стояли), если быстро и щелкают, то "по памяти". Окно еще не открылось, а мышь уже в угол ползет. Особо упоротые даже второй клик успевали, прежде чем эта чертова 1С таки откроет свою несчастную проводку. И наоборот, если пользователь таки сначала думает, а потом кликает, он всегда дожидается реакции программы и потом продолжает. Посередине этих двух крайностей почему-то никого нет. Поэтому если
kipar писал(а):Программа запоминает все клики и они складываются, например, в последовательность уничтожения предмета
то скорее всего именно это пользователь и хотел; вплоть до обратной ситуации -- то, что вместо окна я вторым кликом попаду по монстру на карте, вообще выбесить может, я черт побери не по карте щелкал.
kipar писал(а):Поэтому я за считывание статуса, возможно даже двойных кликов или скажем нажатых в момент клика модификаторов кнопок (хотя это излишнее усложнение, по-моему), но против очереди из более чем одного события.
Считывание координат, одинарных, двойных кликов, левой, правой, средней кнопок, состояния модификаторов левых, правых -- и вот она, структура на все случаи жизни. Осталось добить ее кодом обычной клавиши, флагами и количеством повторений и получить химеру из SDL_чтототам и lParam/wParam. Нет, к черту.

Ну а теперь вишенка. Вся дискуссия не имеет большого смысла:
* Если тебе нужна очередь, берешь input_t key = terminal_get(); и обрабатываешь каждое событие.
* Если тебе очередь не нужна -- делаешь input_t key; while ( terminal_kbhit() ) key = terminal_get(); и получаешь просто последнее случившееся событие.

В обратную сторону так нельзя, ибо взятие статуса устройства ввода теряет данные. Я не горю желанием требовать всех в обязательном порядке использовать все данные (очередь), но терять их тоже не намерен.
Apromix писал(а):Рассмотри вариант использования для либы движка HGE или SDL )) В движок там много чего встроено и не нужно придумывать самому.
Не стоит. Во-первых, к данному моменту уже бессмысленно, ибо сделано по-своему. Во-вторых, лишние либы не нужны. Создание OpenGL-окна есть задача тривиальная. Ввод в этих либах выполнен ну тоже не то чтобы идеальным способом. А уж с текстом (самая, кстати, большая часть задумки) там полный срам. Ну и лишняя .dll тоже никому не нужна.
Uvadzucumi писал(а):по вводу, я бы делал в либе приблизительно так: возможность повесить каллбэк на функуии <...> и функции чтения возможность чтения состояний <...>
Не, коллбеки это совсем не то. Чуть выше уже ведется спор событийный vs потоковый ввод, сейчас ход kipar =)
События с обратными вызовами хороши, когда у тебя соответствующая архитектура. Я же люто, бешено хочу, чтоб можно было написать просто

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

int main()
{
    terminal_open("");
    while ( true )
    {
        DrawLevel();
        input_t key = terminal_get();
        if ( key.code == VK_CLOSE ) break;
        else if ( key.code == VK_LEFT ) { MoveLeft(); }
        /* ... */
    }
    terminal_close();
}
И -- все. И можно не думать, что оно сожрет все ресурсы безрассудно опрашивая клавиатуру. Или начнет подлагивать из-за слишком большого sleep() в цикле и, соответственно, несколько заторможенной реакции. Или вообще пропустит нажатие или два.

При пустой очереди terminal_get вернет нажатие в тот же момент, когда произойдет нажатие. Не в конце какого-то на шару подобранного интервала проверки, а в сие мгновение. А до того мгновения программа будет мирно спать не тратя CPU. Ну а обновление картинки вообще само по себе и выполняется когда нужно и сколько нужно.

Проникнитесь насколько это упрощает логику. Не надо думать когда там обновить экран. Не надо думать как часто надо опросить ввод. Девяти десятым простых набросков для проверки того или сего (для чего, не в последнюю очередь, либа и пилится) за глаза хватит такого простого, как полено, алгоритма.


Для тех же, кому аж не спится без реалтайма и обязательной проверки ввода здесь и сейчас, поясняю темную сторону обработки ввода в BearLibTerminal (которую я самодержавно придумал к текущему моменту):

Увы-увы-увы, я вынужден пойти на ввод структуры "событие ввода" следующего вида:

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

struct input_t
{
    unsigned char code, flags, x, y;
};
И функции:

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

int terminal_kbhit();
input_t terminal_get();
input_t terminal_get_nonblocked(int timeout);
Ну и, наконец, пояснения:
Поле code в структуре input_t -- это код, кхм, события. VK_LEFT, VK_LBUTTON, VK_WHEELUP, и т. д.
Поля x и y там же -- координаты мыши в соответствующий момент.
terminal_get_nonblocked -- это как terminal_get, но с таймаутом. Фактически, как раз наоборот, terminal_get -- это terminal_get_nonblocked(очень-большое-число). К слову, необязательно блокирующий вызов get был в интерфейсе с самого начала, но до сего момента не афишировался.

* Получили code == F1? Великолепно, в этой же структуре уже есть x и y. F1 просто справка приложения? Ну так никто и не заставляет.
* Получили VK_LBUTTON? Ну так вы уже знаете где искать координаты.
* Нет события, но координаты мыши ну позарез как нужны здесь и сейчас? terminal_get_nonblocked(0) к вашим услугам. Поля x и y заполнены всегда, что бы там не произошло с клавиатурой, мышью или мировой политической ареной.
* Куча событий, но хочется только последнее -- ну так, как уже было показано, возьми самое последнее, кто ж мешает?

Вы лучше скажите, какой шрифт взять в качестве дефолтного (который используется если terminal_font не вызывалось или сфейлилось) -- старый добрый Fixedsys или что-нибудь более в ногу со временем типа Ubuntu Mono? Дефолтный шрифт будет в наличии всегда (вложен в .dll), растеризован и иметь неполный относительно юникода, но и не маленький набор глифов. По меньшей мере расширенную латиницу, греческий (ну прикольные у них буквы) и кириллицу.
Cfyz теперь - наглая морда.

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

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

Сообщение Apromix » 11 янв 2013, 16:35

Cfyz писал(а):Вы лучше скажите, какой шрифт взять в качестве дефолтного
Я за Ubuntu :) Красивый шрифт и современный, недавно читал новость на ЛОРе, что обновились шрифты для убунты. Сам думаю в дес взять этот шрифт. Еще в дес возьму терминал, если он будет не тяжелее того, что исп. сейчас в дес :)
Изображение Изображение

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

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

Сообщение Cfyz » 11 янв 2013, 17:31

Apromix писал(а):Я за Ubuntu :) Красивый шрифт и современный, недавно читал новость на ЛОРе, что обновились шрифты для убунты. Сам думаю в дес взять этот шрифт.
Да, шрифт весьма приятный. Ну и тут еще немаловажный момент (ну, кому как, мне немаловажный), что лицензия на шрифты Ubuntu позволяет вот так взять и вложить растеризованную битмапку в свое приложение/либу =)
Apromix писал(а):Еще в дес возьму терминал, если он будет не тяжелее того, что исп. сейчас в дес :)
Таки что значит -- тяжелее? =) Я вот не помню, дебажная или релизная лежит во вложении чуть выше по треду, но даже если примерно 1 Мб -- это несерьезно в наше время.

Либа, чисто технически, могла быть и тоньше, но в силу очевидных причин она делается без зависимостей от всяких msvcrtXYZ.dll и пр., а за это приходится платить. Не забываем, там внутри помимо CRT еще zlib, libpng и freetype. Если приложением уже для своих собственных целей используются эти либы (и автор не против в установщик вложить Microsoft Visual C++ 2012 Redistributable, лол), то можно сделать тонкую сборку. Иначе бестолку, какая разница одним куском либ на метр или в сумме скопом?

Алсо, выбор шрифта в моем вопросе -- это не в контексте "думаю эту либу использовать, вот этот шрифт мне как раз придется". Лучше просто взять и положить .ttf рядом, зато и размер в любой момент поменять можно и юникод почти полный. А тот, что дефолтный -- это для демок, тех же быстрых набросков или где попросту не очень важно.
Cfyz теперь - наглая морда.

Ответить

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

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