SDL入门教程(十):5、SDL完美显示中文

[复制链接]

该用户从未签到

2380

主题

2433

帖子

9139

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9139
QQ
跳转到指定楼层
楼主
发表于 2017-12-19 09:53:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

想要查看内容赶紧注册登陆吧!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
注意:请使用支持中文的TTF字库。
5.1:构建可以正确显示中文的SDL_ttf函数

        世界终于又充满了光明!任何事情都是有答案的,不知道仅仅是因为我们还没有找到。解决了以上一系列问题,我们终于可以不依赖MFC,完全使用自由开源的资源,让SDL显示中文了!我们通过TTF_RenderUNICODE_Xxx()来构建这些函数:
//FileName: font.h
#ifndef FONT_H_
#define FONT_H_

#include
"gb2312_to_Unicode.h"
#include
"SDL/SDL_ttf.h"

SDL_Surface
* myTTF_RenderString_Blended(TTF_Font* font, const std::string& str, SDL_Color fg);
SDL_Surface
* myTTF_RenderString_Solid(TTF_Font* font, const std::string& str, SDL_Color fg);
SDL_Surface
* myTTF_RenderString_Shaded(TTF_Font* font, const std::string& str, SDL_Color fg, SDL_Color bg);

#endif

三种显示模式的实现文件:
#include "font.h"

SDL_Surface
* myTTF_RenderString_Blended(TTF_Font* font, const std::string& str, SDL_Color fg)
{
    SDL_Surface
* textbuf;
   
//Get Unicode
    std::vector<Uint16> unicodeUnit = getUnicode(str);
   
int arraySize = unicodeUnit.size();
    Uint16
* perOne = new Uint16[arraySize+1];
   
for ( int i = 0; i < arraySize; i++ )
        perOne
= unicodeUnit;
    perOne[arraySize]
= 0;

   
   
//Render the new text
    textbuf = TTF_RenderUNICODE_Blended(font, perOne, fg);

   
//Free the text buffer and return
    delete [] perOne;
   
return textbuf;
}

SDL_Surface
* myTTF_RenderString_Solid(TTF_Font* font, const std::string& str, SDL_Color fg)
{
    SDL_Surface
* textbuf;
   
//Get Unicode
    std::vector<Uint16> unicodeUnit = getUnicode(str);
   
int arraySize = unicodeUnit.size();
    Uint16
* perOne = new Uint16[arraySize+1];
   
for ( int i = 0; i < arraySize; i++ )
        perOne
= unicodeUnit;
    perOne[arraySize]
= 0;

   
   
//Render the new text
    textbuf = TTF_RenderUNICODE_Solid(font, perOne, fg);

   
//Free the text buffer and return
    delete [] perOne;
   
return textbuf;
}

SDL_Surface
* myTTF_RenderString_Shaded(TTF_Font* font, const std::string& str, SDL_Color fg, SDL_Color bg)
{
    SDL_Surface
* textbuf;
   
//Get Unicode
    std::vector<Uint16> unicodeUnit = getUnicode(str);
   
int arraySize = unicodeUnit.size();
    Uint16
* perOne = new Uint16[arraySize+1];
   
for ( int i = 0; i < arraySize; i++ )
        perOne
= unicodeUnit;
    perOne[arraySize]
= 0;

   
   
//Render the new text
    textbuf = TTF_RenderUNICODE_Shaded(font, perOne, fg, bg);

   
//Free the text buffer and return
    delete [] perOne;
   
return textbuf;
}


5.2:修改DisplaySurface的类方法

        其它接口都是不需要改动的,我们仅仅把类方法中,原来用于构建文本面的函数换成我们自己的函数就可以了。当然,先把这些函数#include进来:
#include "SurfaceClass.h"
#include
"font.h"

//

DisplaySurface:isplaySurface(
const std::string& msg_name, const std::string& message, const ScreenSurface& screen,
                    Uint8 r, Uint8 g , Uint8 b,
                    
int ttf_size, const std::string& ttf_fileName):
fileName(msg_name)
{
   
if ( textNum == 0 )
        
if ( TTF_Init() < 0 )
            
throw ErrorInfo("TTF_Init() failed!");
   
    SDL_Color textColor;
    textColor.r
= r;
    textColor.g
= g;
    textColor.b
= b;

    pFont
= TTF_OpenFont(ttf_fileName.c_str(), ttf_size);
   
if ( pFont == 0 )
        
throw ErrorInfo("TTF_OpenFont() failed!");

    pSurface
= myTTF_RenderString_Blended(pFont, message, textColor);
   
if ( pSurface == 0 )
        
throw ErrorInfo("myTTF_RenderString_Blended() failed!");
    pScreen
= screen.point();

    textNum
++;
}


5.3:StringData在主程序中的调用

        最后,我们演示一下StringData在主程序中的调用方法。
//must #include "string_data.h"

   
//Load a textSurface
    StringData myData;
   
const std::string uInfo = myData[0];
   
const std::string dInfo = myData[1];
   
const std::string lInfo = myData[2];
   
const std::string rInfo = myData[3];
   
const std::string oInfo = myData[4];
    TextSurface upMessage(
"upMsg", uInfo, screen);
    TextSurface downMessage(
"downMsg", dInfo, screen, 0xFF, 0, 0);
    TextSurface leftMessage(
"leftMsg", lInfo, screen, 0, 0xFF, 0);
    TextSurface rightMessage(
"rightMsg", rInfo, screen, 0, 0, 0xFF);
    TextSurface otherMessage(
"otherMsg", oInfo, screen, 100, 100, 100, 35);

嘿嘿,就这么简单!

5.4:本章演示程序和完整源代码下载

包含SDL显示中文的演示程序(win32)以及完整的源代码。
http://www.fs2you.com/zh-cn/files/62f0acf0-ff11-11dc-a4f4-0014221b798a/
分享到:  QQ好友和群QQ好友和群
收藏收藏
回复

使用道具 举报

快速回复高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表