Барионикс 0.5.3a

laber.rlgclub.ru

Модератор: Maelstrom

Аватара пользователя
alexbard
Сообщения: 670
Зарегистрирован: 22 апр 2011, 17:15
Откуда: Украина
Контактная информация:

Re: Барионикс 0.5.3a

Сообщение alexbard » 09 фев 2013, 18:06

Cfyz писал(а):И, кстати, тут есть нюанс. Если тебе действительно нужен полноценный интерфейс ОС (текстовые поля, списки-деревья, модальные диалоговые окна, etc.), то в первую очередь придется определиться чем ты будешь делать их. Я имею в виду — WinAPI/упаси-боже-MFC/Windows.Forms/WPF/WxWidgets/GTK+/etc. Именно оконный интерфейс будет устанавливать самые жесткие ограничения; куда, когда и какую графику ты сможешь выводить тоже им будет диктоваться.
Зачем формы, впф и прочее работающее на откровенных костылях в игровом приложении? Ведь есть же прекрасные реализации уже заточенные под конкретный движок. Например, под XNA (а не далеко отсюда и MonoGame c его вариативностью платформ) есть отличная open source библиотека Neoforce... да и не одна она.

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

Re: Барионикс 0.5.3a

Сообщение Cfyz » 09 фев 2013, 18:53

alexbard писал(а):Зачем формы, впф и прочее работающее на откровенных костылях в игровом приложении? Ведь есть же прекрасные реализации уже заточенные под конкретный движок. Например, под XNA (а не далеко отсюда и MonoGame c его вариативностью платформ) есть отличная open source библиотека Neoforce... да и не одна она.
Ну, справедливости ради, следующим же абзацем я как раз пишу про то, что это вредно и не надо так делать. Впрочем, интерфейс в мультимедиа — это всегда головная боль, как ни старайся.

По поводу XNA я, наверное, все-таки минусую. Вероятно, это еще норм, если разработчик хорошо ориентируется в теме и проект есть прямо сейчас, как это в твоем случае. Но XNA прекращен год с четвертью назад, neoforce примерно тогда же. Понятное дело, что ПО не гниет со временем, но в свете косвенного пожелания научиться чему-то актуальному и, в общем-то, не слишком шустрого цикла релизов Baryonix, я бы XNA рекомендовать не стал. Предвосхищая аргумент, что SDL и иже с ними тоже не свежачки, должен заметить, что подобные библиотеки вынуждают практиковать более низкоуровневый и менее завязанный на конкретную платформу подход (код на SDL еще весь .NET переживет, лол).
Cfyz теперь - наглая морда.

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

Re: Барионикс 0.5.3a

Сообщение Uvadzucumi » 09 фев 2013, 19:50

Cfyz писал(а):Предвосхищая аргумент, что SDL и иже с ними тоже не свежачки, должен заметить, что подобные библиотеки вынуждают практиковать более низкоуровневый и менее завязанный на конкретную платформу подход (код на SDL еще весь .NET переживет, лол).
Ну, никто ведь не запрещает SDL2 использовать, который для компиляции Tome требовался пол года назад (что сейчас требуется - не смотрел, но, подозреваю, что никаких довнгрейдов небыло). а то что SDL всех переживет, думаю однозначно факт :)

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

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

Re: Барионикс 0.5.3a

Сообщение Cfyz » 09 фев 2013, 20:36

Uvadzucumi, так как GCC не всех тут заинтересует, да и треду не соответствует, ответил в личку.
Cfyz теперь - наглая морда.

Аватара пользователя
alexbard
Сообщения: 670
Зарегистрирован: 22 апр 2011, 17:15
Откуда: Украина
Контактная информация:

Re: Барионикс 0.5.3a

Сообщение alexbard » 09 фев 2013, 23:21

Cfyz писал(а):Но XNA прекращен год с четвертью назад, neoforce примерно тогда же. Понятное дело, что ПО не гниет со временем, но в свете косвенного пожелания научиться чему-то актуальному и, в общем-то, не слишком шустрого цикла релизов Baryonix, я бы XNA рекомендовать не стал.
MonoGame же! активно себе развивается, охватывает кучу платформ и пытается закрыть собой брешь, открытую очередной глупостью мелкомягких) время для перехода с xna минимально.

ps но если вопрос стоит об актуальности, то выбирать надо Unity ;)

Аватара пользователя
Maelstrom
Мастер
Сообщения: 2062
Зарегистрирован: 26 ноя 2006, 14:19
Откуда: г. Усть-Кирдык
Контактная информация:

Re: Барионикс 0.5.3a

Сообщение Maelstrom » 10 фев 2013, 06:07

метрики для более-менее сложного вывода текста нужно тоже самому хранить и учитывать
что такое "более-менее сложный вывод текста"
Мне для текста нужен от силы автоперенос и раскрашивание произвольной части текста в произвольный цвет.

Лепить окна не собираюсь, всё в одном будет.
Айв кнгенгах Йог-Сотот

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

Re: Барионикс 0.5.3a

Сообщение Uvadzucumi » 10 фев 2013, 07:43

Maelstrom писал(а):Мне для текста нужен от силы автоперенос и раскрашивание произвольной части текста в произвольный цвет.
ничего этого, разумеется в SDL нету. а что конкретно под переносом понимается? по буквам, слогам, словам?
так же, скорее всего, кроме цвета захочется курсив и жирность (а это уже совсем другие глифы, считай текстуры), захочется, наверное подчеркивание? выравнивание различного вида? возможно изменение части текста? или всего текста на каждом кадре (выводить фпс например) - обычно ничего это не реализовано и нужно самому делать, так как это уже ворд получиться...
Maelstrom писал(а):Лепить окна не собираюсь, всё в одном будет.
т.е. автоперенос только в том случае, если текст встречается с правой границей экрана? и только тогда переносится на новую строку к левой границе? только так? если нет, то это уже окна...
на самом деле нюансов много. особенно если не моноширное и хочется utf-8 с произвольной кучей символов, возможно еще автоперенос по слогам.
Меня окружали милые, добрые люди... медленно сжимая кольцо

Аватара пользователя
Maelstrom
Мастер
Сообщения: 2062
Зарегистрирован: 26 ноя 2006, 14:19
Откуда: г. Усть-Кирдык
Контактная информация:

Re: Барионикс 0.5.3a

Сообщение Maelstrom » 10 фев 2013, 08:43

Угу, не моноширинное и чтобы не вылезала из заданных границ, то есть перенос внутри области. Перенос по словам.
СДЛ всё же пощупаю ради интереса, может сам придумаю как запилить там это.

Ещё из нерешённых вопросов: как можно сделать замирание программы на <ещё>? Для меня это принципально, хочется такую фичу. Для тех, кто не помнит - если сообщений за раз слишком много, либо произошло что-то ключевое и требует внимания игрока, то он должен нажать пробел чтобы ход пошел дальше. То есть на это время весь обсчет механики игры останавливается.
Айв кнгенгах Йог-Сотот

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

Re: Барионикс 0.5.3a

Сообщение Cfyz » 10 фев 2013, 09:51

Maelstrom писал(а):что такое "более-менее сложный вывод текста"
Это значит многострочный вывод немоноширинного текста с кернингом в заданной области. Для того, чтобы правильно посчитать положение каждой буквы придется учитывать индивидуальные каждому глифу расстояния по всем четырем направлениям от него.
Maelstrom писал(а):Ещё из нерешённых вопросов: как можно сделать замирание программы на <ещё>? Для меня это принципально, хочется такую фичу. Для тех, кто не помнит - если сообщений за раз слишком много, либо произошло что-то ключевое и требует внимания игрока, то он должен нажать пробел чтобы ход пошел дальше. То есть на это время весь обсчет механики игры останавливается.
Это архитектурная проблема. В досе-терминале можно было просто зависнуть на ожидании клавиши прямо посередине цикла обработки, но в графическом тебе придется придумать способ обработать ход не до конца и продолжить позже.

Например, очередь "действий". Скажем, игрок нажимает [1], что должно привести к выполнению [A], , и [C]. А [C], в свою очередь (например, это реакция со стороны монстра), провоцирует выполнение [D] и [E]. Тогда в (положим, изначально пустую) очередь сначала ставится [1] и запускается цикл обработки. Первой же итерацией [1] разворачивается в [A], , [C]. Следующей итерацией выполняется [A], но вывода оказывается слишком много и обработка после этого прерывается, в очереди остаются и [C]. После некоторой реакции пользователя, при следующем вызове, обрабатывается ; [C] разворачивается в [D] и [E]; [D], возможно еще во что-то; в процессе опять много вывода, обработка опять прерывается в произвольных местах и т. д. и т. п. Когда в очереди ничего не осталось, обработка хода завершена и можно снова принимать от пользователя команды сложнее <далее> или <закрыть все к чертям>.
Cfyz теперь - наглая морда.

Аватара пользователя
Maelstrom
Мастер
Сообщения: 2062
Зарегистрирован: 26 ноя 2006, 14:19
Откуда: г. Усть-Кирдык
Контактная информация:

Re: Барионикс 0.5.3a

Сообщение Maelstrom » 10 фев 2013, 12:00

В ВБ я зависание в ожидании кнопок и сделал, а тут... Блин, прийдётся что-то придумывать.
Айв кнгенгах Йог-Сотот

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

Re: Барионикс 0.5.3a

Сообщение Cfyz » 10 фев 2013, 12:35

Есть еще альтернативный вариант, MVC. Ввод (controller) и отрисовка (view) работают отдельно от обсчета мира (model), в разных потоках. В этом случае тормозить процесс обсчета можно где и когда угодно, но синхронизация данных может оказаться большой головной болью.
Cfyz теперь - наглая морда.

Аватара пользователя
Maelstrom
Мастер
Сообщения: 2062
Зарегистрирован: 26 ноя 2006, 14:19
Откуда: г. Усть-Кирдык
Контактная информация:

Re: Барионикс 0.5.3a

Сообщение Maelstrom » 10 фев 2013, 13:09

Это значит многострочный вывод немоноширинного текста с кернингом в заданной области. Для того, чтобы правильно посчитать положение каждой буквы придется учитывать индивидуальные каждому глифу расстояния по всем четырем направлениям от него.
А вот это вот совсем не нравится. То есть прийдётся вручную высчитывать все эти расстояния, или при каком-то преобразовании программа это сама будет знать?
Айв кнгенгах Йог-Сотот

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

Re: Барионикс 0.5.3a

Сообщение Uvadzucumi » 10 фев 2013, 13:30

Maelstrom писал(а):
Это значит многострочный вывод немоноширинного текста с кернингом в заданной области. Для того, чтобы правильно посчитать положение каждой буквы придется учитывать индивидуальные каждому глифу расстояния по всем четырем направлениям от него.
А вот это вот совсем не нравится. То есть прийдётся вручную высчитывать все эти расстояния, или при каком-то преобразовании программа это сама будет знать?
у меня это реализовано в теме viewtopic.php?f=7&t=847 лежит с исходниками на гитхабе.

из реализованного на данный момент по тексту:
немоноширный (или моноширный) utf-8 (предварительно сгенерированный атлас при помощи UBFG);
ввывод строк текста со скролом и переносом по словам в заданную область
задание цвета символов при помощи управляющих кодов, например: "тут немного ^ff0000красного^ffffff текста"
если интересно - ткну в место в исходниках, где там конкретно что.

писалось правда за пару часов в течении 2-х вечеров, просто чтобы было, и не тестировалось - просто проверена работоспособность. рендер - OpenGL, из оптимизации - дисплейные списки только. хотя можно запросто переделать и совсем без OpenGL и всяких оптимизаций :)
Cfyz писал(а):Есть еще альтернативный вариант, MVC. Ввод (controller) и отрисовка (view) работают отдельно от обсчета мира (model), в разных потоках. В этом случае тормозить процесс обсчета можно где и когда угодно, но синхронизация данных может оказаться большой головной болью.
ну тут совсем не обяхательно считать все в разных потоках и что то синхронизировать. простейший случай:
Скрытый текст: ПОКАЗАТЬ

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

// рисуем все что на экране, в завимисмости от "режима игры" (GameState)
// меню, карту с персонажем и монстрами, инвентарь, магазин и т.д.
void DrawScene(GameState){
...
}
...
InitGame(); // инициализтируем игру
int GameState=GameMenu; // режим игры - меню
DrawScene(GameState); // отобразим текущую сцену (в нашем случае меню игры) 
while(ch=getch()){ // ch=kbhit?
  switch(GameState){
      case GameMenu: // меню игры обрабатываем тут
        ....
      case PlayerMovement: // команды игрока основные, движение, open door etc.
        ....
      case InventoryOpened: // открыт инвентарь - работа с предметами
        ....
      case WaitMore: // ждем нажатие пробела, переключаем режим приложения
        ....
      default: // ничего не делаем
  }
  DrawScene(GameState);
}
на самом деле немного сложнее делается, но общий смысл такой.
Меня окружали милые, добрые люди... медленно сжимая кольцо

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

Re: Барионикс 0.5.3a

Сообщение Cfyz » 10 фев 2013, 15:18

Maelstrom писал(а):А вот это вот совсем не нравится. То есть прийдётся вручную высчитывать все эти расстояния, или при каком-то преобразовании программа это сама будет знать?
Честно говоря, не понял что за "какие-то преобразования" и "сама знать" ты имеешь в виду. Тут смотри какое дело: растеризованный глиф — это просто прямоугольная картинка. Однако сам глиф — сложной формы фигура. У него есть некоторая базовая линия, та самая "линия строки", на которой сидят буквы. Глиф может быть произвольной высоты и нужно помнить насколько выше этой базовой линии надо начинать рисовать растеризованную картинку, чтоб буква вышла на одном уровне с остальными. У глифа есть ширина, которая совешенно необязательно равна ширине растеризованной картинки. У глифов есть кернинг, без которого пары типа AV и FA могут выглядеть просто ужасно (а могут и не выглядеть, от шрифта зависит). Еще у шрифта есть метрики выступов выше и ниже базовой линии, которые неплохо учитывать при многострочном выводе. И которые обязательно придется учитывать при оценке размеров надписи. И так далее, в зависимости от того, насколько ты готов удариться в типографию. Более-менее подробно можно почитать в документации библиотеки FreeType, благо это стандарт де-факто низкоуровневой работы со шрифтами.

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

Uvadzucumi писал(а):ну тут совсем не обяхательно считать все в разных потоках и что то синхронизировать. простейший случай:
Шиш с маслом =) Вся соль заключается в том, что текста в логе может стать больше допустимого еще в процессе обсчета мира. В одной функции. Вызываемой между некоторым case и его break. И если у тебя один поток, то ты не сможешь одновременно:
1. И не вернуться из начатой, но неоконченной функции обсчета, повиснув в ней на ожидании разрешения двигаться дальше и выводить новые сообщения в лог;
2. И перейти к циклу обработки UI, чтобы получить то самое разрешение от пользователя.

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

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

Re: Барионикс 0.5.3a

Сообщение Uvadzucumi » 10 фев 2013, 15:34

Cfyz писал(а):Поэтому вариантов ровно два. Или из функции выходим (например, сохраняя состояние в очереди для дальнейшего возобновления), или делаем все честно параллельно.
да. но есть 3-й вариант (если предполагается что одно действие может дикую портянку текста нагенерировать, а такое в принципе возможно, если там 500х500 заруб в экране, и в интерфейсе игры для него всего 2 строчки). можно малой кровью сделать окно лога, отдельным экраном и с прокруткой. несколько хуже будет этот вариант - если строчек всего 1-3 видно на основном экране, а действие 10 нагенерировало, но зато, не нужно 250 раз жать на пробел при одном ходе, если строчек 500 нагенерировало. если нужно - окрыли лог и посмотрели. не нужно - сразу другой ход делаем - а не давим все время далее, пока "неожиданно", нажали вместо "далее", "пропустить следующий ход".
Меня окружали милые, добрые люди... медленно сжимая кольцо

Ответить

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

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