用Python和Pygame写游戏-从入门到精通(4)

By | 2011/05/08

不过5月上旬,气温居然就到了33℃,这日子真是不让人活了……

另外今天是母亲节啊,不知道上什么图片就上这张吧~~

今天说明字体模块和一些错误处理。

使用字体模块

就像上一次说的,一个游戏,再怎么寒碜也得有文字,俄罗斯方块还有个记分数的呢;印象中没有文字的电子游戏只有电脑刚刚诞生的那种打乒乓的了。Pygame可以直接调用系统字体,或者也可以使用TTF字体,稍有点电脑知识的都知道这是什么。为了使用字体,你得先创建一个Font对象,对于系统自带的字体:

第一个参数是字体名,第二个自然就是大小,一般来说“Arial”字体在很多系统都是存在的,如果找不到的话,就会使用一个默认的字体,这个默认的字体和每个操作系统相关,你也可以使用pygame.font.get_fonts()来获得当前系统所有可用字体。还有一个更好的方法的,使用TTF的方法:

这个语句使用了一个叫做“my_font.ttf”,这个方法之所以好是因为你可以把字体文件随游戏一起分发,避免用户机器上没有需要的字体。。一旦你创建了一个font对象,你就可以使用render方法来写字了,然后就能blit到屏幕上:

第一个参数是写的文字;第二个参数是个布尔值,以为这是否开启抗锯齿,就是说True的话字体会比较平滑,不过相应的速度有一点点影响;第三个参数是字体的颜色;第四个是背景色,如果你想没有背景色(也就是透明),那么可以不加这第四个参数。

下面是一个小例子演示下文字的使用,不过并不是显示在屏幕上,而是存成一个图片文件

追加说明一下如何显示中文,这在原书可是没有的哦:) 简单来说,首先你得用一个可以使用中文的字体,宋体、黑体什么的,或者你直接用中文TTF文件,然后文字使用unicode,即u”中文的文字”这种,最后不要忘了源文件里加上一句关于文件编码的“魔法注释”,具体的可以查一下Python的编码方面的文章。举一个这样的例子:

Pygame的错误处理

程序总会出错的,比如当内存用尽的时候Pygame就无法再加载图片,或者文件根本就不存在。再比如下例:

对付这种错误一个比较好的方法:

其实就是Python的标准的错误捕捉方法就是了,实际的游戏(或者程序)中,错误捕捉实在太重要了,如果你写过比较大的应用,应该不用我来说明这一点,Pygame中也是一样的。

Pygame的基础就到这里,后面我们会进行一些高级的介绍,下一次的话,就开始讲画东西了~

>> 用Python和Pygame写游戏-从入门到精通(5)

有38人评论 用Python和Pygame写游戏-从入门到精通(4)

  1. fliks

    xp下font = pygame.font.SysFont(“宋体”, 40) 是可以的

    回复
  2. thompson2011

    这节能不能提供源码,我在win7 64 下试了很久,也没有成功

    回复
  3. Bug

    很喜欢那张母亲节的图片,收藏了…
    坚持看完这的系列教程:)

    回复
  4. 走流沙

    这句话在我的XP上不能用,报错IOError: unable to read font file ‘simsun.ttc’
    把它换成”宋体”和 “simsunnsimsun” 就可以。

    回复
  5. 走流沙

    但是如果要把这一句font = pygame.font.Font(“simsun.ttc”, 40)中的“Font”换成“SysFont”,就可以运行了,但窗口里出现的不是字体,而是两个小方块在移动

    回复
    1. xishui 作者

      可惜,还差一点你就能触摸到真理了!IOError: unable to read font file ‘simsun.ttc’是说找不到这个文件,所以你需要把这个文件找到(自己系统搜,或者网上搜),放到代码目录下执行才可以;而将Font改为SysFont,虽然不会报错,但是实际上系统并没有这样的字体,所以只能出现小方块了。。。革命尚未成功,同志还需努力啊!

      回复
  6. bambotus

    @xishui: 我的开始也是小方块。
    然后把# -*- coding: utf-8 -*-换成# -*- coding:gbk-*-
    把u”你好”,改为”你好”后就正常了。(win7 32位 py2.5)

    回复
  7. JJin

    请问,我一下的代码
    self.text4 = self.font.render(‘abcn bcd’, True, (0, 0, 0))
    输出不出回车,而是个方形怎么办?

    回复
  8. JJin

    请问,我一下的代码
    self.text4 = self.font.render(‘abcn bcd’, True, (0, 0, 0))
    输出不出回车,而是个方形怎么办?

    回复
  9. good

    a good course, i finally know c++’s game lib’s shortcoming compared to python

    回复
  10. criss

    请问字体设置好后,字体的大小怎么更改?总不能每种大小都要设一种字体吧?

    回复
    1. xishui 作者

      您说对了,每一种大小就应该新建立一个字体对象:)这是非常普遍的做法。

      回复
  11. lzy

    你好,我是一PY初学者。我试用了你使用中文字的那节代码
    但是PY显示源代码的倒数第4行那个分号是错的,请问是怎么回事?
    我电脑是64位的,PY2.7

    回复
    1. xishui 作者

      是这样的,我把自己博客更新了一遍后,代码中所有的>变成了&gt;,<成了&gt;,现在我又修改了一下,应该是正确的了,如果没有,请手动改一下吧!

      回复
  12. miku

    你好 请问为什么有时候它会提示 Text has zero width但是有时候又不会?

    回复
  13. cqq626

    File “C:UserslenovoDesktoptemp.py”, line 31
    if x < -text_surface.get_width():
    ^
    SyntaxError: invalid syntax
    这是怎么回事呐

    回复
  14. QXX

    字的移动速度不稳定,忽快忽慢是为啥??

    回复
    1. happy球

      出现的不是中文,而是Aa-A什么的像代码一样的是什么情况啊?

      回复
  15. 燕妮

    刚开始是一定的两个小方块,在C:\Windows\Fonts下拷贝出相应ttf文件到源文件夹下后,显示正常

    回复
    1. 燕妮

      刚开始是移动的两个小方块,在C:\Windows\Fonts下拷贝出相应ttf文件到源文件夹下后,显示正常

      回复
  16. 无名侠

    想请教一下。 如何获取字体的宽度?
    因为我需要绘制气泡提示框,但是不知道该如何获取字体的宽度。

    回复
  17. Rain

    请问为什么我把宋体改成楷体,出现的字的字体并没有发生变化呢?

    回复
  18. yang123

    如果用event.wait()接收事件也挺好玩的

    回复
  19. 周辉

    去掉screen.blit(background, (0, 0))的效果,能发现什么宝藏?说明了什么?

    回复
  20. 华南分类传媒

      《画江湖之不良人》真人版网剧正在热播中,开播后就引起网友们的关注和喜爱。网友们想知道黑白无常究竟是什么关系?那么黑白无常结局是什 理财教程 么? 关注微信号:cweipan 手机也能炒白银原油,快来试试吧  超级网剧《画江湖之不良人》集合了传统武侠剧的热血宏大,也融入了时下流行的年轻文化气息,人物造型和设置上集合动画元素,新派武侠创意十足,这就是一部最合适时下年轻人看的武侠剧。最重要的是,《画江湖之不良人》情节尊重于原著故事线发展,不拖沓不滥改,这也是网友们纷纷路转粉,和动画迷们一起”自来水”推荐的主要原因。  超级网剧《画江湖之不良人》打造了一个新派武侠概念,为传统意义上的武侠剧,注入了

    回复
  21. 综投网

      自从参加了爸爸去哪儿,鲍蕾和陆毅的女儿 理财小知识 贝儿就走入了观众的视野,有一对颜值高的父母让贝儿也乖巧伶俐, 童趣活泼的性格也给小姑娘增粉不少。而前几天贝儿刚刚过完自己的8岁生日,恭喜我们的小公举又长大一岁啦!  10月26日,陆毅在微博晒为女儿庆生的照片,小公主贝儿身着白色裙子,派对现场以粉色为主题,好似童话场景。不过也有网友觉得太奢华。  10月26日,陆毅在微博晒为女儿庆生的照片,小公主贝儿身着白色裙子,派对现场以粉色为主题,好似童话场景。不过也有网友觉得太奢华。  10月26日,陆毅在微博晒为女儿庆生的照片,小公主贝儿身着白色裙子,派对现场以粉色为主题,好似童话场景。不过也有网友觉得太奢华

    回复
  22. Pingback: 用Python和Pygame写游戏-从入门到精通(4) – 小猫编程站

  23. Pingback: 用Python和Pygame写游戏-从入门到精通(4) | 演道网

  24. zhangzhen

    系统win7
    python 3.5
    运行字体循环程序。
    切换到其他窗口后,再点击pygame的窗口。程序就 不响应 了 。必须关掉,重新运行程序。
    怎么解决?有知道麻烦回复一下。

    回复
  25. xqq

    你好,非常感谢你作者大大的无私奉献和卓越水平
    经过copy你的代码,并且看了底下的热烈评论,以下操作可以输出正确的字符,供后来的朋友看哦

    系统:win7,64位
    C:\Windows\Fonts这里看到有哪些字体

    # -*- coding: utf-8 -*-这句需要
    font = pygame.font.SysFont(“宋体”, 40)亲测可以,
    text_surface = font.render(u”来吃我啊”, True, (0, 0, 255))这句里的u不用去掉

    ^_^

    回复
    1. xishui 作者

      这么多年了,没想到还是有人在学习这个系列并且有所收获,感觉好欣慰啊^_^

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注