8. Ogre3D: Вывод текста оверлеями

02.07.2012

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

Самый простой способ вывода в С++ — это обычные потока 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
Присвоен тэг:

avatar

Об Авторе ()

Коллективный разум нашей редакции. Все человеческое здесь заканчивается и начинается C++!

Комментирование закрыто.

Наверх