2.9 文字显示
现在我们已经知道了如何在屏幕上绘制图像,也知道了如何在屏幕上绘制基本图形,那么又该如何显示文字呢?还记得前文留下的一个悬念吗?绘制文字同样是通过Surface模块的blit()函数实现的。那么应该如何使用blit()函数显示文字呢?
显示文字这一看似简单的功能,在Pygame中实现起来却并没有那么简单。Pygame并没有提供把文字显示到Surface中的方法,而是需要首先把文字区域转换为image surface,然后使用blit()函数把该image surface绘制到屏幕display surface,这就是显示文字也需要通过blit()函数实现的原因。
当然,blit()函数的作用仅仅是绘制,除此之外,文字还涉及许多其他属性,如字体、颜色、尺寸等,以及如何把文字区域转换为image surface等,这些都是由pygame.font模块提供支持的。
下面结合pygame.font模块学习如何在Pygame程序中显示文字。
1. 获取字体
从pygame.font的模块名称可以看出,Pygame中的文字是与字体密切相关的,要想显示文字,首先必须创建字体类,即后面提到的Font类,这就需要事先准备好将要使用的字体。字体可以是默认字体,可以是来自于系统的字体,也可以来自于自己的ttf字体文件。
pygame.font模块中用来查找默认字体的函数如下。
该函数返回的是Pygame使用的默认字体的文件名称。执行该函数,其返回结果为freesansbold.ttf,可以在Pygame的安装包中找到该字体文件。
pygame.font模块还提供了用于查找系统字体的函数,如下。
该函数返回的是当前系统中所有可用字体的名称列表。在笔者的系统中执行该函数,其返回结果如图2-8所示。
图2-8 系统字体列表
可以看出,笔者系统中的系统字体还是比较多的。
2. 关键函数
在讲解如何显示文字前,首先介绍pygame.font模块提供的一些用于文字显示的关键函数。
以下函数将使用系统字体创建一个Font类的对象。
我们知道,在Pygame中要想显示文字,首先必须创建字体类,该函数的作用就是创建字体类。不过该函数只适用于使用系统字体的情况,如果需要使用自己的ttf字体文件显示文字,则必须使用Font类构造字体对象,这一点将在后面讲到。
继续分析该函数,其参数name代表系统字体的名称,即get_fonts()函数返回结果中的字体名称;size代表字体尺寸;bold代表字体是否加粗;italic代表字体是否倾斜,其返回值为Font类的对象。
另外,在使用SysFont()函数时,还有一种特殊情况,即参数name为None,此时使用的字体为Pygame默认字体,即get_default_font()函数返回的字体。
下面分析Font类。
Font类是pygame.font模块中定义的一个类,以下是其主要方法。
以下为Font类的构造函数。
Font类的构造函数只接收两个参数:第一个参数filename为字体文件名称,第二个参数size为字体尺寸。
注意:这里的filename与SysFont()参数中的name是不同的,前者是包含路径在内的字体文件名称,后者只是字体名称。
要想使用自己的ttf字体文件显示文字,则必须使用Font类的构造函数创建字体对象。
在使用Font类的构造函数创建字体对象时,也有一种特殊情况,即当参数filename为None时,它同样使用的是默认字体,此时与使用SysFont(None,size)方法没有区别。
重点来了,以下方法是把文字区域转换为image surface的关键方法。
render()方法的作用是把文字所在的区域转换为image surface,进而把该Surface blit到屏幕Surface,其参数text代表待显示的文字,只能是单行,不支持多行;antialias代表是否打开抗锯齿,如果为True,则文字将拥有平滑的边缘;color代表文字颜色;background代表背景颜色,如果为None,则文字背景是完全透明的。
在显示文字时,我们应该总是使用render()方法把文字区域转换为image surface。
以下三种方法用来设置字体的属性,它们应该总是在render()函数前被调用。
该方法用来设置字体加粗。
该方法用来设置字体倾斜。
该方法用来设置字体的下画线。
了解了pygame.font模块中的关键函数后,下面介绍如何利用它们显示文字。
3. 使用默认字体显示文字
使用默认字体显示文字的方法有以下两种。
或者
只需要把SysFont()或者Font()函数中的第一个参数设置为None即可。
注意:这里的SysFont()只是一个普通函数,在执行Font()函数时,调用的是Font类的构造方法。另外,在上面两段代码中,text只是image surface,后续需要使用blit()函数把它们绘制到屏幕Surface,才可以显示出来,这里给出的只是关键的几行代码。函数中指定的尺寸、颜色等参数都只作为示例,使用时可以随意设置;后面的几段代码与之同理。
可以看出,在Pygame中显示文字其实并不复杂,只是增加了两行代码而已。
4. 使用系统字体显示文字
使用系统字体显示文字必须使用SysFont()函数创建字体对象,如下。
上述代码的作用是使用系统字体arial显示文字system font。
5. 使用自己的ttf字体文件显示文字
如果需要使用自己的ttf字体文件显示文字,则必须使用Font类的构造函数创建字体对象。
上述代码的作用是使用自定义字体comici.ttf显示文字customed font。字体文件名称可以是相对路径,也可以是绝对路径。如果只有一个文件名称,则默认在当前目录下查找。
6. 显示中文
如果需要显示中文,则必须使用支持中文的字体,可以是系统字体,也可以是自己的ttf字体文件。
上述代码的作用是使用“华文行楷”字体显示文字“系统字体”。
7. 具体示例
最后给出一个关于文字显示的完整示例,供读者参考,整体代码如下。
上述程序的执行效果如图2-9所示。
图2-9 文字显示示例程序