1 安装Pygame
Pygame并不是Python所附带的,需要下载安装,下载地址如下:
(注意要根据你的操作系统版本和Python版本进行选择,如我的是32位系统安装的是python3.7,所以我选择了pygame-1.9.6-cp37-cp37m-win32.whl)
https://pypi.org/project/pygame/#files
下载完毕后,
使用pip install命令进行安装。
安装完毕后,可以使用import pygame进行测试,出现如下提示,表示安装成功。
2 Pygame中的Hello World
Pygame不能再交互式shell中工作,因此,我们只能编写Pygame程序,并且不能通过交互式shell每次给Pygame发送一条指令。
Pygame程序也不使用input()函数。这里没有文本输入和输出。相反,程序通过把图形和文本绘制到窗口,在一个窗口中显示输出内容。通过调用事件,Pygame程序接收来自键盘和鼠标的输入。
3 Hello World的源代码
在文件编辑器中输入如下代码(也可使用jupyer notebook或jupyter lab),并且把它保存为pygameHelloWorld.py。
4 运行Hello World程序
当我们运行这个程序时,我们会看到一个新的窗口出现,如下图所示:
使用窗口而不是控制台的好处就是,文本可以出现在窗口中的任意地方,而不是只能出现在之前已经打印的文本的后面。文本可以是任意的颜色和大小。窗口就像一块褐色的油画布,我们可以在上面绘制任何图形。
4.1 导入Pygame模块
导入pygame模块,便可在程序中调用pygame的函数。第二行代码导入了pygame.locals模块,这个模块包含了许多将要在Pygame中用到的常量。
如果在程序中使用的是from sys import *导入语句,而不是import sys导入语句,那么在代码中要使用exit()调用该函数,而不是使用sys.exit()。但是,在大多数时候,使用完整的函数名称会更好,因为这样可以知道函数是在哪个模块中。
4.2 pygame.init()函数
在导入pygame模块,并且在调用任何其他的Pygame函数之前,所有Pygame程序都必须先调用pygame.init()函数。这项工作是Pygame必须的初始化步骤。
5 字体和pygame.font.SysFont()函数
在使用控制台进行文本打印时,用于显示文本的颜色、大小和字体完全取决于操作系统设置。Python程序不能修改字体,但是Pygame可以以计算机上的任何字体来绘制文本。
Font对象的render()方法
存储在变量basicFont中的Font对象有一个叫做render()的方法。这个方法将返回一个Surface对象,文本就绘制于其上。render()的第一个i而参数是要绘制的文本的字符串。第2个参数是指是否要抗锯齿的一个Boolean值。
6 属性
pygame.Rect数据类型(简称Rect)表示特定大小和位置的矩形区域。调用函数pygame.Rect()来创建一个新的Rect对象。参数是表示左上角的XY坐标的证书,后面跟随着宽度和高度,都是以像素为单位。
带有参数的这个函数看上去是这样的:pygame.Rect(left, top, width, height)。
就像方法是与对象相关的函数一样属性(attribute)是与对象相关的变量。Rect数据类型有许多属性,用来描述它所表示的矩形。下表为myRect的一个Rect对象的属性的列表。
7 Pygame的绘制函数
7.1 pygame.draw.polygon()函数
绘制多边形
pygame.draw.polygon()函数可以绘制你指定的任意的多边形。参数一次为:
- 要在其上绘制多边形的Surface对象;
- 多边形的颜色;
- 由要依次绘制的点的XY坐标的元组所构成的一个元组。最后一个元组将自动连接到第一个元组以完成该形状;
- 可选项,表示多边形边线条的狂赌的整数值。没有这个选项的话,多边形将会被填充。
7.2 pygame.draw.line()函数
绘制直线
参数依次是:
- 要在其上绘制直线的Surface对象;
- 直线的颜色;
- 包含直线的一端的XY坐标的两个整数的一个元组;
- 包含直线的另一端的XY坐标的两个整数的一个元组;
- 可选项,表示线条的宽度的整数值。
7.3 pygame.draw.circle()函数
绘制圆形
参数依次如下:
- 要在其上绘制直线的Surface对象;
- 圆的颜色;
- 表示圆心的XY坐标的两个整数的一个元组;
- 表示圆的半径(也就是大小)的整数值;
- 可选项。表示线的宽度的一个整数值。宽度值为0,表示填充圆。
7.4 pygame.draw.ellipse()函数
绘制椭圆
参数依次如下:
- 要在其上绘制直线的Surface对象;
- 椭圆的颜色;
- 传递分别表示椭圆的左上角的X和Y坐标以及椭圆的宽和高的4个整数的一个元组;
- 可选项。表示线的宽度的一个整数值。宽度值为0,表示填充椭圆。
7.5 pygame.draw.rect()函数
绘制矩形
pygame.draw.rect()函数将要绘制一个矩形。第3个参数是包含了表示矩形的左上角的X和Y坐标,以及矩形的宽和高的4个整数的一个元组。也可以给第3个参数传递一个Rect对象,而不是传递4个整数的一个元组。
7.6 pygame.PixelArray数据类型
第48行创建了一个pygame.PixelArray对象。PixelArray对象是一个颜色元组的列表组成的一个列表,这些颜色元组表示传递给它的Surface对象。
第48行把windowSurface作为参数传递给pygame.PixelArray()函数调用,所以在第49行把BLACK分配给pixArray[480][380],将会把坐标为(480, 380)的像素改变为一个黑色像素。Pygame将这个改变自动更新到windowSurface对象。
PixelArray对象中的第一个索引是X坐标,第二个索引是Y坐标。PixelArray对象使得在一个PixelArray对象上将单独像素设置为特定颜色变得很容易。
第50行删除了PixelArray对象,这是因为从一个Surface对象创建PixelArray对象,将会锁定这个Surface对象。锁定意味着该Surface对象不能调用blit()函数。要解锁这个Surface对象,必须用del操作符PixeArray对象。如果忘记了删除PixelArray对象,机会得到一条错误信息:
pygame.error:Surfaces must not be locked during blit
7.7 pygame.display.update()函数
在Pygame中,在调用pygame.display.update()函数之前,并不会真的将任何内容绘制到屏幕上。这是因为在屏幕上绘制要比在计算机内存中的Surface对象上绘图慢。在每次调用了绘图函数之后,并不希望更新到屏幕上,只有在所有绘制函数都调用完后,才想要一次性更新屏幕。
8 事件和游戏循环
Pygame程序不断地运行叫做游戏循环(game loop)的一个循环。在这个程序中,游戏循环中的所有代码行每秒钟都会执行100次左右。
游戏循环是不断地查看新事件、更新窗口地状态并在屏幕上绘制窗口地一个循环。事件(event)是pygame.event.Event数据类型地对象,任何时候,当用户按下一个按键、点击或移动鼠标或使得其他一些其他事件发生地时候,Pygame都会创建该对象。
第59行是游戏循环的开始。把while语句的条件设置为True,所以它会永远循环。退出循环的唯一方式是,有一个事件导致了程序终止。
8.1 pygame.event.get()函数
调用pygame.event.get()函数检索自从上次调用pygame.event.get()后所生成的任何新的pygame.event.Event对象。这些事件会以Event对象的一个列表的形式。所有Event对象都有一个叫做type的属性,它告诉我们事件是什么类型。
第60行有一个for循环,遍历了pygame.event.get()所返回的列表中的每一个Event对象。如果事件的type属性等于常量QUIT那么我们就知道用户已经关闭了窗口并且想要终止程序。
当用户点击程序窗口的关闭按钮时,Pygame创建了QUIT事件。如果关闭了计算机并尝试终止所有运行的程序,也会产生该事件。无论什么原因产生了QUIT事件,都应该终止程序。
8.2 pygame.quit()函数
如果已经产生了QUIT事件,程序就应该调用pygame.quit()和sys.exit()。