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, или оставлять в Гостевой книге
Hosted by uCoz