tiles vs ttf

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

Аватара пользователя
Xecutor
Мастер
Сообщения: 746
Зарегистрирован: 25 мар 2008, 08:32

tiles vs ttf

Сообщение Xecutor » 23 мар 2014, 04:09

В zrlg как и в bearlib terminal можно выводить как текст так и тайлы.
Вот только подавляющее большинство фонтов имеет соотношение высоты к ширине ближе к 2:1.
Если растянуть знакоместо до квадрата, то текст получается слишком "жидкий", и читать его неудобно.
С другой сильно неквадратные тайлы тоже будут смотреться странно, если только
не пытаться изображать изометрию, что весьма специфично...

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

Если считать, что фонт строго 2 к 1, то можно привязать один тайл к 2-м знакоместам.

Ну или забить на псевдоконсольность, и делать графический API.

Идеи, комментарии?

Аватара пользователя
Sirion
Сообщения: 689
Зарегистрирован: 21 авг 2010, 19:33

Re: tiles vs ttf

Сообщение Sirion » 23 мар 2014, 09:54

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

Аватара пользователя
Xecutor
Мастер
Сообщения: 746
Зарегистрирован: 25 мар 2008, 08:32

Re: tiles vs ttf

Сообщение Xecutor » 23 мар 2014, 10:01

Sirion писал(а):идеологически верным шагом была бы организация возможности вывода тайлов с произвольным отношением сторон.
Эммм. Мы либо придерживаемся идеологии псевдоконсоли, и тогда у нас есть понятие знакоместа, которое имеет вполне фиксированные размеры.
Или не придерживаемся, но тогда вообще всё по другому.
Сделать возможность вывести тайл монстра, который чутка налезет на соседние клетки в общем-то не сложно.
Но это не решает проблемы. С полом и стенами такое уже не прокатит.

Аватара пользователя
Sirion
Сообщения: 689
Зарегистрирован: 21 авг 2010, 19:33

Re: tiles vs ttf

Сообщение Sirion » 23 мар 2014, 10:09

А. Пардон, я затупил. Не понял, что речь идёт о выводе текста одновременно с тайлами.
Тогда разумно будет отделить текст от тайлов. Иначе неизбежно получится что-то такое:
Скрытый текст: ПОКАЗАТЬ
Изображение
Никакая идеология не должна мешать писать человеческий код :)

Аватара пользователя
Xecutor
Мастер
Сообщения: 746
Зарегистрирован: 25 мар 2008, 08:32

Re: tiles vs ttf

Сообщение Xecutor » 23 мар 2014, 10:36

Ну собственно в этом и вопрос - как именно организовать их вывод одновременно с текстом, да еще и в рамках псевдоконсольности.
Наверное самый простой вариант - делаем фонт, например, 8х16, и тайлы 16х16.
Ну и один тайл тупо занимает 2 знакоместа. Но это крайне негибко.
Другие варианты где можно было бы мешать тайлы с текстом (например инвентарь,
где есть иконка предмета и рядом текст), без ухода от псевдоконсольности мне видятся с трудом...

Еще вариант - нарисовать квадратный фонт. Но рисовать ttf фонт это еще та задачка,
а с битмапным начинается свистопляска с кодовыми страницами, масштабированием и т.д.

Аватара пользователя
Sirion
Сообщения: 689
Зарегистрирован: 21 авг 2010, 19:33

Re: tiles vs ttf

Сообщение Sirion » 23 мар 2014, 14:24

Прислушайся хорошенько к тому, как всё это звучит. Это звуки ада.
Правильный ответ в данной задаче - отказаться от одного из её условий. Т.е. от псевдоконсольности. И сделать вывод теста поверх.

Аватара пользователя
Xecutor
Мастер
Сообщения: 746
Зарегистрирован: 25 мар 2008, 08:32

Re: tiles vs ttf

Сообщение Xecutor » 23 мар 2014, 16:21

Хочется: мешать текст с тайлами.
Разделение вывода текста и тайлов превращает их совместный вывод в гемор.
Полный отказ от псевдоконсольности тут же всё сильно усложняет.

Аватара пользователя
kipar
Сообщения: 2120
Зарегистрирован: 10 мар 2010, 13:16
Откуда: Москва

Re: tiles vs ttf

Сообщение kipar » 23 мар 2014, 21:46

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

Аватара пользователя
Jolly Roger
Сообщения: 2973
Зарегистрирован: 27 ноя 2009, 09:10
Откуда: Minsk, Belarus

Re: tiles vs ttf

Сообщение Jolly Roger » 24 мар 2014, 04:47

Xecutor писал(а):Хочется: мешать текст с тайлами.
Разделение вывода текста и тайлов превращает их совместный вывод в гемор.
Полный отказ от псевдоконсольности тут же всё сильно усложняет.
Sirion дело глаголет.
А почему усложняет?
Я в Фаллен "украл" идею виндоус, вывод самой программы идёт не в одно консольное окно, а в собственные окна, с их собственными координатами. У этих окон разные настройки, можно включить консольный вывод с переносом внутри окна, работу по с границами по краю итд. Ну короче понятно.
А на эране размещаю уже сами окна.
Если очень нужно, можно картинки в одном окне размещать, а текст в другом, а можно совмещать.
Не нужно гальванизировать почившую консоль.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

Аватара пользователя
BreakMT
WANDER Team
Сообщения: 933
Зарегистрирован: 27 ноя 2006, 12:16

Re: tiles vs ttf

Сообщение BreakMT » 24 мар 2014, 07:06

просто символ по центру клетки тайла выводить ... или я не понял задачу

Аватара пользователя
Jolly Roger
Сообщения: 2973
Зарегистрирован: 27 ноя 2009, 09:10
Откуда: Minsk, Belarus

Re: tiles vs ttf

Сообщение Jolly Roger » 24 мар 2014, 07:46

BreakMT писал(а):просто символ по центру клетки тайла выводить ... или я не понял задачу
С помощью этого костыля мы просто попытаемся пронести фиксированные координаты консоли в светлый новый мир оконных приложений. :wink:

Выводя символ по центру тайла, мы будем привязаны к размеру тайла, иначе текст разнесёт в зависимости от выбранного шрифта и размера клетки на экране.

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

Аватара пользователя
BreakMT
WANDER Team
Сообщения: 933
Зарегистрирован: 27 ноя 2006, 12:16

Re: tiles vs ttf

Сообщение BreakMT » 24 мар 2014, 08:11

Да ёлки-палки! Опять они придумали какой-то загон, который только усложнит разработку :lol:
Ваш способ я так и не понял - как конкретно вы будете выводить карту, состоящую из тайлов и символов вперемешку? Причем тут какие-то окна и "идея виндоус"?

Ps: Роджер еще Sanctuary от меня закрыл... почему?)

Аватара пользователя
Jolly Roger
Сообщения: 2973
Зарегистрирован: 27 ноя 2009, 09:10
Откуда: Minsk, Belarus

Re: tiles vs ttf

Сообщение Jolly Roger » 24 мар 2014, 08:24

BreakMT писал(а):Да ёлки-палки! Опять они придумали какой-то загон, который только усложнит разработку :lol:
Ваш способ я так и не понял - как конкретно вы будете выводить карту, состоящую из тайлов и символов вперемешку? Причем тут какие-то окна и "идея виндоус"?
ммм. Ну как сделал я.
Собственно нужно разделить понятие основного окна и внутренних окон.
Само окно приложения, давай назовём его "главное окно" вообще не делится на куски и имеет только свои пикселы, столько, сколько у него есть.
В самой же игре у меня есть другие окна. Игровое поле, где ходит игрок - это окно, всплывающий хелп - это другое окно, миникарта третье. Инвентарь - это тоже целая бригада окон.
Все эти окна имеют свои координаты на главном окне. Всё, что у них внутри, они выводят относительно этих координат.

Дальше больше, каждое окошко вообще не разделяет текст и тайлы, спрайты и проч. Для неё все - это текстуры, которые выводятся относительно её собственных координат 0,0.
Те, если я дал окну картинку с координатами 10,10, а само окно находится по координатам 100,100. То в реальности картинка будет нарисована на 110,100. Ну это очевидно.

Что касается текста, то окно может получать текст по команде add_text. Несколько вариантов, с координатами x,y. только с х, или вообще без.
Данный метод разбирает строку и вставляет в окно уже текстуры букв в нужных координатах, которые также рассчитывает сам.
Также реализованы доп функции, типа Console_ON. В случае его включения, метод, разбирая строку будет переносить всё, что не влезло внутрь этого окна по оси X уже по оси Y, а также учтёт уже добавленный текст при добавлении нового.
Также можно попросить методом "обходить" текстом уже добавленные текстуры картинок.
В общем, всё просто.
Консоль, как таковая, есть там где нужна. Например во всплывающем сообщении и не привязана к сетке главного окна.

EDIT: ты представить себе не можешь, как это облегчает разработку! :lol:
Класс такого окна легко наследуется и является совершенно резиновым.
Туда влезают и обработчики мышки, и границы, и извлечение квадратных координат, и анимация, и несколько шрифтов разных размеров, и поворот вокруг своей оси, и так далее и тому подобное, сейчас уже и не упомнить.
Ну и гонять его можно по всему экрану, как только захочется, а не по железной сетке консоли.
Например по вызову метода drop_near_Mouse_coords. Прога размещает окно относительно курсора мыши, с учётом того, к какой части экрана находится мышь и учитывает размер курсора.
Скрытый текст: ПОКАЗАТЬ
BreakMT писал(а): Ps: Роджер еще Sanctuary от меня закрыл... почему?)
патамушта там сикретные разработки идут. :D
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

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

Re: tiles vs ttf

Сообщение Cfyz » 24 мар 2014, 12:45

Xecutor писал(а):Можно попытаться отделить мух от котлет. Для тайлов свой вывод, для текста свой.
Но тогда будет свистопляска с преобразованием координат, с прозрачностью и с z-order.
Я также придерживаюсь мнения, что в общем виде задача решения не имеет.

Что не отменяет более-менее гибкого инструментария для разнообразных частных задач. Вот например в BearLibTerminal:
* Базовым режимом вывода является центрированный по сетке. Текст размещается по сетке. В большинстве случаев это выглядит "как консоль", что собственно и задумывалось.
* Тайлы по умолчанию размещаются также, просто потому что тайлы и буквы суть одно и то же. Если тайл большой-большой, можно задать ему выравнивание по углу ячейки и тогда он будет позиционироваться более привычно, просто не попиксельно, а с шагом в клетку.
* Размер ячейки по умолчанию выбирается под шрифт. Но размер можно задать и вручную. Например, если до удобного ровного значения, которому кратны тайлы, осталось пара пикселей, то можно просто разуплотнить немного сетку оставив шрифт исходного размера. Скорее всего это не будет сильно бросаться в глаза.
* Если тайл все-таки надо позиционировать попиксельно, то можно указывать и пиксельные координаты, а не ячейки. Хоть тайлы подземелья, хоть тайлы буковок.
* Проблемы с прозрачностью и z-order решаются с помощью слоев. Например, карта из крупных тайлов в первом слое, попиксельные спецэффекты из частиц во втором, UI с текстом в третьем.
По-моему этого вполне достаточно для большинства ситуаций.
Пытается раскуклиться

Аватара пользователя
Xecutor
Мастер
Сообщения: 746
Зарегистрирован: 25 мар 2008, 08:32

Re: tiles vs ttf

Сообщение Xecutor » 25 мар 2014, 07:33

Cfyz вот смотри. Размер символа в шрифте: 8х16
Если я буду размещать буквы в середине клетки размером 16х16, то текст получается трудночитаемым.
Слишком редко расположены буквы.
Тайлы 8х16 тоже смотрятся как-то странно.
Я пробовал напрямую из freetype2 генерировать более квадратные буквы.
С фонтами которые были под рукой получается уродство.

Ответить

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

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