|
nc_graph |
Шрифты. Вывод текста. |
последнее обновление 29.10.2003 |
Текст - это один из основных способов общения, особенно для игрового проекта. Естественно текст сам по себе на экране монитора не появится, его там надо нарисовать. О том как это можно сделать мы сейчас и поговорим.
Метод, описанный ниже, позволяет выводить текст стандартных Windows шрифтов, если вы хотите использовать какой-нибудь свой, уникальный шрифт и у вас нет возможности создать его ttf (TrueTypeFont) аналог, тогда вам стоит посмотреть на реализацию шрифтов, используемую в проекте GUNgine, так называемые, текстурные шрифты.
Реализация
|
class CncFont
{
protected:
GLuint m_iBase;
bool m_isBuild;
float m_fWidth;
float m_fHeight;
int m_iFontHeight;
ABC m_CharInfo[256];
SncColor4 m_Color;
public:
CncFont();
~CncFont();
void Create(const int iH, char* szName, bool isBold = false, bool isItalic = false);
void Print(int iX, int iY, const char* szTxt);
void Print(const SRect& rect, EAlignText eAlign, const char* szTxt);
void PrintF(int iX, int iY, const char* szFormat, ...);
int GetHeight() const {return m_iFontHeight;}
enum {siNone, siBefore, siAfter, siBoth};
int GetCharWidth(int iCharIdx, int iSpaceInfo = siBoth) const;
int GetStringWidth(std::string& strTxt) const { return GetStringWidth(strTxt.c_str()); }
int GetStringWidth(const char* szTxt) const;
void SetColor(const SncColor4& color) { m_Color = color;}
const SncColor4& GetColor() const {return m_Color;}
};
|
Шрифт создается функцией Create(), в параметрах ей передается высота шрифта в логических единицах, его имя в системе Windows и два булевых параметра: полужирный и наклонный. Вообще-то для полноты можно добавить еще два - подчеркнутый и зачеркнутый, но линии к сожалению выводяться с разрывами, поэтому в реализации этих параметров нет. Функция Create() использует HDC (хендл на контекст устройства вывода), у меня он глобальный для всего проекта, поэтому через параметр я его не передаю.
Выводится текст вызовом функции Print() или PrintF(), последняя поддерживает форматированный вывод, как стандартный printf(). Параметры iX и iY задают позицию на экране: 0,0 - левый верхний угол, _ШиринаЭкрана_,_ВысотаЭкрана_ - соответственно, правый нижний.
Функция Create() использует WinAPI функцию CreateFont(), рекомендую заглянуть в MSDN и почитать, возможно вам понадобится поддержка некоторых ее дополнительных параметров.
Пример
|
CncFont Font;
Font.BuildFont(20, "Arial", true);
Font.PrintF(0, 0, "fps:%i", fps);
|
Цвет текста можно задавать при помощи функции SetColor(). В качестве параметра передается структура:
|
typedef struct SncColor4
{
union {
struct {
float r,g,b,a;
};
float pf[4];
};
SncColor4(float fR = 0, float fG = 0, float fB = 0, float fA = 1) : r(fR), g(fG), b(fB), a(fA){}
SncColor4(float* _pf) : r(_pf[0]), g(_pf[1]), b(_pf[2]), a(_pf[3]){}
} SncColor4;
|
Ширину текста или отдельного символа можно узнать при помощи функций GetStringWidth() и GetCharWidth() соответственно.
Иногда необходимо выводить текст с выравниванием, например по центру какой-то области. Для этого у шрифта есть специальная функция Print в которую одним из параметров передается прямоугольная область, в которой требуется выравнивать текст. Способы выравнивания на данный момент поддерживаются следующие: горизонтально по центру области, к правому и левому краю.
Вот, в принципе, и все. исходный код.
С вопросами и предложениями прошу обращаться на мыло Cupper, или оставлять в Гостевой книге
|
| | |