Re: BearLibTerminal - псевдоконсольное окно для рогалика
Добавлено: 03 ноя 2016, 16:57
Да, мой косяк Не в том месте изменял фильтр. Поставил в метод, который не вызывается. Сейчас все норм)
Форум Клуба любителей roguelike-игр
http://www.rlgclub.ru/forum/
Код: Выделить всё
terminal_set("input.filter=[keyboard, mouse]");
А как лучше? Вот у меня вроде так же:Cfyz писал(а):выполнять terminal_read() только после проверки terminal_has_input() чревато 100% потреблением одного ядра CPU: когда ввода нет, приложение будет молотить одни terminal_refresh() без устали
Код: Выделить всё
Stopwatch sWatch = new Stopwatch();
while (<someCondition>)
{
sWatch.Start ();
Input.Read ();
Output.Refresh();
sWatch.Stop();
Console.WriteLine ((1000/sWatch.ElapsedMilliseconds).ToString());
sWatch.Reset();
}
Все зависит от желаемого поведения. Легче всего вызывать terminal_read() каждую итерацию, это если анимация сцены не нужна. Ну а если же хочется постоянно выполняющегося цикла, то с ним надо аккуратнее и желательно ограничивать частоту обработки/отрисовки некоторым разумным пределом. Это, само собой, не что-то специфичное терминалу.Apromix писал(а):А как лучше? Вот у меня вроде так же
Код: Выделить всё
now := GetTickCount;
if now >= NextUpdateTime then begin
Saga.Stages.Timer;
NextUpdateTime := now + 60;
end;
Вывести из имеющихся данных? Я чаще всего считаю фреймы, отрисованные/обработанные за секунду. 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);
Думаю, тогда можно сделать так, чтобы рефрешилось только при изменении хотя бы одного какого либо тайла в методе по отрисовке. В реалтайм игре тогда останется только Terminal.Read() после HasInput().Cfyz писал(а):Ну, тут речь шла больше про то, что если цикл не ограничивать, то он всегда будет что-то делать и съест CPU. А terminal_refresh() в текущем виде ничего не ограничивает.
Красиво выглядит на скрине, но придется держать 2 копии враппера на разных языках (я имею ввиду человечьи - русский и английский).Loinon писал(а):Думаю, еще было бы здорово закомментировать XML-комментариями каждый метод кратким описанием.
Код: Выделить всё
terminal_printf(2, 1, "[bbox=%dx%d][align=center]%s", w, h, str);
Код: Выделить всё
y += terminal_print_ext(x, y, width, 0, TK_ALIGN_CENTER, message).height;
Да, точно будет, нужно только разобраться со всем этим что на моей корявой виртуальной машине само по себе задача >_<.ssalvador писал(а):Планируется ли в ближайшем будущем доработать поддержку full screen для OS X?
Сейчас нет. Можно добавить пару соответствующих свойств для получения размера некоторого текущего/начального экрана (мне самому пригодится), но полноценная реализация не так проста в свете различных мультимониторных конфигураций.ssalvador писал(а):И есть ли у библиотеки возможность вернуть разрешение экрана, на котором запускается приложение?
Понял. Если будет рабочий билд, я могу погонять его на своем лаптопе.Да, точно будет, нужно только разобраться со всем этим что на моей корявой виртуальной машине само по себе задача >_<.
Да, это было бы полезно. Пока что приходится выкручиваться с помощью SDL. Вручную писать кросс-платформенное определение я пока что способен осилить.Сейчас нет. Можно добавить пару соответствующих свойств для получения размера некоторого текущего/начального экрана (мне самому пригодится), но полноценная реализация не так проста в свете различных мультимониторных конфигураций.