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

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

Модератор: Apromix

Аватара пользователя
thefish
Сообщения: 31
Зарегистрирован: 18 июн 2012, 22:37

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

Сообщение thefish » 13 ноя 2019, 20:44

Cfyz писал(а):
13 ноя 2019, 18:39
Думаю я это даже в официальную версию включу, только разве что вместо "." наверное стоит использовать "./lib
Только большая просьба - написать о той папке, куда надо положить blt, чтобы Go её увидел - большими буквами в документации. Будет это lib или ./ - неважно. Я почти неделю доискивался до причин потери видимости либы гошным бинарником =)
Cfyz писал(а):
13 ноя 2019, 18:39
Вообще жаль, что с бинарниками в Go так плохо. Ситуация патовая: в языке нет ни бинарных пакетов (фактически, пакетов вообще нет)
Уже есть. Пакет[1] с фиксированной версией[2] называется теперь модуль, работа с ними командой Появился этот способ с версии 1.12. Вообще существовали и другие (glide, go dep), но с выходом официального инструмента для модулей от разработчиков языка поддержка всего остального прекращена.

Для модулей можно сделать вендоринг - go mod vendor. Более того, заявленные зависимости сразу же выкачиваются, собираются и ждут своего часа.

Вместо Pinvoke тут все-таки CGO с его сообенностями. Но если почитать доки, то не так всё страшно. Скажем приведение в чувство кросс-компиляции (при которой CGO принудительно отключается) под Windows у меня заняло пару часов от силы, и потом все тикает как часики. Если интересно - могу написать про это.
---
[1] Ну да, это по факту снепшот git-репозитория
[2] А это указатель на коммит (ранее) или тег (сейчас)
Но работает прекрасно! =)

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

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

Сообщение Cfyz » 15 ноя 2019, 16:49

thefish писал(а):Уже есть. Пакет[1] с фиксированной версией[2] называется теперь модуль, работа с ними командой
Ну это не совсем то, это даже не пакет по факту. Ключевой в нашем случае момент, что нет возможности управлять артефактами. Вот например в Python: pip install bearlibterminal -- и о нюансах где там какая dll голова не болит. В Go же подразумевается статическая компиляция, то есть сборка должна давать ровно один артефакт в заранее зафиксированном месте. Собрать бинарник, но "проинсталлировать" и его, и ряд зависимостей -- похоже возможности нет.

Кстати, а с не-бинарными артефактами как в Go дела обстоят? Задача компоновки вместе бинарника, конфигов, документации и т. д. выходит за пределы инструментария языка?
thefish писал(а):Вместо Pinvoke тут все-таки CGO с его сообенностями.
И тут тоже не то =), потому что CGO это не invoke, это честная линковка. И добро пожаловать в мир разных ОС, нюансов и версий компиляторов и их флагов. Хотя в огромном количестве случаев все, что нужно -- это в рантайме найти в библиотеке символ с указанным именем и вызвать его с указанными скалярными аргументами. У них это даже немного есть, но только для Windows и какой-то огрызок. Что мешало сделать это нормально для всех ОС (благо везде плюс-минус одно и то же), как в куче других языков -- мне неведомо.

Кстати поэтому я не понял про кросс-компиляцию и отключение CGO -- линковаться-то все равно надо, а сделать это может только платформо-зависимый инструмент, то есть CGO.
Пытается раскуклиться

Аватара пользователя
thefish
Сообщения: 31
Зарегистрирован: 18 июн 2012, 22:37

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

Сообщение thefish » 15 ноя 2019, 18:54

Cfyz писал(а):
15 ноя 2019, 16:49
Ну это не совсем то, это даже не пакет по факту. Ключевой в нашем случае момент, что нет возможности управлять артефактами.
go mod как раз и собирает артефакты и кладет их в $GOPATH/pkg/mod/...
Правда в терминах Go артефакт - всего лишь исходники с зависимостями, т.к. длительность компиляции просто мизерная, и можно себе позволить собирать всё с нуля.
Кстати, а с не-бинарными артефактами как в Go дела обстоят? Задача компоновки вместе бинарника, конфигов, документации и т. д. выходит за пределы инструментария языка?
Не очень понял вопроса. Godoc можно писать руками, можно генерировать по исходникам/комментариям/аннотациям (go doc). Почти всё что публикуется на github / bitbucket / google code можно найти здесь.
Бинарники обычно ставятся в $GOPATH/bin прямо командой go get.
С конфигами какой-то общей практики нет, обычно каждый пакет конфигурируется отдельно.
CGO это не invoke, это честная линковка ... Кстати поэтому я не понял про кросс-компиляцию и отключение CGO -- линковаться-то все равно надо, а сделать это может только платформо-зависимый инструмент, то есть CGO.
CGO считается костылём специально для сишных паралитиков вроде меня, и жив еще только потому что есть множество востребованных сишных библиотек. Если сишные зависимости отсутствуют - CGO не нужен. А чистый Go кросс-компилируется легко и непринуждённо, установкой одной переменной окружения для целевой ОС и еще одной - для архитектуры. GOOS=windows GOARCH=amd64 go build - и всё готово.

PS На мое понимание устройства этой эмм.. экосистемы сильно повлияло знание того факта, что язык изначально писался Гуглом и для Гугла. Авторами Plan9 и Oberon, что наложило свой особенный отпечаток.
Тем не менее, даже в сегодняшнем состоянии Go мне очень нравится.

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

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

Сообщение Cfyz » 15 ноя 2019, 20:21

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

Ну так вот, максимум что позволяет Go касаемо результатов сборки -- это положить единственный бинарник в единственную директорию. А, как я уже писал, хотелось бы как у людей: собрать бинарник, его зависимости и проинсталлировать так, чтобы этим потом можно было пользоваться.
thefish писал(а):Не очень понял вопроса.
Я про конечный результат сборки как целого приложения. Приложение -- это ведь не только статический бинарник, это часто какие-то дефолтные конфиги, всякие файлы локализации, документация и пр. В экосистемах многих языков (даже С++) можно в рамках штатных инструментов разом собрать практически полный комплект, пригодный для дальнейшей дистрибуции. В Go же постоянно поминается аскетичная идея "просто собрать exe из исходников", а остального как будто нет. Хотя очевидно есть, и мне любопытно как этот момент решается на практике -- возможно через него можно выкрутиться и со сторонними либами.
thefish писал(а):Если сишные зависимости отсутствуют - CGO не нужен.
Но вот тут он, увы, нужен. Если уж на чем терминал мог быть переписан, так максимум это Rust, никак не Go =) (на самом деле с высокой долей вероятности он будет переписан на С). И я бы не сказал, что интероп с С -- это только для особо упертых. Кода с интерфейсом на С много и будет только больше, и невозможность с ним работать лишает язык многого. Переписать на новом языке вообще все -- это утопия, и все они рано или поздно лезут в С за тем, чего нельзя сделать или нерационально переизобретать.
Пытается раскуклиться

Mosha
Сообщения: 2
Зарегистрирован: 08 дек 2019, 10:32

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

Сообщение Mosha » 12 дек 2019, 16:51

Есть ли в планах портирование этой библиотеки под android?

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

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

Сообщение Cfyz » 13 дек 2019, 19:20

Вот именно "портировать" (допилить имеющееся) -- это вряд ли. Очень много сложностей: код работы с оконной системой сильно заточен на обычный десктоп, вывод производится средствами legacy API OpenGL, ну и на тему тач-интерфейсов вообще ничего не было заложено.

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

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

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

Сообщение Apromix » 19 дек 2019, 10:40

Ждем 2.0 :)

Аватара пользователя
Adevald
Сообщения: 2
Зарегистрирован: 25 окт 2019, 06:10

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

Сообщение Adevald » 23 фев 2020, 08:42

Здравствуйте. Я тут чисто за ответом на вопрос. Допустим я захочу использовать эту библиотеку в Rust языке, как и насколько сложно будет адаптировать код под него? Нужно будет написать хедеры под раст?

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

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

Сообщение Apromix » 23 фев 2020, 15:10

Adevald писал(а):
23 фев 2020, 08:42
Нужно будет написать хедеры под раст?
Поиск показал, что уже есть - https://github.com/nabijaczleweli

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

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

Сообщение Cfyz » 05 мар 2020, 13:44

Apromix писал(а):
Adevald писал(а):Нужно будет написать хедеры под раст?
Поиск показал, что уже есть - https://github.com/nabijaczleweli
Кстати, на crates.io даже есть bear-lib-terminal-sys (тонкая обертка над либой) и bear-lib-terminal (с некоторыми дополнениями). Что делать, ежели дойдет до официального пакета? =)

На чуть более отвлеченную тему. Не все один-к-одному на Rust перекладывается. С обычными функциями просто, но вот предположим сущность типа виджета: непонятно ни как обыграть в терминах Rust получение "родительского" и "дочерних" виджетов, ни что делать с вроде как фундаментальными в Rust гарантиями владения. Виджет же живет в библиотеке и параллельный доступ там язык проверить не сможет. Допускаю, что это вообще невозможно, порты UI-фреймворков заметают эти моменты под ковер, а предлагаемое корректное решение через ECS выглядит не менее радикально отличным от привычного, чем сам Rust.

Пусть и меньшие, но все-таки непонятки есть и с другими языками >_<. Например как представить виджет в С++: value-type, shared_ptr, тип с семантикой ссылки? В Go вроде и объект с методами, а по факту больше на С похоже. Вероятно придется взять что-то общее (которое с семантикой ссылки) и приоритет отдать однообразию поведения нежели идиоматичности. Если уж все равно нюансы будут, пусть хоть плюс-минус одни и те же =).
Пытается раскуклиться

Аватара пользователя
Adevald
Сообщения: 2
Зарегистрирован: 25 окт 2019, 06:10

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

Сообщение Adevald » 08 мар 2020, 15:45

Cfyz писал(а):
05 мар 2020, 13:44
Что делать, ежели дойдет до официального пакета? =)
Ух блин, у меня ещё и выбор есть! И что же из этого более работоспособное?
Cfyz писал(а):
05 мар 2020, 13:44
На чуть более отвлеченную тему. Не все один-к-одному на Rust перекладывается. С обычными функциями просто, но вот предположим сущность типа виджета: непонятно ни как обыграть в терминах Rust получение "родительского" и "дочерних" виджетов, ни что делать с вроде как фундаментальными в Rust гарантиями владения. Виджет же живет в библиотеке и параллельный доступ там язык проверить не сможет. Допускаю, что это вообще невозможно, порты UI-фреймворков заметают эти моменты под ковер, а предлагаемое корректное решение через ECS выглядит не менее радикально отличным от привычного, чем сам Rust.
А вот это конечно дело не хорошее. Я тоже думал пришлось бы писать толстые заголовки для проброса и разрешения всяких конфликтов с типами данных и прочим, но чтобы прямо такое... Вообще я сам хотел использовать ECS, что означало бы что пришлось за основу бы брать код крейтов, а потом уже перепиливать его под эту либу. Тяжко конечно.

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

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

Сообщение Apromix » 31 мар 2020, 07:30

Захотелось мне попитонить с помощью берлибтерминал и вот на какую замечательную библиотечку я наткнулся https://github.com/joekane/bltGui. Питонщики - принимайте на заметку :D

Изображение

Risto
Сообщения: 3
Зарегистрирован: 20 ноя 2020, 05:19

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

Сообщение Risto » 20 ноя 2020, 05:37

У меня пара вопросов, после прочтения документации:
1. Как мне следует действовать, если один и тот же символ должен заменяться разными тайлами в зависимости от соседних символов (например, углы стен)?
1.1. Что призойдёт если я задам один тайл символа, выведу символ через print, задам другой тайл того же символа и выведу этот же символ через print повторно, но в других координатах? Отрисуется дважды второй тайл, или два разных?
2. Могу ли я определить несколько кодовых страниц для совместного использования? Иначе говоря, повторный вызов terminal_set полностью переопределит используемую кодовую страницу, переопределит только те символы, коды которых совпадают и определи отсутствующие, или не приведёт вообще ни к чему?
2.1 Или для совместного использования нескольких шрифтов надо их ручками объединять и писать кодовую страницу?

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

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

Сообщение Cfyz » 21 ноя 2020, 15:30

Интересные вопросы!

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

Можно упростить себе задачу опретелив набор тайлов с такими кодами, чтобы их можно было сконструировать механически. Например в случае углов стен у тайла может быть 8 соседей. Если закодировать наличие или отсутствие стен рядом восемью битами, то тайлсета из 256 значений хватит на все возможные случаи, а вычислить какой именно нужно использовать для конкретной ячейки будет тривиально, собрав его номер из отдельных бит.

1.1. Настройка символов-тайлсетов это глобальная конфигурация. Что в итоге было наконфигурировано к моменту отрисовки, то и будет использоваться. То есть ответ -- два одинаковых тайла.

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

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

2. Если же речь идет о том, чтобы именно что печатать текст разными шрифтами одновременно, то тут немного похитрее. Как минимум надо как-то донести до библиотеки что вот эта "A" -- это другая "A", не выводить же текст как тайлы по вычисляемым номерам. Придется заполнить в настройках отдельные "шрифты" -- те самые отдельные таблицы Юникода, упомянутые выше.

Каждый "шрифт" настраивается отдельно и независимо друг от друга, посредством указания произвольно выбранного имени перед параметрами тайлсета, например

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

runic font: runic.png, size=8x16, codepage=437; runic 0x5E: runic_circumflex.png
А переключаются шрифты командой terminal_font (упущенной в документации) и тегом "[font=name]" в terminal_print, см. Samples/MultipleFonts.cpp
Пытается раскуклиться

BigPigMoon
Сообщения: 1
Зарегистрирован: 22 сен 2019, 06:08

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

Сообщение BigPigMoon » 23 ноя 2020, 05:06

Не знаю, возможно, уже кто-то писал. Решил попробовать использовать библиотеку с C#. Столкнулся с проблемой, что библиотека использует ContentAlignment, а .net новых версий, то ли не имеет такую штуку, то ли не знает, где ее искать.

Когда переключил версию .net на другую версию ( 4.8 ) все заработало, перестал сыпать ошибки.

Я новичок в .net и не знаю можно ли это исправить или нет, но решил отписаться, если кто-то с этим столкнется.

Ответить

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

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