На практике ни одна игра не обходится без вывода текста. Специфика игр предъявляет особые требования к шрифтам. Они должны соответствовать общему дизайну игры. Symbian OS предоставляет в распоряжение программиста набор стандартных фонтов. Однако, Вы всегда можете создать и использовать собственный шрифт на основе растрового изображения. В системе, как правило, существует не более одного экземпляра каждого шрифта. Это связано с необходимостью экономии памяти телефона.
Чтобы использовать определенный фонт для вывода текста необходимо:
В приведенном ниже примере создается новый шрифт, выводится текст, затем шрифт отключается.
void CMyGameView::Draw(const TRect&/*aRect*/)const { CWindowGc& gc= SystemGc(); // Выбираем самый маленький фонт Arial _LIT(KMyFontName,"Arial"); CFont* myFont; TFontSpec myFontSpec(KMyFontName,1); CGraphicsDevice* screenDevice= iCoeEnv->ScreenDevice(); screenDevice->GetNearestFontInTwips(myFont,myFontSpec); // Используем новый шрифт gc.UseFont(myFont); // Выводим текст _LIT(KMyText,"My text"); gc.DrawText(KMyText, TPoint(40,40)); // Отключаем и освобождаем фонт gc.DiscardFont(); screenDevice->ReleaseFont(myFont); }
На практике фонт обычно создается в ConstructL, а отключается и освобождается в деструкторе.
TFontSpec определяет параметры шрифта:
Когда Вы пытаетесь создать фонт с заданными атрибутами, система подбирает наиболее близкий из доступных ей вариантов.
CEikonEnv содержит ряд методов для получения используемых в системе шрифтов. Например, CEikonEnv::TitleFont возвращает шрифт, который используется системой для отображения заголовков. Иногда бывает необходимо создать приложение, гармонично вписывающееся в дизайн среды окружения.
Чтобы узнать, какие типы шрифтов доступны, можно использовать CGraphicsDevice::NumTypeFaces, возвращающий число типов, и CGraphicsDevice::TypeFaceSupport - для получения информации о конкретном шрифте.
void CMyGameView::ListMyFontsL() { // Определяем число доступных типов шрифтов TInt iNumTypefaces= iCoeEnv->ScreenDevice()->NumTypefaces(); // Выводим название каждого типа TBuf<64> myFontName; TBuf<128> text; for(TInt t=0; t< iNumTypefaces; t++) { // Получаем название шрифта TTypefaceSupport myTypefaceSupport; iCoeEnv->ScreenDevice()->TypefaceSupport(myTypefaceSupport, t); myFontName= myTypefaceSupport.iTypeface.iName.Des(); _LIT(KMyText,"Font%d/%d:"); text.Format(KMyText, t, iNumTypefaces); iEikonEnv->InfoWinL(text, myFontName); } }
В играх, как правило, требуется особый фонт, отсутствующий в системе. Обычно создается рисунок, содержащий символы требуемого шрифта, а затем осуществляется побитовое копирование каждого требуемого символа на экран. Таким образом можно использовать любой шрифт, однако, вывод текста потребует некоторых затрат машинного времени.
Вы также можете создать новый Symbian OS фонт, используя API. Чтобы это сделать необходимо:
Приведем пример файла-описания шрифта (MyFont.gd):
Typeface tf_MyFont Name"My Font" Proportional FontBitmaps MyFont// Название шрифта в BDF файле EndFontBitmaps EndTypeface FontStoreFile CollectionUid123456789// Uid шрифта (должен быть уникальным) KPixelAspectRatio1000 CopyrightInfo "MyCopyrightInfo" EndCopyrightInfo Typefaces tf_MyFont EndTypefaces EndFontStoreFile
Формат BDF широко распространен. Существует большое количество различных утилит, предназначенных для создания шрифтов. BDF файл можно создать из Windows bitmaps или специального редактора.
После создания BDF файл обычно требует некоторой модификации. Между словами STARTPROPERTIES и ENDPROPERTIES должны быть определены следующие свойства:
Обычно приходится вводить вручную Uid и MaxNormalWidth. Если какое-либо из свойств пропущено, fnttran сообщит об этом.
После того как новый шрифт создан и скопирован в папку \system\fonts, его можно использовать как обычный системный шрифт.
CFont* CMyGameView::GetMyOwnFont() { _LIT(KMyFontName,"MyFont"); CFont* myFont; TFontSpec myFontSpec(KMyFontName,1); CGraphicsDevice* screenDevice= iCoeEnv->ScreenDevice(); screenDevice->GetNearestFontInTwips(myFont,myFontSpec); return myFont; }
Шрифт можно скопировать на любой диск (C:\system\fonts, E:\system\fonts), после этого необходимо произвести мягкую перезагрузку устройства. Можно установить шрифт динамически, использовав CWsScreenDevice::AddFile в своей программе. Это позволяет использовать шрифт без перезагрузки.
Перевод:aRix