中文显示
显示中文,我们需要加载中文字库。可以从C:\Windows\Fonts找到很多。
定义一个字体类SkFont 和 支持中文的字符显示 SkWord
#ifndef SKWORD_H_
#define SKWORD_H_
#include "SkComm.h"
#include <string>
using namespace std;
namespace sk_park {
class SkFont {
public:
SkFont();
void init(const char * pPath, Sint32 iSize);
~SkFont();
TTF_Font * getPtr();
Sint32 getSize();
private:
Sint32 m_iSize;
TTF_Font * m_pFont;
};
class SkWord {
public:
string m_str;
SkSurface m_skSurface;
void setStr(string str, SkFont & font, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
};
}
extern sk_park::SkWord g_SkWord;
extern sk_park::SkFont g_SkFont;
#endif /* SKWORD_H_ */
具体实现如下:
#include "pch.h"
#include "SkWord.h"
#include "SkFile.h"
#include "SkShow.h"
using namespace sk_park;
SkFont::SkFont() {
m_pFont = NULL;
m_iSize = 0;
}
void SkFont::init(const char * pPath, Sint32 iSize) {
m_iSize = _B2S(iSize);
//m_iSize = iSize;
char fontPath[256];
snprintf(fontPath, sizeof(fontPath), "%s/%s", g_SkFile.getRootPath(),
pPath);
m_pFont = TTF_OpenFont(fontPath, iSize);
g_SkComm.log("[%s][%d]g_font:%d", __FILE__, __LINE__, m_pFont);
if (m_pFont == NULL) {
g_SkComm.myexit();
}
}
SkFont::~SkFont() {
if (m_pFont != NULL) {
TTF_CloseFont(m_pFont);
m_pFont = NULL;
}
}
TTF_Font * SkFont::getPtr() {
return m_pFont;
}
Sint32 SkFont::getSize() {
return m_iSize;
}
void SkWord::setStr(string str, SkFont & font, Uint8 r, Uint8 g, Uint8 b,
Uint8 a) {
m_str = str;
SDL_Color c;
c.r = r;
c.g = g;
c.b = b;
c.a = a;
SDL_Surface *message = TTF_RenderUTF8_Solid(font.getPtr(), str.c_str(), c);
//SDL_Surface *message = TTF_RenderText_Solid(font.getPtr(), str.c_str(), c);
SDL_Texture * pSDL_Texture = SDL_CreateTextureFromSurface(
g_SkShow.m_pSkRenderer, message);
m_skSurface.setSurface(pSDL_Texture);
m_skSurface.w = message->w;
m_skSurface.h = message->h;
}
SkWord g_SkWord;
SkFont g_SkFont;
具体使用如下:
m_font.init("font/simhei.ttf", 20);
m_word.setStr("my 宝宝的洗澡盆 test str.", m_font, 255, 0, 0, 255);
添加一个显示方法:
stPos.x = 500;
stPos.y = 500;
pSkShow->drawWord(NULL, &m_word, &stPos, m_iCurTime);
显示函数的具体实现:
#include "pch.h"
#include "SkShow.h"
using namespace sk_park;
void SkShow::init(SkRenderer * pSkRenderer) {
m_pSkRenderer = pSkRenderer;
}
void SkShow::flush() {
#ifdef __WP8__
#else
SDL_RenderPresent(m_pSkRenderer);
#endif
}
void SkShow::clear(Uint8 r, Uint8 g, Uint8 b, Uint8 a) {
#ifdef __WP8__
m_pSkRenderer->m_d2dContext.Get()->Clear(D2D1::ColorF::ColorF(r,g,b,a));
#else
SDL_SetRenderDrawColor(m_pSkRenderer, r, g, b, a);
SDL_RenderClear(m_pSkRenderer);
#endif
}
void SkShow::fillRec(SkRect * pArea, Uint8 r, Uint8 g, Uint8 b, Uint8 a) {
SkRect sTRec;
#ifdef HAVE_OPENGL
sTRec.x = _B2SX(pArea->x)+g_gl_left;
sTRec.y = _B2SY(pArea->y)+g_gl_top;
//sTRec.x = _B2SX(pArea->x);
//sTRec.y = _B2SY(pArea->y);
#else
sTRec.x = _B2SX(pArea->x);
sTRec.y = _B2SY(pArea->y);
#endif
sTRec.w = _B2S(pArea->w);
sTRec.h = _B2S(pArea->h);
#ifdef __WP8__
m_pSkRenderer->m_colorBrush.Get()->SetColor(D2D1::ColorF::ColorF(r,g,b,a));
m_pSkRenderer->m_d2dContext.Get()->FillRectangle(
D2D1::RectF(sTRec.x, sTRec.y, sTRec.x+sTRec.w,sTRec.y+sTRec.h), m_pSkRenderer->m_colorBrush.Get());
#else
SDL_SetRenderDrawColor(m_pSkRenderer, r, g, b, a);
SDL_RenderFillRect(m_pSkRenderer, &sTRec);
#endif
}
void SkShow::drawWord(SkRect * pDesArea, SkWord* pWd, SkRect * pPicArea,
Sint64 iTime) {
drawPic(pDesArea, &pWd->m_skSurface, pPicArea, true);
}
void SkShow::drawButton(SkRect * pDesArea, SkButton* pBt, SkRect * pPicArea,
Sint64 iTime) {
SkSurface * pFace = pBt->getShow(iTime);
drawPic(pDesArea, pFace, pPicArea);
}
void SkShow::drawAnm(SkRect * pDesArea, SkAnimation* pAnm, SkRect * pPicArea,
Sint64 iTime) {
SkSurface * pFace = pAnm->getShow(iTime);
drawPic(pDesArea, pFace, pPicArea);
}
void SkShow::drawPic(SkRect * pDesArea, SkImage* pPic, SkRect * pPicArea) {
drawPic(pDesArea, &pPic->m_skSurface, pPicArea);
}
void SkShow::drawPic(SkRect * pDesArea, SkSurface* pFace, SkRect * pPicArea,
bool bReal) {
SkRect sTRec;
#ifdef HAVE_OPENGL
#ifdef __SKYPARK_IPHONE__
sTRec.x = _B2SX(pPicArea->x);
sTRec.y = _B2SY(pPicArea->y);
#else
sTRec.x = _B2SX(pPicArea->x)+g_gl_left;
sTRec.y = _B2SY(pPicArea->y)+g_gl_top;
#endif
#else
sTRec.x = _B2SX(pPicArea->x);
sTRec.y = _B2SY(pPicArea->y);
#endif
if (bReal) {
sTRec.w = pFace->w;
sTRec.h = pFace->h;
} else {
sTRec.w = _B2S(pFace->w);
sTRec.h = _B2S(pFace->h);
}
#ifdef __WP8__
D2D1_POINT_2F stPos;
stPos.x = sTRec.x;
stPos.y = sTRec.y;
m_pSkRenderer->m_d2dContext.Get()->DrawImage(pFace->m_pSurface.Get(), stPos);
#else
SDL_RenderCopy(m_pSkRenderer, pFace->getSurface(), pDesArea, &sTRec);
#endif
}
SkShow g_SkShow;
运行效果如下: