SDL游戏之路(十三)--中文显示



中文显示

显示中文,我们需要加载中文字库。可以从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;


运行效果如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值