BearLibTerminal - псевдоконсольное окно для рогалика
Модератор: Apromix
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Да, мой косяк Не в том месте изменял фильтр. Поставил в метод, который не вызывается. Сейчас все норм)
Стоит только захотеть...
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Хочу стереть текст с экрана по нажатию на кнопку мышки.
Текст не стирается.
Я что-то неправильно делаю или внутрях что-то сломалось?
Win10x64
python3.5.2 + pip install bearlibterminal
visual studio 2015, dll взял x86
Текст не стирается.
Я что-то неправильно делаю или внутрях что-то сломалось?
Win10x64
python3.5.2 + pip install bearlibterminal
visual studio 2015, dll взял x86
Скрытый текст: ПОКАЗАТЬ
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Не очищается потому, что нажатие мыши приложением вовсе не регистрируется, так как мышь по умолчанию "выключена". Чтобы terminal_read() возвращал TK_MOUSE_xxx, надо включить это посредством:См. описание опции input.filter.
Еще мимоходом замечу, что выполнять terminal_read() только после проверки terminal_has_input() чревато 100% потреблением одного ядра CPU: когда ввода нет, приложение будет молотить одни terminal_refresh() без устали. В данных примерах этого не видно из-за включенной по умолчанию вертикальной синхронизации, но если в цикле будет выполняться больше работы или настройки у пользователя будут нестандартные, может выйти неаккуратно. Какого-то универсального варианта тут все равно нет, может так и задумано 60-80 раз в секунду перерисовывать, просто стоит иметь в виду и строить циклы соответствующе.
Код: Выделить всё
terminal_set("input.filter=[keyboard, mouse]");
Еще мимоходом замечу, что выполнять terminal_read() только после проверки terminal_has_input() чревато 100% потреблением одного ядра CPU: когда ввода нет, приложение будет молотить одни terminal_refresh() без устали. В данных примерах этого не видно из-за включенной по умолчанию вертикальной синхронизации, но если в цикле будет выполняться больше работы или настройки у пользователя будут нестандартные, может выйти неаккуратно. Какого-то универсального варианта тут все равно нет, может так и задумано 60-80 раз в секунду перерисовывать, просто стоит иметь в виду и строить циклы соответствующе.
Пытается раскуклиться
- Apromix
- Мастер
- Сообщения: 1236
- Зарегистрирован: 04 июл 2011, 10:44
- Откуда: Украина, Черновцы
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
А как лучше? Вот у меня вроде так же:Cfyz писал(а):выполнять terminal_read() только после проверки terminal_has_input() чревато 100% потреблением одного ядра CPU: когда ввода нет, приложение будет молотить одни terminal_refresh() без устали
Скрытый текст: ПОКАЗАТЬ
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Я считал фпс так: измерял время, необходимое для совершения одного игрового цикла и делил 1000 на это время.
На c# это позволяет класс Stopwatch. У меня получалось 62 кадра в секунду с vsync
Если говорить об отрисовке каждый цикл, то метод Output.Refresh() проверяет свой список List<Canvas> EnabledCanvases (Canvas - класс, содержащий списки GraphicTile'ов в двумерном массиве. В двух словах - полотно для интерфейса) на наличие изменений в его двумерном массиве из cписков GraphicTile'ов. Если изменения есть, то этот Canvas отправляется в output.Draw(Canvas cnvs). Там, пробегая по массиву GraphicTile'ов, он проверяет у каждый структуры GraphicTile флаг Changed и если он true, то тайл рисуется, при этом значение Changed выставляется в False. У этой же структуры есть поля с сеттерами для offset, charCode и color (каждый сеттер проверяет: если устанавливаемое значение отличается от нынешнего, то Changed также выставляется в true). Таким образом, терминал совершает ф-цию PutExt() только тогда, когда меняется GraphicTile. Ну, это упрощенно выглядит так. В коде же все несколько иначе... Если интересно, то:
Структура графического тайла.
Метод отрисовки.
Ну и для полноты картины Canvas
На c# это позволяет класс Stopwatch. У меня получалось 62 кадра в секунду с vsync
Код: Выделить всё
Stopwatch sWatch = new Stopwatch();
while (<someCondition>)
{
sWatch.Start ();
Input.Read ();
Output.Refresh();
sWatch.Stop();
Console.WriteLine ((1000/sWatch.ElapsedMilliseconds).ToString());
sWatch.Reset();
}
Структура графического тайла.
Скрытый текст: ПОКАЗАТЬ
Скрытый текст: ПОКАЗАТЬ
Скрытый текст: ПОКАЗАТЬ
Стоит только захотеть...
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Все зависит от желаемого поведения. Легче всего вызывать terminal_read() каждую итерацию, это если анимация сцены не нужна. Ну а если же хочется постоянно выполняющегося цикла, то с ним надо аккуратнее и желательно ограничивать частоту обработки/отрисовки некоторым разумным пределом. Это, само собой, не что-то специфичное терминалу.Apromix писал(а):А как лучше? Вот у меня вроде так же
В приведенном коде все в порядке: есть пауза в минимум 1 мс (т. е. уже не более 100 FPS) и, если я понял правильно, обсчет производится только раз в каждые 60 итераций. Но по традиции придраться хотя бы раз к каждому куску кода, могу предложить чуть другую формулировку таймера:
Код: Выделить всё
now := GetTickCount;
if now >= NextUpdateTime then begin
Saga.Stages.Timer;
NextUpdateTime := now + 60;
end;
Хм, вообще-то можно переложить работу по выполнению небольшой паузы в конце цикла на библиотеку. Всего-то надо сделать, чтобы terminal_refresh() "досыпал" итерацию до нужного (разумеется, задаваемого) FPS.
Вывести из имеющихся данных? Я чаще всего считаю фреймы, отрисованные/обработанные за секунду. NextFramerateUpdate := now + 1000, если по аналогии с кодом выше. Вывести на экран? Ну тут выбор широкий, можно аккуратно в заголовок окна приписать.Apromix писал(а):И еще: как вывести fps?
Одна итерация дает большую погрешность (и чем выше скорость работы, тем больше скачет). Обычно отталкиваются от времени. Раз измеряется frames per second, то и считают количество фреймов, отрисованных за одну секунду. Это тоже не идеальный способ, но как правило хватает =).Loinon писал(а):Я считал фпс так: измерял время, необходимое для совершения одного игрового цикла и делил 1000 на это время.
Ну, тут речь шла больше про то, что если цикл не ограничивать, то он всегда будет что-то делать и съест CPU. А terminal_refresh() в текущем виде ничего не ограничивает.Loinon писал(а):Если говорить об отрисовке каждый цикл, <...> Таким образом, терминал совершает ф-цию PutExt() только тогда, когда меняется GraphicTile.
Ваша придирка такова:Loinon писал(а):В коде же все несколько иначе... Если интересно, то
Код: Выделить всё
bool changedList = cnvs.MultiTiles[x, y].Any(tile => tile.Changed);
Пытается раскуклиться
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Хорошая придирка : )) Вообще, весь код надо рефакторить у себя и закоментить...
Стоит только захотеть...
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Думаю, тогда можно сделать так, чтобы рефрешилось только при изменении хотя бы одного какого либо тайла в методе по отрисовке. В реалтайм игре тогда останется только Terminal.Read() после HasInput().Cfyz писал(а):Ну, тут речь шла больше про то, что если цикл не ограничивать, то он всегда будет что-то делать и съест CPU. А terminal_refresh() в текущем виде ничего не ограничивает.
Последний раз редактировалось Loinon 20 ноя 2016, 21:29, всего редактировалось 3 раза.
Стоит только захотеть...
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Несколько размышлений по поводу враппера на с# есть.
Думаю, имеет смысл парсить в методе Terminal.Set () аргументы форматированной строки в понятный для либы формат. Чтобы можно было писать Terminal.Set("window.size = {0}", Settings.Default.ScreenSize). То же с булевым значением.
То же самое с Terminal.Get ()...
Еще подстроил под себя некоторые методы, изменил формальные параметры с int x и int y на Point position:
Думаю, еще было бы здорово закомментировать XML-комментариями каждый метод кратким описанием.
Думаю, имеет смысл парсить в методе Terminal.Set () аргументы форматированной строки в понятный для либы формат. Чтобы можно было писать Terminal.Set("window.size = {0}", Settings.Default.ScreenSize). То же с булевым значением.
Скрытый текст: ПОКАЗАТЬ
Скрытый текст: ПОКАЗАТЬ
Скрытый текст: ПОКАЗАТЬ
Скрытый текст: ПОКАЗАТЬ
Стоит только захотеть...
- Apromix
- Мастер
- Сообщения: 1236
- Зарегистрирован: 04 июл 2011, 10:44
- Откуда: Украина, Черновцы
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Красиво выглядит на скрине, но придется держать 2 копии враппера на разных языках (я имею ввиду человечьи - русский и английский).Loinon писал(а):Думаю, еще было бы здорово закомментировать XML-комментариями каждый метод кратким описанием.
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Апдейт 0.15.0
Основное изменение в том, что раньше функции print()/measure() принимали параметры области вывода и выравнивания довольно мутным образом, через теги форматирования:
Хуже того, они возвращали либо ширину, либо высоту выведенного текста в зависимости от наличия тего bbox.
Теперь print()/measure() принимают параметры обычным образом и всегда возвращают оба измерения строки:
Тайлсетам был добавлен режим выравнивания 'dead-center', который заставляет игнорировать типографические характеристики символов. Это должно быть полезно для использования старых добрых ASCII в качестве элементов карты/уровня, так как они будут выровнены строго по центру:
И прочие изменения-исправления:
* Параметры TrueType-шрифта 'use-box-drawing' и 'use-block-elements' заставят библиотеку использовать эти символы из шрифта.
* Кейпад теперь порождает символы и может быть использован во вводе, например read_str().
* Можно запросить номер версии библиотеки в виде строки посредством terminal_get("version").
* Поправлен маппинг первых 32 символов кодовой страницы CP437 (ранее они просто игнорировались, например в шрифтах libtcod).
* Добавлена поддержка растровых шрифтов в оттенках серого без полупрозрачности (например, шрифты libtcod).
* Установка шрифта без указания размера тайла более не работает (можно было все поломать).
* Небольшие улучшения во враппере C# (перегрузки функций и поддержка Size в функциях Set/Get).
Еще я слегка поменял расположение враппера для Python, теперь прилагается остов пакета (директория с __init__.py, setup.py, вот это все) вместо одного PyBearLibTerminal.py. Впрочем файл или целый пакет все так же можно скопировать себе в проект. См. README.md где есть немного про это (на английском). Копирование директории bearlibterminal лучше тем, что потом легко переключаться между пакетом и локальной копией без изменения кода (импорт идентичен).
Windows / Linux / OS X / PyPi
Основное изменение в том, что раньше функции print()/measure() принимали параметры области вывода и выравнивания довольно мутным образом, через теги форматирования:
Код: Выделить всё
terminal_printf(2, 1, "[bbox=%dx%d][align=center]%s", w, h, str);
Теперь print()/measure() принимают параметры обычным образом и всегда возвращают оба измерения строки:
Код: Выделить всё
y += terminal_print_ext(x, y, width, 0, TK_ALIGN_CENTER, message).height;
И прочие изменения-исправления:
* Параметры TrueType-шрифта 'use-box-drawing' и 'use-block-elements' заставят библиотеку использовать эти символы из шрифта.
* Кейпад теперь порождает символы и может быть использован во вводе, например read_str().
* Можно запросить номер версии библиотеки в виде строки посредством terminal_get("version").
* Поправлен маппинг первых 32 символов кодовой страницы CP437 (ранее они просто игнорировались, например в шрифтах libtcod).
* Добавлена поддержка растровых шрифтов в оттенках серого без полупрозрачности (например, шрифты libtcod).
* Установка шрифта без указания размера тайла более не работает (можно было все поломать).
* Небольшие улучшения во враппере C# (перегрузки функций и поддержка Size в функциях Set/Get).
Еще я слегка поменял расположение враппера для Python, теперь прилагается остов пакета (директория с __init__.py, setup.py, вот это все) вместо одного PyBearLibTerminal.py. Впрочем файл или целый пакет все так же можно скопировать себе в проект. См. README.md где есть немного про это (на английском). Копирование директории bearlibterminal лучше тем, что потом легко переключаться между пакетом и локальной копией без изменения кода (импорт идентичен).
Windows / Linux / OS X / PyPi
Пытается раскуклиться
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Добрый день.
Очень приятная библиотека, спасибо за проделанную работу. Планируется ли в ближайшем будущем доработать поддержку full screen для OS X? И есть ли у библиотеки возможность вернуть разрешение экрана, на котором запускается приложение?
Очень приятная библиотека, спасибо за проделанную работу. Планируется ли в ближайшем будущем доработать поддержку full screen для OS X? И есть ли у библиотеки возможность вернуть разрешение экрана, на котором запускается приложение?
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Да, точно будет, нужно только разобраться со всем этим что на моей корявой виртуальной машине само по себе задача >_<.ssalvador писал(а):Планируется ли в ближайшем будущем доработать поддержку full screen для OS X?
Сейчас нет. Можно добавить пару соответствующих свойств для получения размера некоторого текущего/начального экрана (мне самому пригодится), но полноценная реализация не так проста в свете различных мультимониторных конфигураций.ssalvador писал(а):И есть ли у библиотеки возможность вернуть разрешение экрана, на котором запускается приложение?
Пытается раскуклиться
- Apromix
- Мастер
- Сообщения: 1236
- Зарегистрирован: 04 июл 2011, 10:44
- Откуда: Украина, Черновцы
- Контактная информация:
Re: BearLibTerminal - псевдоконсольное окно для рогалика
А для Java планируется биндинг? Когда ждать его?
Re: BearLibTerminal - псевдоконсольное окно для рогалика
Понял. Если будет рабочий билд, я могу погонять его на своем лаптопе.Да, точно будет, нужно только разобраться со всем этим что на моей корявой виртуальной машине само по себе задача >_<.
Да, это было бы полезно. Пока что приходится выкручиваться с помощью SDL. Вручную писать кросс-платформенное определение я пока что способен осилить.Сейчас нет. Можно добавить пару соответствующих свойств для получения размера некоторого текущего/начального экрана (мне самому пригодится), но полноценная реализация не так проста в свете различных мультимониторных конфигураций.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей