一、Pygame Introduce
Pygame is a set of Python modules designed for writing video games. Pygame adds functionality on top of the excellent SDL library. This allows you to create fully featured games and multimedia programs in the python language.
Pygame 是一个可以用于编写游戏的Python第三方模块,可以使用Pygame在基于Python语言的基础上开发出功能齐全的多媒体程序或者游戏。
Pygame is free. Released under the LGPL licence, you can create open source, freeware, shareware, and commercial games with it. See the licence for full details.
Pygame 是开源免费的,基于LGPL协议,可以使用该模块创建开源的软件或者游戏
更多关于 Pygame 的介绍可以参考 Pygame Wiki
Install Pygame
安装 Pygame 推荐使用 pip 工具进行安装,可以在创建的虚拟环境中安装,也可以在存在多个Python版本的情况下指定Python版本安装
pip3 install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple 复制代码
或者
python3 -m pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple 复制代码
这里使用了清华的镜像,安装速度更快。安装完成后可以通过在Terminal中输入以下该命令检查 Pygame 是否正确安装
python3 -m pygame.examples.aliens 复制代码
更多Examples请查看 pygame.examples
也可以使用 pip3 list
查看安装的第三方包是否包含了 Pygame
二、Pygame Quickstart
Quickstart
普通的python程序是通过控制台进行输入和输出,而pygame是通过图形和文本绘制一个单独的窗口,在窗口中显示内容,可以对窗口大小颜色自定义,可以在窗口中绘制任何图形,通过调用pygame中的事件event,既键盘和鼠标的输入来对窗口内容进行操作
使用 Pygame 绘制图形需要以下几步
- 导入Pygame模块
- Pygame初始化
- 定义窗口显示的内容
- 定义窗口
- 创建并将内容填充到窗口中
- 刷新显示 创建pygame_quickstart.py脚本
import pygame from pygame.locals import * pygame.init() # 这里使用了自定义的中文字体,需要将该字体放入脚本同级目录下 cust_font = pygame.font.Font('GongFanNuFangTi.ttf', 60) # RGB表示颜色,这里是一个元组 font_color = (255, 255, 255) bg_color = (120, 120, 255) text_bg = cust_font.render('上海加油,早日战胜疫情', True, font_color) cust_window = pygame.display.set_mode((600, 500)) cust_window.fill(bg_color) cust_window.blit(text_bg, (150, 200)) pygame.display.update() 复制代码
运行这段程序,控制台没有任何报错,但是也没有图形界面显示
这是因为代码执行结束后窗口会快速关闭,所以可以通过加入while循环来保持程序运行一段时间,并且通过监听键盘事件来终止程序
import sys # 中间代码保持不变 while True: for event in pygame.event.get(): # Q键、删除键、ESC键终止程序 if event.type in (QUIT, KEYDOWN, K_ESCAPE): sys.exit() cust_window.fill(bg_color) cust_window.blit(text_bg, (100, 100)) pygame.display.update() 复制代码
再次运行
会出现一个自定义的窗口以及自定义的文字
三、Font 类
实例化 Font 对象
普通Python程序中输出的字体是以系统字体为准,当然你可以从IDE中设置控制台字体样式,但是在pygame中存在pygame.font.Font对象,通过两个参数既可以实例化一个Font对象,这两个参数分别为字体样式和大小
import pygame from pygame.locals import * pygame.init() cust_font = pygame.font.Font('GongFanNuFangTi.ttf', 60) print('cust_font的变量的类型是:{}'.format(type(cust_font))) 复制代码
想要自定义字体样式需要,将字体下载到本地,Font实例化第一个参数填入自定义字体样式的地址即可
render() 方法渲染一个 Font 对象
Font对象中包含了render()方法,该方法包含了四个参数,其中三个必填参数,一个可选参数
text_bg = cust_font.render('上海加油,早日战胜疫情', True, font_color) 复制代码
text:要渲染的文本内容,str类型 antialias:是否抗锯齿,布尔类型 color:字体颜色,元组类型 background:背景,可选参数,默认为None
antialias抗锯齿会使得文本看上去更加平滑一些,修改antialias参数为False,执行pygame_quickstart程序
render()方法返回一个Surface类,这个Surface类就是承载文本内容的窗口
四、Surface 类
set_mode()函数返回一个pygame.Surface对象,Surface对象就是显示内容的窗口,相当于把Python程序的输出目的地从控制台变为Surface窗口。
cust_window = pygame.display.set_mode((1000, 500)) print('cust_window变量的类型是:{}'.format(type(cust_window))) while True: for event in pygame.event.get(): # print("所有event的类型", event.type) # Q键、删除键、ESC键终止程序 if event.type in (QUIT, KEYDOWN, K_ESCAPE): sys.exit() cust_window.fill(bg_color) cust_window.blit(text_bg, (150, 200)) pygame.display.update() 复制代码
Surface对象可以调用fill()方法既清除屏幕填充颜色,bilt()方法既进行绘制图形,只不过在上述的代码中是显示一个文本,该方法返回一个Rect类,还可以调用bilts()绘制多个图形,返回Rect类列表。
需要了解的是Pygame库中存在多个Surface类
并且pygame.Surface和pygame.SurfaceType类是相等的,fill()、bilt()等方法的注释可以在SurfaceType类中看到
五、Rect 类
在pygame下的draw模块是用来绘制图形的,比如矩形、圆形、椭圆、线条等
所有这些方法都会返回Rect类,并且这些方法都需要输入一个Surface对象作为参数还有其他一些参数比如位置、坐标、颜色等。
Rect 类表示特定大小和位置的矩形区域,使用该类可以设置窗口中对象的位置
Surface对象的get_rect()方法可以返回一个Rect类
绘制线条
绘制线条需要调用pygame.draw.line()函数,该函数要求传入五个参数,其中线条的宽度默认为1
# module name pygame_draw_line import sys import pygame from pygame.locals import * # 初始化 pygame.init() # 创建窗口 win_size = (1000, 500) win = pygame.display.set_mode(win_size) # 设置窗口标题 pygame.display.set_caption('线条的绘制') bg_color = (120, 120, 255) while True: # 设置关闭窗口条件 for event in pygame.event.get(): if event.type in (QUIT, KEYDOWN): sys.exit() win.fill(bg_color) '''开始绘制线条''' # 线条颜色 color = (100, 255, 200) # 线条宽度 width = 5 # 起点坐标 start = (400, 100) # 终点坐标 end = (600, 400) # 绘制线条 line_type = pygame.draw.line(win, color, start, end, width) print(type(line_type)) '''结束绘制线条''' # 刷新显示 pygame.display.update() 复制代码