原文地址:http://twinklebeardev.blogspot.com/2012/08/lesson-6-true-type-fonts-with-sdlttf.html
本节我们将学习怎样使用SDL_ttf库来用True type字体绘制文本。在这之前,你需要从Mercurial里预先下载并编译好SDL_ttf库。如果你还没有SDL_ttf的SDL2.0版本,你应该现在赶紧下载编译。这个库和第三节提到的SDL_image的链接方法很相似。
(译注:不要下载SDL_ttf主页上的源码和bin包,因为它们都是SDL1.2对应的版本,从Mercurial里clone。SDL_image也是这样。)
除了这个库之外,我们还需要一个true type字体文件来绘制文本。需要强调的是你在选择字体的时候要小心,因为很多字体是专有的或者是需要你在使用过程中遵循一定规范。如果未经许可使用,可能会导致一些讨人厌的法律问题。不过幸运的是,网上仍然有很多优秀又开放的字体。本节我们使用一套最近由Adobe发布的开源字体,你可以从sourceforge上下载到。本节我选用的字体是SourceSansPro-Regular,你可以选任意你喜欢的字体。
既然我们已经下载了字体并链接好了库文件,我们看一下怎样通过SDL_ttf来使用字体。这个库提供了打开和关闭TTF字体与把文本会知道SDL_Surface指针上的功能。这个库还让我们指定绘制文本时的字体和颜色。你可以从这里找到库的文档全文。
首先,我们需要包含SDL_ttf.h头文件。
为了使用这个库,我们需要在main函数中,初始化SDL完毕后,初始化SDL_ttf库。注意我们在检查错误的时候,使用的方法和检查初始化SDL时问题的方法类似,除了用的是TTF_GetError来获取适当的错误信息之外,和第三节中获取SDL_image的错误信息的方法类似。
下一步我们要编写一个绘制一行消息文本的函数并把它所做的工作抽象出来,然后简单地返回一个我们可以直接绘制到屏幕上的SDL_Texture。除了把消息的文字绘制出来之外,这个函数还需要把TTF_RenderText_X返回的SDL_Surface指针转化为SDL_Texture指针,并将之返回。
需要的信息包括需要绘制的消息,字体的文件名,字体大小以及字体颜色。我们现在可以给我们的代码中添加一个可以绘制我们想要消息的美好的函数了:
这些代码真是相当地不少!让我们把它看一遍,看看它实际上在做什么。我们需要一条要绘制的消息文本,字体文件,字体颜色还有字体大小,以便于正确地绘制消息。SDL提供了SDL_Color结构来指定我们想要的颜色,它包含三个分别对应RGB的值,其中每个的取值范围为0-255.
绘制文本的第一步是打开这个字体,代码中第四行我们使用了TTF_OpenFont这个函数,它需要一个字体文件名与字体大小以打开字体。注意之前的LoadImage函数中使用的检查空指针的错误检测方法在这里也可以用于确认字体被正确地打开。如果打开失败,我们抛出一个错误,其中包括导致这个错误的字体文件的名称,以及TTF_GetError获得的错误,以便之后我们拥有足够的错误信息来解决这个问题。
如果字体加载正确了,我们使用TTF_RenderTextBlended函数,将消息文本写入SDL_Surface上,并且获取这个SDL_Surface指针。SDL_ttf提供了几种方法来绘制文本,blended是其中绘制效率最慢但是效果看起来最好的。其他的方法可以从文档中查找到。
但是,因为在绘制过程中我们使用的是SDL_Texture,所以我们需要把surface转换为SDL_Texture. 这并不难,因为我们把SDL_Renderer设为了全局变量,所以把它直接传入SDL_CreateTextureFromSurface很容易。在创建完SDL_Texture之后,我们需要把不用的变量,SDL_Surface和TTF_Font的变量清理掉。我们和以前一样释放掉surface,使用TTF_CloseFont关闭掉我们打开的字体。
当所有的东西被清理完毕后,我们返回SDL_Texture指针。
当我们想要绘制一些文本的时候,我们可以执行如下这段代码:
这里我们把消息“TTF fonts are cool!”使用之前下载的那个字体绘制了出来,字体大小为64。
然后你可以把这个texture当作一般的texture,使用和以前一样的ApplySurface函数绘制出来。如果你将消息文本以居中的形式绘制了,你应该可以看到以下结果:
你可以试着玩玩其他的那些TTF_RenderText_X函数,看看它们的效果是什么样的!
End of Lesson 6
感谢你的加入!我们第七节:充分利用类再见!