![零基础入门Python游戏](https://wfqqreader-1252317822.image.myqcloud.com/cover/70/44510070/b_44510070.jpg)
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模块中用来查找默认字体的函数如下。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P44_1690.jpg?sign=1739295813-pmORgcsHFBLnD1vzoDa4fQQLu3RLscLY-0-caf9fed7131a44375e155d958822a90f)
该函数返回的是Pygame使用的默认字体的文件名称。执行该函数,其返回结果为freesansbold.ttf,可以在Pygame的安装包中找到该字体文件。
pygame.font模块还提供了用于查找系统字体的函数,如下。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P44_1699.jpg?sign=1739295813-06mrXXiFLt3hnmU87CGgMGNnObXc6OaA-0-1979b93f1ae1604dcc1eb2d830a42b03)
该函数返回的是当前系统中所有可用字体的名称列表。在笔者的系统中执行该函数,其返回结果如图2-8所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P44_1705.jpg?sign=1739295813-9Vjrpk18Cvaud2T9gF4YB66scV0yItGN-0-128ff67e74b449fb132533903c8e4b19)
图2-8 系统字体列表
可以看出,笔者系统中的系统字体还是比较多的。
2. 关键函数
在讲解如何显示文字前,首先介绍pygame.font模块提供的一些用于文字显示的关键函数。
以下函数将使用系统字体创建一个Font类的对象。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P45_1717.jpg?sign=1739295813-MC9xTPyzmejnJOKzDvsBUsp3vF87hZrK-0-31c16ff50ee4ba0cd4ade67980339472)
我们知道,在Pygame中要想显示文字,首先必须创建字体类,该函数的作用就是创建字体类。不过该函数只适用于使用系统字体的情况,如果需要使用自己的ttf字体文件显示文字,则必须使用Font类构造字体对象,这一点将在后面讲到。
继续分析该函数,其参数name代表系统字体的名称,即get_fonts()函数返回结果中的字体名称;size代表字体尺寸;bold代表字体是否加粗;italic代表字体是否倾斜,其返回值为Font类的对象。
另外,在使用SysFont()函数时,还有一种特殊情况,即参数name为None,此时使用的字体为Pygame默认字体,即get_default_font()函数返回的字体。
下面分析Font类。
Font类是pygame.font模块中定义的一个类,以下是其主要方法。
以下为Font类的构造函数。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P45_1726.jpg?sign=1739295813-YbwEN0SlJ4iyuaUefs1UGxITX2jYIL3G-0-5b289a6131e45fdfd66d18c53b2ce8b6)
Font类的构造函数只接收两个参数:第一个参数filename为字体文件名称,第二个参数size为字体尺寸。
注意:这里的filename与SysFont()参数中的name是不同的,前者是包含路径在内的字体文件名称,后者只是字体名称。
要想使用自己的ttf字体文件显示文字,则必须使用Font类的构造函数创建字体对象。
在使用Font类的构造函数创建字体对象时,也有一种特殊情况,即当参数filename为None时,它同样使用的是默认字体,此时与使用SysFont(None,size)方法没有区别。
重点来了,以下方法是把文字区域转换为image surface的关键方法。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P45_1741.jpg?sign=1739295813-oQyydbWXAAX5CR5m3qd0vnFYGUsNN4dP-0-4eff7bf1b4c190c93ebd855d4d759a02)
render()方法的作用是把文字所在的区域转换为image surface,进而把该Surface blit到屏幕Surface,其参数text代表待显示的文字,只能是单行,不支持多行;antialias代表是否打开抗锯齿,如果为True,则文字将拥有平滑的边缘;color代表文字颜色;background代表背景颜色,如果为None,则文字背景是完全透明的。
在显示文字时,我们应该总是使用render()方法把文字区域转换为image surface。
以下三种方法用来设置字体的属性,它们应该总是在render()函数前被调用。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P45_1750.jpg?sign=1739295813-US3S7ffLzz55WZa7Sl8UmC3B7JGbilz8-0-4c8cfdfcb57a5a37f9f2bdae5f911b67)
该方法用来设置字体加粗。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P46_11005.jpg?sign=1739295813-lWkno8cNG1yOZHLqwyniqLOkWSv7c8Xu-0-dc5800c4b2f6da29c3eabd749773c584)
该方法用来设置字体倾斜。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P46_11013.jpg?sign=1739295813-t7XuPVgZU981KffmIzjBYRPWu0DmgZSe-0-850903b55f5262f5b71cfe1f93dd9dcc)
该方法用来设置字体的下画线。
了解了pygame.font模块中的关键函数后,下面介绍如何利用它们显示文字。
3. 使用默认字体显示文字
使用默认字体显示文字的方法有以下两种。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P46_11021.jpg?sign=1739295813-vQ6etU4u3BuQMVsvIg7X2gs2Jpx0aDer-0-548e61ee3d835f431087928f54f3078a)
或者
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P46_11030.jpg?sign=1739295813-4IbpvxQ0rFDiss8WTj1eqD7xgQOA8N4z-0-199b59fbf7920520d89d0728063862fb)
只需要把SysFont()或者Font()函数中的第一个参数设置为None即可。
注意:这里的SysFont()只是一个普通函数,在执行Font()函数时,调用的是Font类的构造方法。另外,在上面两段代码中,text只是image surface,后续需要使用blit()函数把它们绘制到屏幕Surface,才可以显示出来,这里给出的只是关键的几行代码。函数中指定的尺寸、颜色等参数都只作为示例,使用时可以随意设置;后面的几段代码与之同理。
可以看出,在Pygame中显示文字其实并不复杂,只是增加了两行代码而已。
4. 使用系统字体显示文字
使用系统字体显示文字必须使用SysFont()函数创建字体对象,如下。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P46_11045.jpg?sign=1739295813-R7eqmyQPavIdPX2AiobOAuINqokNUDNP-0-bfcd70a04eff82b6351e593f5505d175)
上述代码的作用是使用系统字体arial显示文字system font。
5. 使用自己的ttf字体文件显示文字
如果需要使用自己的ttf字体文件显示文字,则必须使用Font类的构造函数创建字体对象。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P46_11054.jpg?sign=1739295813-yPGnMkelpzyagnidgLa9ErAOkEQ2zYoE-0-1dcb32cc1af6671cc1356ae9a6b8f53b)
上述代码的作用是使用自定义字体comici.ttf显示文字customed font。字体文件名称可以是相对路径,也可以是绝对路径。如果只有一个文件名称,则默认在当前目录下查找。
6. 显示中文
如果需要显示中文,则必须使用支持中文的字体,可以是系统字体,也可以是自己的ttf字体文件。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P47_1826.jpg?sign=1739295813-80NL0GVqhHWdQ4vNVT98mbd9e0bNXwrq-0-760e81f32a65f797b112599495dbc05b)
上述代码的作用是使用“华文行楷”字体显示文字“系统字体”。
7. 具体示例
最后给出一个关于文字显示的完整示例,供读者参考,整体代码如下。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P47_9748.jpg?sign=1739295813-hT5dK44W1mgEaYfw9RXS7a7SojQWeyuU-0-9d0cbec34deaf79dff941cd9ef690581)
上述程序的执行效果如图2-9所示。
![](https://epubservercos.yuewen.com/31D206/23721606009501206/epubprivate/OEBPS/Images/Figure-P48_1860.jpg?sign=1739295813-Ho8u7p8e8CetjGnzatKoWVlLpl5zvfOJ-0-a8b2bdb06963867ef006c72e6089fbdd)
图2-9 文字显示示例程序