2015/11/3用Python写游戏,pygame入门(3):字体模块、事件显示和错误处理
游戏里面一般是肯定会出现文字显示的,即使是俄罗斯方块也应该显示分数。那么我们应该怎样来显示文字呢,今天一起学习一下pygame的font模块。
使用字体模块
pygame可以直接调用系统字体,也可以调用TTF字体。为了使用字体,首先应该创建一个Font对象,对于系统自带的字体,应该这样调用:
>>> font1 = pygame.font.SysFont('arial', 16)
第一个参数是字体名,第二个参数是字号。正常情况下系统里都会有arial字体,如果没有会使用默认字体,默认字体和各个系统有关。
可以使用pygame.font.get_fonts()来获得当前系统所有可用字体:
>>> pygame.font.get_fonts()
['stsong', 'rod', 'microsoftyahei', 'mingliupmingliumingliuhkscs', 'stxingkai', 'euclidmathtwo', 'impact', 'simplifiedarabicfixed', 'wingdings2', 'wingdings3', 'lucidabright', 'verdana', 'mistral', 'gigi', 'traditionalarabic', 'lucidacalligraphy', 'lucidasanstypewriteroblique', 'stzhongsong', 'tempussansitc', 'microsoftuighur', 'georgia', 'wingdings', 'goudystout', 'candara', 'pristina', 'microsoftjhengheimicrosoftjhengheiui', 'gulimgulimchedotumdotumche', 'lisu', 'levenim', 'lucidafaxregular', 'lucidasansregular', 'lucidafax', 'tahoma', 'blackadderitc', 'niagarasolid', 'euclid', 'bernardcondensed', 'lucidasanstypewriterregular', 'bauhaus93', 'corbel', 'segoeuisymbol', 'franklingothicdemi', 'poorrichard', 'centaur', 'stxinwei', 'arialblack', 'nirmalaui', 'msoutlook', 'microsoftjhenghei', 'tigerexpert', 'malgungothic', 'felixtitling', 'freesiaupc', 'colonna', 'franklingothicheavy', 'harrington', 'jokerman', 'extra', 'lucidasanstypewriter', 'rockwellcondensed', 'stfangsong', 'microsoftnewtailue', 'aharoni', 'twcen', 'britannic', 'mvboli', 'goudyoldstyle', 'microsoftsansserif', 'gisha', 'fzshuti', 'simsunnsimsun', 'estrangeloedessa', 'symboltigerexpert', 'juiceitc', 'onyx', 'tiger', 'webdings', 'franklingothicmediumcond', 'edwardianscriptitc', 'vani', 'couriernew', 'freestylescript', 'palacescript', 'bodonicondensed', 'msminchomspmincho', 'andalus', 'footlight', 'vivaldi', 'century', 'arialrounded', 'papyrus', 'ocraextended', 'simsunextb', 'arialms', 'microsoftphagspa', 'hightowertext', 'stxihei', 'bodoni', 'haettenschweiler', 'berlinsansfbdemi', 'twcencondensedextra', 'elephant', 'angsananew', 'widelatin', 'meiryomeiryoboldmeiryouiboldmeiryouibolditalic', 'segoeuisemilight', 'shruti', 'arabictypesetting', 'timesnewroman', 'lucidahandwriting', 'maturascriptcapitals', 'engravers', 'segoeuisemibold', 'vladimirscript', 'kaiti', 'mingliuextbpmingliuextbmingliuhkscsextb', 'miriamfixed', 'kokila', 'chiller', 'fangsong', 'niagaraengraved', 'gillsansextcondensed', 'raavi', 'rockwellextra', 'gillsansultra', 'browalliaupc', 'euclidmathone', 'broadway', 'dilleniaupc', 'stkaiti', 'parchment', 'franklingothicdemicond', 'gadugi', 'calibri', 'arial', 'curlz', 'batangbatangchegungsuhgungsuhche', 'shonarbangla', 'extratiger', 'maiandragd', 'simhei', 'narkisim', 'segoeui', 'aparajitaitali', 'calisto', 'leelawadee', 'lucidasansroman', 'cooperblack', 'sakkalmajalla', 'berlinsansfb', 'consolas', 'frenchscript', 'microsoftjhengheimicrosoftjhengheiuibold', 'sylfaen', 'algerian', 'microsoftyaheimicrosoftyaheiui', 'microsoftyaheimicrosoftyaheiuibold', 'oldenglishtext', 'bradleyhanditc', 'aparajita', 'kodchiangupc', 'gillsans', 'palatinolinotype', 'gloucesterextracondensed', 'gabriola', 'lucidaconsole', 'plantagenetcherokee', 'meiryomeiryomeiryouimeiryouiitalic', 'cordiaupc', 'erasdemiitc', 'segoeprint', 'nyala', 'harlowsolid', 'forte', 'franklingothicmedium', 'laoui', 'microsofttaile', 'bookantiqua', 'symbol', 'lucidasans', 'garamond', 'vrinda', 'agencyfb', 'constantia', 'jasmineupc', 'khmerui', 'kalinga', 'kartika', 'euphemia', 'frankruehl', 'vinerhanditc', 'snapitc', 'euclidsymbol', 'david', 'baskervilleoldface', 'segoescript', 'cambria', 'daunpenh', 'bodonipostercompressed', 'monotypecorsiva', 'perpetuatitling', 'trebuchetms', 'msreferencesansserif', 'imprintshadow', 'centuryschoolbook', 'browallianew', 'sthupo', 'stencil', 'script', 'bookmanoldstyle', 'ebrima', 'msgothicmspgothicmsuigothic', 'copperplategothic', 'modernno20', 'utsaahitali', 'microsoftyibaiti', 'dfkaisb', 'comicsansms', 'magneto', 'rockwell', 'ravie', 'youyuan', 'bodoniblack', 'latha', 'irisupc', 'dokchampa', 'rage', 'msreferencespecialty', 'euclidfraktur', 'playbill', 'cambriacambriamath', 'kunstlerscript', 'twcencondensed', 'showcardgothic', 'bell', 'mangal', 'cordianew', 'californianfb', 'stliti', 'kristenitc', 'erasmediumitc', 'fencesplain', 'euclidextra', 'moolboran', 'informalroman', 'mongolianbaiti', 'symboltiger', 'centurygothic', 'franklingothicbook', 'castellar', 'iskoolapota', 'microsofthimalaya', 'erasitc', 'kokilaitali', 'stcaiyun', 'fzyaoti', 'gillsanscondensed', 'simplifiedarabic', 'vijaya', 'gillsansultracondensed', 'miriam', 'perpetua', 'bookshelfsymbol7', 'gautami', 'utsaah', 'lilyupc', 'tunga', 'angsanaupc', 'brushscript', 'eucrosiaupc']
还有一种调用方法是使用自己的ttf字体:
my_font = pygame.font.Font("my_font.ttf", 16)
这个方法的优势是你可以把字体文件和游戏一起打包分发,避免玩家电脑上没有这个字体无法显示的问题。
一旦你有了Font对象,你就可以用render方法来写字了,然后通过blit方法blit到屏幕上;
>>> text = font1.render("Input your text here",True,(0,0,0),(255,255,255))
render方法的第一个参数是写入的文字内容;第二个是布尔值,说明是否开启抗锯齿;第三个是字体本身的颜色;第四个是背景的颜色。如果不想有背景色,也就是让背景透明的话,可以不加第四个参数。
另外,如果是Python2,想显示中文的话,要使用能用中文的字体,然后用u前缀字符串,也就是用Unicode编码。最后还得在文件头加上,# -*- coding: utf-8 -*-这样的注释文字。
字体模块的具体使用,我举下面这个例子,连上讲,说明显示所有事件的办法:
#-*- coding: utf-8 -*-
import pygame
from sys import exit pygame.init() #初始化pygame
SCREEN_SIZE = (640, 480) #存储屏幕尺寸
screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
#创建窗口 my_font = pygame.font.SysFont('arial',16)
#创建字体对象
font_height = my_font.get_linesize()
#得到字体的高度值
text = [] while True:#主循环
event = pygame.event.wait()#这里用了wait()方法
text.append(str(event))
#获得事件的名称
text = text[-SCREEN_SIZE[1]/font_height:]
#这个切片操作保证了event_text里面只保留一个屏幕的文字 if event.type == pygame.QUIT:
pygame.quit()
exit() screen.fill((255,255,255)) y = SCREEN_SIZE[1]-font_height
#找一个合适的起笔位置,最下面开始但是要留一行的空
for line in reversed(text):#倒序写满整个屏幕的文字
screen.blit(my_font.render(line, True, (0,0,0)), (0, y))
#显示字体
y -= font_height
#把笔提一行 pygame.display.update()
这个程序的具体解释应该看注释就可以理解。所以就不详细说明了。其中pygame.event.wait()是一直等待到有事件的发生才会执行,一般不常用这个方法。
写程序的时候建议大家读懂后给每一行加上自己的注释,然后删去我的源码,重新打一遍,那样会比较容易掌握pygame的使用。当然,这么简单的东西对于大多熟练的程序员都不需要那么细致的学习,大致看过去就可以了。
Python的错误处理
程序总是会出错的,pygame的运行也常常是这样,那个时候没办法只能强制中止程序,而强制中止程序能够成功还是系统的功劳。那么我们应该怎样避免程序错误时完全无法反应呢?
Python提供了良好的错误处理机制,应该使用起来:
try:
screen = pygame.display.set_mode(SCREEN_SIZE)
except pygame.error, e:
print "Can't create the display :-("
print e
pygame.quit()
exit()
这种方法非常有用,特别是开发实际的程序中。当然这仅仅是Python自带的处理方式,但是这很有用。
今天就讲这么多,之后我通过一步步制作一个简单的小游戏来说明pygame的具体使用。讲的比较基础,价值有限,对于初学者稍有一些意思。
我准备模仿微信的飞机大战制作过程说明,很简单的2D小游戏。只是献丑。
今天女朋友给我买的键盘刚到货,青轴的脆响的确很舒服。让我自己偷着乐一会儿。
2015/11/3用Python写游戏,pygame入门(3):字体模块、事件显示和错误处理的更多相关文章
- 2015/11/6用Python写游戏,pygame入门(6):控制大量的对象
昨天我们已经实现了这个游戏的三个基本类. 但是现在它还是没办法做成一个适合玩的游戏,毕竟只有一架敌机的游戏是很乏味的.所以,我们需要好多子弹,也需要好多敌机. 所以,我们要创建list,这个list存 ...
- 2015/11/1用Python写游戏,pygame入门(1):pygame的安装
这两天学习数据结构和算法,有时感觉并不如直接做项目来的有趣.刚刚学完python的基本使用,现在刚好趁热打铁做个小项目. 由于本人一直很想制作一款游戏,就想使用Python制作一个基础的游戏.搜了一下 ...
- 2015/11/7用Python写游戏,pygame入门(7):碰撞检测
我们已经完成了飞机大战的大部分东西,但是游戏还是没有办法正式开玩,因为子弹并不能打掉飞机.只有完成了这一个工作,游戏才算基本成型. 今天的内容就非常简单了,就是做到这个碰撞检测,以及控制好子弹和飞机的 ...
- 2015/11/5用Python写游戏,pygame入门(5):面向对象的游戏设计
昨天的内容里有了运动的子弹,虽然我们只添加了一个子弹,但你可以看到我们需要记录子弹的x,y坐标,每次要更新它的坐标.如果我们想要有多颗子弹,就需要存储多个坐标.那时候处理起来就不显得那么简单,也许我们 ...
- 2015/11/4用Python写游戏,pygame入门(4):获取鼠标的位置及运动
按昨天的说法,今天将开始做一个简单的游戏了. 目标是拷贝微信的飞机大战,当然拷贝完以后大家就具备自己添加不同内容的能力了. 首先是要拿到一些图片素材,熟悉使用图像处理软件和绘画的人可以自己制作,并没有 ...
- 2015/11/2用Python写游戏,pygame入门(2):游戏中的事件和显示
pygame是一个比较大的库,以我这点弱小的实力是没办法详解的.所以我只讲我懂得那些部分,其他部分由大家慢慢查找了解. ------------------------------- 我用pygame ...
- 2015/11/9用Python写游戏,pygame入门(8):按钮和游戏结束
昨天没有更新内容,今天相对多写一些. 因为我们已经基本完成游戏框架,但是游戏结束后,并不知道怎样比较好开始.我本来本着懒的原则,想结束后显示一个黑屏,然后你重新点一下鼠标就重新开始.但是那样实在太不像 ...
- 用Python和Pygame写游戏-从入门到精通(py2exe篇)
这次不是直接讲解下去,而是谈一下如何把我们写的游戏做成一个exe文件,这样一来,用户不需要安装python就可以玩了.扫清了游戏发布一大障碍啊! perl,python,java等编程语言,非常好用, ...
- python小游戏-pygame模块
一.tkinter模块的GUI 基本上使用tkinter来开发GUI应用需要以下5个步骤: 导入tkinter模块中我们需要的东西. 创建一个顶层窗口对象并用它来承载整个GUI应用. 在顶层窗口对象上 ...
随机推荐
- mininet实验 动态改变转发规则实验
写在前面 本实验参考 POX脚本设置好控制器的转发策略,所以只要理解脚本. mininet脚本设置好拓扑和相关信息,所以也只要理解脚本. POX脚本目前基本看不懂. 本实验我学会了:POX控制器Web ...
- Storm元数据交互详解
一.Nimbus Nimbus既需要在Zookeeper中创建元数据,也需要从Zookeeper中获取元数据. 如上图箭头1所示: 1.对于路径a,Nimbus只会创建路径,不会设置数据,数据是稍后由 ...
- ansible介绍和安装
ansible是由 Python 编写的强大的配置管理解决方案,ansible 的特点就在于它的简洁与高效率 ansible与其他的配置管理工具不同点在于:不需要你在想要配置的每个节点上安装自己的组件 ...
- iptables 工具的使用
试验建议:关闭CentOS 7 或 CentOS 6的防火墙 (systemctl stop firewalld ; systemctl disable firewalld 或 service ipt ...
- Django之contenttypes的应用
Django contenttypes 应用 简介 contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我 ...
- MYSQL-update与select结合使用
使用 inner join ) c ,," , iteration; 如上例子: 完成更新 picture.labels 字段 & picture.iteration自增 的两个 ...
- django学习系列-01
安装Django > pip install django==1.10.3(py2)或者>python3 -m pip install django==1.10.3(py3) 成功安装 D ...
- EM算法【转】
混合高斯模型和EM算法 这篇讨论使用期望最大化算法(Expectation-Maximization)来进行密度估计(density estimation). 与K-means一样,给定的训练样本是, ...
- BZOJ 2424 订货(贪心+单调队列)
怎么题解都是用费用流做的啊...用单调队列多优美啊. 题意:某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初 ...
- CODE FESTIVAL 2016 qualA Grid and Integers
划年代久远的水 题意 有一个R*C的棋盘,要求在每个格子上填一个非负数,使得对任意一个2*2的正方形区域,左上角和右下角的数字之和等于左下角和右上角的数字之和.有一些格子已经被填上了数字,问现在能否满 ...