BearLibTerminal - псевдоконсольное окно для рогалика
Модератор: Apromix
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Да я просто в юните ансишные версии функций затолкал в скобки комментариев, чтобы не мучаться.
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Или вы что-то путаете, или я совсем не понимаю как это работает =_=Maelstraz писал(а):Инстарепорт: Лазарь не может определить, какую функцию terminal_print() из двух ему использовать, ансишную или юникодную.
Скрытый текст: ПОКАЗАТЬ
Пытается раскуклиться
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Кстати, кто-то жаловался, что не помешает плавное перемещение спрайтов по терминалу?
Выход элементарен, пусть и является костылём - просто выставляем в настройках размер шрифта поменьше, а сам терминал расширяем до нужного разрешения - и, вуаля, спрайты ползают по экрану с куда большей точностью, знакомест-то вагон и маленькая тележка. А дальше проблема исключительно в допиливании кода, который позволит этому великолепию вменяемо отображаться. Ну, и муторная механическая работа в посимвольном добавлении "больших" букв, потому что размер нормального шрифта мы сделали крохотным и он уже никуда не подойдёт.
А дальше хоть своего мегамена пили. :3
Выход элементарен, пусть и является костылём - просто выставляем в настройках размер шрифта поменьше, а сам терминал расширяем до нужного разрешения - и, вуаля, спрайты ползают по экрану с куда большей точностью, знакомест-то вагон и маленькая тележка. А дальше проблема исключительно в допиливании кода, который позволит этому великолепию вменяемо отображаться. Ну, и муторная механическая работа в посимвольном добавлении "больших" букв, потому что размер нормального шрифта мы сделали крохотным и он уже никуда не подойдёт.
А дальше хоть своего мегамена пили. :3
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Когда будет справка? хотя бы по этим долбонутым (а по другому я не знаю как их назвать) конфигам через строчку (terminal_options)? Хотел поэксперементировать с загрузкой шрифта - и не знаю что вводить...
Я тут вот с каким вопросом - как узнать по количеству знакомест и размеру шрифта, какого размера будет окно? Ну то есть чтобы вон тот фон который в демке подгонять под размеры... Потому что у меня 17 широкоформатный монитор, мне при стандартном размере окна ничего не видно. Я сначала решил увеличить размер. Вообщем ваш пример имеет размер 640х400. Это при 80х25 знакомест. Нехитро подсчитав можно понять что размер шрифта
640/80=8
400/25=16
Теперь я пишу так
(правильно хоть шрифт описываю то?)
По предыдущим расчетам должно было быть
80*12=960
25*12*2=600.
Ну, я так подсчитал по предыдущему, потому что доки ведь нет, вот и гадай
Вот только нифига не так, размер окна 720х472.
Так, делю
720/80=9
472/25=18,88
Что за фигня? В терминале есть возможность узнать текущую высоту и ширину символа?
Если что, мне надо как-то получить окно, хотя бы близкое к 800х600 и к 1024х768 (то есть с возможностью выбирать одно из этих двух), и соответственно большим (то есть ну ни как не размером шрифта
Написал размер шрифта 16
Размер окна 960х624
960/80=12
624/25=24,96
Почему размер шрифта не совпадает с введенным?
Вопрос второй, получается, что при таких расширениях выкидывается полноэкранность, ибо там будут проблемы с такими расширениями?
Я тут вот с каким вопросом - как узнать по количеству знакомест и размеру шрифта, какого размера будет окно? Ну то есть чтобы вон тот фон который в демке подгонять под размеры... Потому что у меня 17 широкоформатный монитор, мне при стандартном размере окна ничего не видно. Я сначала решил увеличить размер. Вообщем ваш пример имеет размер 640х400. Это при 80х25 знакомест. Нехитро подсчитав можно понять что размер шрифта
640/80=8
400/25=16
Теперь я пишу так
Код: Выделить всё
terminal_options("font.name=media/consola.ttf; font.size=%d; font.mode=lcd", 12);
По предыдущим расчетам должно было быть
80*12=960
25*12*2=600.
Ну, я так подсчитал по предыдущему, потому что доки ведь нет, вот и гадай
Вот только нифига не так, размер окна 720х472.
Так, делю
720/80=9
472/25=18,88
Что за фигня? В терминале есть возможность узнать текущую высоту и ширину символа?
Если что, мне надо как-то получить окно, хотя бы близкое к 800х600 и к 1024х768 (то есть с возможностью выбирать одно из этих двух), и соответственно большим (то есть ну ни как не размером шрифта
Написал размер шрифта 16
Код: Выделить всё
terminal_options("font.name=media/consola.ttf; font.size=%d; font.mode=lcd", 16);
960/80=12
624/25=24,96
Почему размер шрифта не совпадает с введенным?
Вопрос второй, получается, что при таких расширениях выкидывается полноэкранность, ибо там будут проблемы с такими расширениями?
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Скрытый текст: ПОКАЗАТЬ
Но вообще, лучше дождаться Cfyz'а, он объяснит.
Последний раз редактировалось Феникc 30 сен 2013, 04:44, всего редактировалось 1 раз.
Всё вышесказанное - ИМХО, если не указано обратное.
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Спс.
И как я и говорю, эта дебильная система конфигов, до такой степени узерфрендли, что без документации тупо не понятно что, куда и как. (если вдруг что, я когда пишу код, я закрываю все, в том числе и браузер, поэтому у меня нет справки с вики). Но автору она нравится, так что придется дальше жрать кактус. Видать о совете писать код так чтобы он сам себя документировал, автор никогда не слышал. Каким макаром я должен был догадаться что дефайны (по сути константа) VK_CELL_WIDTH и VK_CELL_HEIGHT нужно передать в какую-то функцию (чье имя не дает подсказку) terminal_state() чтобы получить искомое, а самое главное как понять что я получил. И конечно же он никогда не слышал о втором совете - каждая функция должна делать ровно одну задачу и должна быть как можно меньшего размера вплоть (в идеале) до 1 строки (если что книга "Идеальный код", а также тыщи других по рефакторингу). Нет, вместо этого нужно было сделать одну универсальную. Ведь пользователю так лень запомнить что размер ширины символа можно получить через:
поэтому сделаем одну функцию terminal_state(), пусть мучается.
И как я и говорю, эта дебильная система конфигов, до такой степени узерфрендли, что без документации тупо не понятно что, куда и как. (если вдруг что, я когда пишу код, я закрываю все, в том числе и браузер, поэтому у меня нет справки с вики). Но автору она нравится, так что придется дальше жрать кактус. Видать о совете писать код так чтобы он сам себя документировал, автор никогда не слышал. Каким макаром я должен был догадаться что дефайны (по сути константа) VK_CELL_WIDTH и VK_CELL_HEIGHT нужно передать в какую-то функцию (чье имя не дает подсказку) terminal_state() чтобы получить искомое, а самое главное как понять что я получил. И конечно же он никогда не слышал о втором совете - каждая функция должна делать ровно одну задачу и должна быть как можно меньшего размера вплоть (в идеале) до 1 строки (если что книга "Идеальный код", а также тыщи других по рефакторингу). Нет, вместо этого нужно было сделать одну универсальную. Ведь пользователю так лень запомнить что размер ширины символа можно получить через:
Код: Выделить всё
GetWidthCellInPixel();
Последний раз редактировалось warchief 30 сен 2013, 04:51, всего редактировалось 1 раз.
Re: BearLibTerminal - псевдоконсольное окно для рогалика
По моему, ты малость не справедлив к автору. Ну да, без доков опции вряд ли задашь (особенно если это первый проект на BearLibTerminal), но это требуется лишь раз, в начале программы. И этот один раз можно написать и с открытым браузером.
Хотя мне тоже больше импонирует подход аля HGE, но и там без документации сложно. К тому же я не знаю как у других языков с функциями с переменным числом параметров, так что кроссязычность может и пострадать.
Хотя мне тоже больше импонирует подход аля HGE, но и там без документации сложно. К тому же я не знаю как у других языков с функциями с переменным числом параметров, так что кроссязычность может и пострадать.
Всё вышесказанное - ИМХО, если не указано обратное.
Re: BearLibTerminal - псевдоконсольное окно для рогалика
>>По моему, ты малость не справедлив к автору. Ну да, без доков опции вряд ли задашь (особенно если это первый проект на BearLibTerminal), но это требуется лишь раз, в начале программы
Мне тоже автор говорил что в начале. Только почему-то я до сих пор натыкаюсь на эти конфиги, то там, то сям
Почему нельзя для каждого параметра сделать свой гет и сет? Тогда достаточно будет глянуть в исходники чтобы сразу понять что и где и как настраивать
Мне тоже автор говорил что в начале. Только почему-то я до сих пор натыкаюсь на эти конфиги, то там, то сям
Зачем нужны функции с переменным числом параметров? (кстати, в винде это источник уязвимости и не рекомендуется, даже иногда варнинг проскакивает вроде) В консоли миллион параметров что-ли? Если пользователю нужно, пусть сверху сам напишетК тому же я не знаю как у других языков с функциями с переменным числом параметров, так что кроссязычность может и пострадать.
Почему нельзя для каждого параметра сделать свой гет и сет? Тогда достаточно будет глянуть в исходники чтобы сразу понять что и где и как настраивать
Re: BearLibTerminal - псевдоконсольное окно для рогалика
На мой взгляд, необходимость вызывать функцию несколько раз может возникнуть только для трёх параметров:
И в любом случае, если тебе так припекает, да напиши ты эти геты и сеты сам, на десять минут делов-то.
Остальные параметры обычно задаются раз и навсегда. Зачем на лету менять шрифт или размер окна кроме как для демонстрации?input.events keypress Фильтр событий ввода, комбинация из флагов none, keypress, keyrelease, mousemove, mousescroll, all.
input.timeout infinite Таймаут ожидания события ввода: infinite, immediate или численное значение в миллисекундах.
input.precise_mousemove false Флаг, указывающий, будет ли считаться движением мыши попиксельное (true) или познакоместное (false) перемещение указателя.
И в любом случае, если тебе так припекает, да напиши ты эти геты и сеты сам, на десять минут делов-то.
Всё вышесказанное - ИМХО, если не указано обратное.
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Я и так вместо игры до сих пор пишу оболочку над этим всем (хотя больше ради того чтобы потом если совсем припечет, выкинуть безболезненно, заменив чем-нибудь другим).
>>Зачем на лету менять шрифт или размер окна кроме как для демонстрации?
Заголовки, названия меню
А так, не считая этой проблемы с конфигами пока все нравится. Ну ладно, пойду дальше писать код
>>Зачем на лету менять шрифт или размер окна кроме как для демонстрации?
Заголовки, названия меню
А так, не считая этой проблемы с конфигами пока все нравится. Ну ладно, пойду дальше писать код
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Ха, какой занятный хак, мне даже в голову не приходило. Но нет =). Размер терминала в знакоместах ограничен 256x256, в том числе, чтобы оставить место для оптимизаций. В следующей версии будет менее костыльная возможность.Maelstraz писал(а):Кстати, кто-то жаловался, что не помешает плавное перемещение спрайтов по терминалу?
Выход элементарен, пусть и является костылём - просто выставляем в настройках размер шрифта поменьше, а сам терминал расширяем до нужного разрешения
Внешний размер окна узнать нет никакой возможности. Внутренний размер окна, как уже отмечалось, может быть получен через размер окна в знакоместах и размер знакоместа (VK_CELL_WIDTH/VK_CELL_HEIGHT).warchief писал(а):Я тут вот с каким вопросом - как узнать по количеству знакомест и размеру шрифта, какого размера будет окно? Ну то есть чтобы вон тот фон который в демке подгонять под размеры...
warchief писал(а):Почему размер шрифта не совпадает с введенным?
Тут такое дело, что "размер шрифта" это понятие весьма субъективное. Пусть размер шрифта -- 12 пикселей. Двенадцать пикселей где? В любом шрифте есть буквы весьма разной высоты. Где-то самая крупная это A, но часто f или k чуть выше ее, а еще есть символы вроде Ґ (кириллический, между прочем, символ), явно более длинные, чем остальные. Так от каких букв отсчитывать размер -- строчных, прописных, по медиане, по выносным элементам? Далее, буквы нельзя лепить граница к границе. Есть f, которая выступает вверх, а есть и j, которая выступает вниз. Размеры этих выносов являются свойством конкретного шрифта и даже если взять два шрифта такого размера, чтобы их медиана была одинакова, выносы будут разные. Аналогично с шириной, но она у поддерживаемых терминалом моноширинных шрифтов хотя бы [как правило] одинаковая у всех символов. Итого, заранее сказать какого размера будет знакоместо невозможно, в зависимости от шрифта оно будет любого размера.Феникс писал(а):ЕМНИП, размер шрифта измеряется в пунктах (кои есть ~1/72 дюйма), а не в пикселях. И "размер шрифта" - это (ЕМНИП №2) средняя высота букв, а не максимальный их размер.
В следующей версии будет возможность задать размер шрифта "подгоном", т. е. сказать, что знакоместо будет такого-то размера, а терминал попытается выбрать размер шрифта максимального влезающего размера. Однако качество результата нельзя гарантировать из-за соблюдения пропорций и хинтинга.
Это просто несерьезно. На протяжении треда я неоднократно обосновывал свой выбор. Кроме того, слишком много субъективности и откровенных придирок к мелочам.warchief писал(а):И как я и говорю, эта дебильная система конфигов, до такой степени узерфрендли, что без документации тупо не понятно что, куда и как. (если вдруг что, я когда пишу код, я закрываю все, в том числе и браузер, поэтому у меня нет справки с вики). Но автору она нравится, так что придется дальше жрать кактус. Видать о совете писать код так чтобы он сам себя документировал, автор никогда не слышал. Каким макаром я должен был догадаться что дефайны (по сути константа) VK_CELL_WIDTH и VK_CELL_HEIGHT нужно передать в какую-то функцию (чье имя не дает подсказку) terminal_state() чтобы получить искомое, а самое главное как понять что я получил. И конечно же он никогда не слышал о втором совете - каждая функция должна делать ровно одну задачу и должна быть как можно меньшего размера вплоть (в идеале) до 1 строки (если что книга "Идеальный код", а также тыщи других по рефакторингу). Нет, вместо этого нужно было сделать одну универсальную. Ведь пользователю так лень запомнить что размер ширины символа можно получить через:поэтому сделаем одну функцию terminal_state(), пусть мучается.Код: Выделить всё
GetWidthCellInPixel();
Если ты закрываешь все, в том числе и браузер и у тебя даже нет справки с вики, то тебе придется жрать свой кактус еще долго. API любого программного продукта требует документации. В С/С++ контекстная справка до сих пор не является идиоматической и практически никакая IDE не подскажет ничего. Открой MSVS, набери CreateFile, поставь скобку и посмотри сколько именно справки выдаст тебе IDE по той куче флагов и параметров, что эта функция принимает. Не нравится WinAPI, можешь попробовать функции POSIX (варианты второго параметра вызова fopen), boost, STL. Или даже совсем сторонние библиотеки, например что означает flags в TCOD_console_set_custom_font или state в HGE/System_SetStateBool? Смирись, писать без справки под рукой это бессмысленная бравада.
Самодокументируемый код -- это ты что-то явно путаешь. Вот несамодокументируемый код:
Код: Выделить всё
int set_blocking_mode(int s, int v)
{
return ioctl(s, FIONBIO, &v);
}
Код: Выделить всё
int set_socket_blocking_mode(int socket_fd, bool nonblocking)
{
int option_value = nonblocking;
return ioctl(socket_fd, FIONBIO, &option_value);
}
И конечно же автор слышал о том, что каждый инструмент должен выполнять одну задачу и выполнять ее хорошо, Unix-way, все дела. terminal_state выполняет одну конкретную задачу: доступ к текущему состоянию некоторых переменных терминала (при необходимости с учетом очереди ввода). И выполняет эту задачу хорошо.
Потому что это бессмысленно замусорит API библиотеки. Не надо смотреть в исходники, надо смотреть максимум в хидер, а лучше в доки. Доки правда не ах пока, либа все еще в стадии беты.warchief писал(а):Почему нельзя для каждого параметра сделать свой гет и сет? Тогда достаточно будет глянуть в исходники чтобы сразу понять что и где и как настраивать
Если тебе психологически сложно принять чужой выбор и необходимо за что-то зацепиться, то могу привести такой аргумент. Пять параметров (треть доступных) принимает строку в качестве значения. Так как библиотека динамическая и может быть использована из разных языков, это требует трех вариантов вызова для каждого строкового аргумента -- ANSI/UTF-8 (С/C++, многие скрипты), UTF-16 (C/C++ под Windows, Pascal, C#), UTF-32 (C/C++ под Linux). Задание через один вызов позволяет удержать это в рамках разумного (да, сейчас вызовов два, char* и wchar_t*; в следующей версии их будет три).
Найти в этом треде остальную аргументацию в пользу выбранного подхода я оставлю в качестве домашнего задания.
Названия меню?warchief писал(а):>>Зачем на лету менять шрифт или размер окна кроме как для демонстрации?
Заголовки, названия меню
Пытается раскуклиться
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Нет, не требует, вся документация прямо в коде. это и есть самодокументирующий код. тем более современная документация после появления всяких doxygen, суть тот же самый кодAPI любого программного продукта требует документации.
В этих местах мне не нужна справкаВ С/С++ контекстная справка до сих пор не является идиоматической и практически никакая IDE не подскажет ничего. Открой MSVS, набери CreateFile, поставь скобку и посмотри сколько именно справки выдаст тебе IDE по той куче флагов и параметров, что эта функция принимает. Не нравится WinAPI, можешь попробовать функции POSIX (варианты второго параметра вызова fopen), boost, STL
А я об этом и говорю, ведь легко читать, это означает легко понять для чего он написан. Стейты такими не являются.Возможно, не самый лучший пример, но уж что было под рукой. Во втором варианте по коду понятно что означают параметры функции, очевидно какое входное значение к чему приводят. Самодокументируемый код -- это тот, который легко читать, а не тот, который легко писать.
Нет, он меняет свое поведение (возвращает значения в разных контекстах), то есть неоднозначна. Нельзя быть уверенным что именно вернет (даже если это в инте), особенно если ты вдруг что-нибудь там изменишьterminal_state выполняет одну конкретную задачу: доступ к текущему состоянию некоторых переменных терминала (при необходимости с учетом очереди ввода)
И при чем тут стейты?Если тебе психологически сложно принять чужой выбор и необходимо за что-то зацепиться, то могу привести такой аргумент. Пять параметров (треть доступных) принимает строку в качестве значения. Так как библиотека динамическая и может быть использована из разных языков, это требует трех вариантов вызова для каждого строкового аргумента -- ANSI/UTF-8 (С/C++, многие скрипты), UTF-16 (C/C++ под Windows, Pascal, C#), UTF-32 (C/C++ под Linux). Задание через один вызов позволяет удержать это в рамках разумного (да, сейчас вызовов два, char* и wchar_t*; в следующей версии их будет три).
Если я хочу сделать пункты меню большим шрифтом чем осталнойНазвания меню?
Re: BearLibTerminal - псевдоконсольное окно для рогалика
So close.Cfyz писал(а):Но нет =). Размер терминала в знакоместах ограничен 256x256
Буквы верхнего регистра для слабаков?warchief писал(а):Если я хочу сделать пункты меню большим шрифтом чем остальное
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Ну что значит не требует, я выше привел пример API которые именно требуют. И doxygen тут не сильно помогает, документация-в-коде попросту позволит тебе автоматически сгенерировать документацию-не-в-коде.warchief писал(а):Нет, не требует, вся документация прямо в коде. это и есть самодокументирующий код. тем более современная документация после появления всяких doxygen, суть тот же самый код
Не слишком субъективно? В этих местах не нужна и можно без справки, а в этом нужна и что за безобразный несамодокументируемый код? Или, быть может, ты утверждаешь, что во всех перечисленных случаях ты обойдешься без документации?warchief писал(а):В этих местах мне не нужна справка
Чем в плане читаемости terminal_get_cell_width() фундаментально отличается от terminal_state(VK_CELL_WIDTH)? Первое выглядит чуть глаже, но большая общность механизма перевешивает.warchief писал(а):А я об этом и говорю, ведь легко читать, это означает легко понять для чего он написан. Стейты такими не являются.
Кроме того, как было отмечено выше, если уж очень хочется иного наименования, то долго ли написать inline terminal_get_cell_width() {return terminal_state(VK_CELL_WIDTH);}?
Пожалуйста, пример неоднозначности, где вызов меняет свое поведение. Что именно вернет, можно быть уверенным, это документировано (ссылка); рано или поздно будут и doxygen-комментарии, где будет наисано то же самое, только покороче и на английском.warchief писал(а):Нет, он меняет свое поведение (возвращает значения в разных контекстах), то есть неоднозначна. Нельзя быть уверенным что именно вернет (даже если это в инте), особенно если ты вдруг что-нибудь там изменишь
Как ты с такой памятью без документации обходишься-то? =)warchief писал(а):И при чем тут стейты?Cfyz писал(а):Если тебе психологически сложно принять чужой выбор и необходимо за что-то зацепиться, то могу привести такой аргумент. Пять параметров (треть доступных) принимает строку в качестве значения. <...>
Cfyz писал(а):warchief писал(а):хотя бы по этим долбонутым (а по другому я не знаю как их назвать) конфигам через строчку (terminal_options)?warchief писал(а):И как я и говорю, эта дебильная система конфигов, до такой степени узерфрендли, что без документации тупо не понятно что, куда и как.Если тебе психологически сложно принять чужой выбор и необходимо за что-то зацепиться, то могу привести такой аргумент. Пять параметров (треть доступных) принимает строку в качестве значения. <...>warchief писал(а):Почему нельзя для каждого параметра сделать свой гет и сет? Тогда достаточно будет глянуть в исходники чтобы сразу понять что и где и как настраивать
Тут мутный момент. Помимо некоторых технологических сложностей, я попросту не очень понимаю как такое должно работать. Было бы неплохо, если бы ты сделал мокап в пейнте как это, по-твоему, должно выглядеть -- обязательно с расчерченной сеткой знакомест. Потому что если на экране есть и большие буквы, и маленькие, то либо большие будут залезать друг на друга, либо маленькие будут расставлены реже обычного.warchief писал(а):Если я хочу сделать пункты меню большим шрифтом чем осталной
Пытается раскуклиться
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Возможность указывать не только координаты знакоместа для тайла, но и величину попиксельного смещения?Cfyz писал(а):В следующей версии будет менее костыльная возможность.
Если да, то это будет законченный шедевр.
И я навеки увязну в создании йоба-эффектов.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 15 гостей