ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 июля
1066003 Топик полностью
fk0, легенда (31.12.2020 14:35, просмотров: 280) ответил POV_ на Достаточно сказать насчет "конских тиражей", и много из сказанного станет ненужным...
Ты ж демосценер, графику уметь должен. На самом деле есть ещё подход от геймдева: тупо всё нарисовать. Т.е. UI состоит из заранее нарисованных шаблонов, в которые вписываются только разные надписи, где нужно. И сделать тайловую графику (а-ля шрифт на ZX или тайлы на NES). 

Т.е. вывод графики упрощается до умения выводить фиксированные тайлы (и шрифты все -- моноширинные и одного размера) и шаблонов экранов заданных "текстом" (с псевдографическими крыжиками, линиями, уголками). Вот это реально идея для простых случаев с простеньким "дизайном". Сделать набор тайлов на 256 символов, где ASCII и нужные элементы графики, иконки... Даже всплывающие окна сильно упрощаются (под каждое можно фреймбуфер держать, т.к. в тайлах они все маленькие).


Тайлы хранить в спрайтмапе, который нарисовать в любом удобном редакторе (где можно напечатать буквы уже готовыми шрифтами, ради простоты) и экспортировать в черно-белый BMP (или xbm от юникса -- он в принципе удобный, только всё зеркальное там, что не совсем удобно). Ещё нужно редактор (экранов/окон), чтоб на ПК посмотреть можно было, как выглядит. В принципе их есть, хотя можно и руками в нотепаде...


А систему меню таки придётся делать. Чтоб там навигация между элементами UI, редактирование элементов (крыжики, поля ввода, кнопки) было. Общий принцип такой же как в любой UI-системе. Есть события (кнопки, тычки в экран). Они попадают куда-то, либо сверху-вниз, либо снизу вверх и обрабатываются. Обработчики есть у самого виджета (редактирование), у окна (переключение фокуса между элементами). В простейшем случае элементы выстроены в список и по нему можно бегать вперед-назад (а-ля Tab и Alt-Tab). В двумерном случае (навигация стрелками) можно перебирать все и искать ближайший в заданном напрявлении.


Для тычков в случае тайлов можно подготовить отдельный "image map", опять же в нотепаде, из буковок по размеру экрана. Где буковки кодируют номер элемента UI в который ткнули, и в итоге действие.


Ну и для перерисовки у каждого виджета должна быть функция, которая вызывается, достаёт данные, обновляет тексты, вид крыжика и т.п.


В принципе такой подход работает и не с тайловой графикой. Всё то же самое, только рисуются экраны в редакторе. Нужно уметь выводить тексты и спрайты (для крыжиков и т.п.) Координаты куда тыкают и действие определятеся опять же из html image map'а заданного в граф. редакторе (gimp, например), но уже не квадратиками, а кругами, полигонами, прямоугольниками... Координаты текстов и спрайтов в том же image-map записаны (с атрибутами имени соответствующими элементу -- функция вывода по имени в мапе находит и получает координаты куда рисовать).


Преимущества такого метода -- произвольный дизайн, не ограничнный рамками используемой UI-системы. Недостаток: работает только на экранах фиксированного размера (впрочем можно иметь несколько шаблонов и выбирать по размеру экрана). Ещё недостаток: большие трудозатраты на собственно "дизайн" (если нужно сделать 50 разных окон, то проще на чём-то вроде Gtk/Qt). Ну и в случае полноценной, а не тайловой, графики нужно много памяти.

[ZX]