8. Ogre3D: Вывод текста оверлеями
В видеовыводе любого игрового приложения присутствует текстовая информация. С помощью текста можно передавать характеристики, сторилайн, диалоги и т.п. Так же бывает очень полезно организовать вывод отладочной информации – это сэкономит вам большое количество времени и нервов.
Самый простой способ вывода в С++ — это обычные потока iostream. Эти потоки обладают всем необходимым для вывода в файл/консоль. Однако, вы сами понимаете, что этот вариант приемлем только для отладочной информации – мало кто из ваших пользователей будет читать распечатки диалогов в консоли – она для этого не предназначена.
В этой статье мы познакомим вас с выводом текста через оверлеи Ogre3D.
Оверлеи Ogre3D.
Оверлей – графический элемент, выводящийся поверх основной сцены. Основное назначение оверлеев – вывод user interface – интерфейса пользователя. Пример оверлеев из WoT:
Создать оверлей в Ogre можно двумя способами – через встроенные скрипты и програмным способом. В большинстве случаев, когда вам требуется создать и разметить интерфейс пользователя, лучше воспользоваться первым способом – во-первых, вы сможете менять ui без перекомпилляции программы (это очень большое преимущество), а во-вторых, скрипт обладает специализированным синтаксисом и ключевыми словами, которые позволят построить более сложные оверлее за меньшее время.
Второй случай, т.е. построение очерлея вручную, требуется в небольших программах, а также в случаях генерации оверлеев “на лету”. В данном уроке мы воспользуемся именно этим способом.
Первое, что нам необходимо – это менеджер оверлеев Ogre. Получить его не сложно -он является синглтоном (более подробно о паттерне Синглтон вы можете прочитать в статье ООП, посвященной базовым паттернам).
Ogre::OverlayManager *pOverlayMgr = Ogre::OverlayManager::getSingletonPtr(); |
Следующий шаг – это создание самого оверлея. Делается это так:
Ogre::Overlay *pOverlay = pOverlayMgr->create( "overlay" ); |
Единственный параметр метода – название, которое мы даем нашему оверлею.
Оверлей содержит в себе элементы – это могут быть контейнеры, картинки, текст боксы и т.п. К нашему оверлею мы добавим единственный элемент – панель, на которой в дальнейшем будет располагаться текст бокс.
Ogre::OverlayContainer* pPanel = static_cast( pOverlayMgr->createOverlayElement( "Panel", "container" ) ); pPanel->setPosition( 0, 0 ); pPanel->setDimensions( 1, 1 ); pOverlay->add2D( pPanel ); pOverlay->show(); |
В этом отрывке кода мы создали элемент оверлея с типом “Panel”, установили ему размеры и позицию, присоединили к нашему оверлею и, наконец, показали.
Необходимо отметить, что по умолчанию, размеры и позиция задаются в относительных единицах, где 1 – весь экран. Т.е. в нашем случае панель растянется из верхнего левого угла на всю ширину и высоту экрана. Оверлей не перекроет обзор – пока на нем нет элементов он полностью невидим.
Загрузка шрифтов.
Перед тем, как мы перейдем непосредственно к созданию текст бокса и выводу текста, необходимо рассмотреть вопрос загрузки шрифтов.
Для того, чтобы вывести текст, шрифт связанный с этим текстом должен быть загружен. Для того, чтобы сделать это есть два способа. Первый — автоматическая загрузка ресурсов – вы просто кладете шрифт в папочку, путь к которой указан в настройках ресурсной системы и создаете файлик определения шрифта. Этот файлик выглядит примерно так:
StarWars { // Now this one I agree with ;) // A Star Wars font :) type truetype source solo5.ttf size 16 resolution 96 } |
Второй вариант – загрузка шрифта через менеджер непосредственно из кода:
Ogre::ResourceGroupManager& resGroupMgr = Ogre::ResourceGroupManager::getSingleton(); Ogre::FontManager& fontMgr = Ogre::FontManager::getSingleton(); Ogre::ResourcePtr font = fontMgr.create("Roguelike", "General"); font->setParameter("type", "truetype"); font->setParameter("source", "solo5.ttf"); font->setParameter("size", "16"); font->setParameter("resolution", "96"); font->load(); |
Мы получаем ссылку на менеджер шрифтов, затем создаем шрифт (“Roguelike”) в группе ресурсов (“General”). После этого мы выставляем шрифту определенные параметры и даем команду на загрузку.
TextBox.
Для того, чтобы отобразить текст на оверлее нам нужен специальный элемент – text box. Текст бокс – это область, которая будет отрисовывать наш текст с заданнам шрифтом и форматированием:
Ogre::OverlayElement *textBox = pOverlayMgr->createOverlayElement( "TextArea", ID ); textBox->setMetricsMode( Ogre::GMM_PIXELS ); textBox->setPosition( x, y ); textBox->setWidth( width ); textBox->setHeight( height ); textBox->setParameter( "font_name", "Roguelike" ); textBox->setParameter( "char_height", "16" ); textBox->setColour( color ); pPanel->addChild(textBox); |
Первым делом мы создаем сам элемент. Два параметра метода – это тип элемента (“TextArea”) и его идентификатор. Идентификатор нужен для тог, чтобы быстро найти текст бокс среди других.
Далее мы задаем параметры текст бокса. Обратите внимание, что для того, чтобы задавать параметры в пикселях, а не относительных единицах, мы вызвали метод
textBox->setMetricsMode( Ogre::GMM_PIXELS ); |
Устанавливаем шрифт и присоединяем его к нашей панели.
Для того, чтобы вывести текст достаточно вызвать метод
textBox->setCaption( text ); |
Заполнен: Ogre3D
