Примерно полгода занимаюсь разработкой новой меню библиотеки для движка Xash3D FWGS. Причины того просты для любого, кто когда-либо читал исходный код старого меню — работать с ним возможно, но очень сложно. Растёт оно ещё из Quake II, где глубоко уважаемый Джон Кармак не тратил много времени на написание игровых меню, которое в свою очередь растёт из Quake I. И наверное правильно делал, тогда это банально не ценилось, вплоть до Doom III.
Изначально идея была в том, чтобы перенести код с чистого Си на С++, но как и бывает — многие моменты пришлось переосмыслить и внести нововведения. Вот о них я и постараюсь рассказать.
- Добавлены ивенты, чтобы задавать действия разным контролам, вместо их обработки по захардкоженным ID, в которых можно ошибиться и вообще.
- В старом меню никакой системы элементов-родителей. Всё было статично и захардкожено. Я внёс новый элемент управления, который может содержать в себе другие элементы управления. Развив эту мысль появилась даже очень упрощенная система окон. (в правом верхнем углу видно список текущих окон)
- mittorn-ом был написан очень красивый прогресс подключения к серверу, который в свою очередь и является окном. Его можно увидеть в видео по ссылке ниже.
- Каждое окно имеет возможность отрисовать свою анимацию. В главной ветке я реализовал плавной смены прозрачности между окнами для соответствия с анимацией старого Half-Life. Для демонстрации я писал такое
- Старое меню использовало моноширинные шрифты родом из Quake III Arena. Я от них наконец полностью избавился, как и от кода а-ля , заменив собственным шрифторендером. Под Windows используются возможности GDI, для всех остальных есть FreeType2 и stb_truetype.h рендеры. Поддержка последнего была добавлена специально для мобильных устройств, дабы не тащить по зависимостям достаточно крупный FreeType2. ШГ осталось, но всё-таки меньше, чем было.
width = charWidth * strlen( sz )
- Из предыдущего пункта вытекает и этот. Ранее таблицы эмулировались кучей отступов из пробелов, а каждый пункт таблицы был всего-лишь очень длинной строкой. Поэтому я написал настоящие таблицы, которые могут отображать не только текст, но и картинки. В будущем хочу добавить фичу отрисовки даже контролов внутри ячеек. Собственно, это и на скрине.
- Динамически построенные меню! На основе так называемых Script Config-ов строится вот меню конфигурации. Сами конфиги пишутся моддерами и вообще эта фича присутствует начиная с самых ранних версий GoldSource и есть даже в движке Source. Про Source 2 не знаю, игр на нём ещё нет(DotA2 за игру не считается). Пример.
- Возможность настроить положение, стиль и ограниченно логику контролов через resource-файлы. Пример.
- Так же в планах написать поддержку переводов, дабы не оставаться с текстом, как в скриншоте выше.
Поскольку я хочу, чтобы мой код попал не только в форк движка, но в оригинальный Xash3D, а его автор(Дядя Миша) требует возможность сборки с MSVC 6, я сделал опцию сборки с отключенным требованием С++11. Собрать его можно задефайнив макрос MY_COMPILER_SUCKS.
А при чём тут Linux? Меню написано для форка игрового движка, который почти 3 года как работает под Linux. А ещё под кучей других платформ, вроде Windows, Android, *BSD, OSX, iOS. Недавно благодаря тому же mittorn появилась даже поддержка запуска сервера под Big Endian платформами и улучшена поддержка 64-битных ОС.
Всё это дело можно увидеть в действии пока лишь в тестовых сборках, однако планируется скорый выход новой версии движка, где это меню будет по дефолту. Есть сорцы.
>>> Просмотр (1920x1080, 895 Kb)