一页纸 PythonGameZero 手册
pygame zero官方网站(https://pygame-zero.readthedocs.io)获取英文文档
PythonGameZero 简称 pgzero, 它对 Pygame 进行了封装, 屏蔽了繁琐枯燥的框架代码, 让学习者可以更专注于游戏的实现逻辑, 并且更快看到成果 更详细的语法说明见官方手册(opens new window)
基本框架
坐标系
以左上角为原点 ( 0, 0 ) pythonturtle坐标系

导入 pgzero
from pgzrun import *#表示导入pgzero库里面的所有函数
注意: 导入 pgzero 库, 不是直接直接pgzero, 而是pgzrun!!! 其实pgzrun 是 python game zero run的缩写
设置窗口
from pgzrun import * #导入pgzero库TITLE = 'hello' #设置窗口顶部的标题WIDTH = 600 #设置窗口的宽度HEIGHT = 800 #设置窗口的高度
也可以不设置, 不设置的话, 窗口顶部不会显示标题, 窗口会以默认的尺寸运行
定义绘制函数
from pgzrun import * #导入pgzero库WIDTH = 600 #设置窗口的宽度HEIGHT = 800 #设置窗口的高度def draw(): #定义绘制函数screen.fill((128, 0, 0)) #设置窗口的背景颜色
我们所看到的屏幕上的物品运动, 其实是计算机每秒绘制了多次物品, 由于眼睛的”视觉暂留”特性, 所以才产生动画的感觉.
而这里的 draw()函数就是绘制指令, 加上屏幕更新函数update(), 就可以形成眼中的动画.
注意: 即使通过Actor()创建了游戏角色, 但是如果没有用 draw() 绘制出来的话, 屏幕中是看不到游戏角色的
from pgzrun import * #导入pgzero库alien = Actor("alien.png") #调用图片, 创建角色def draw(): #定义绘制函数alien.draw() #绘制角色
定义更新函数
update()函数是pgzero 的主循环, 每秒钟调用 60 次. 也就是说, 在里面写上角色xy坐标的变化, 那么每秒钟执行 60 次, 相当于每秒绘制 60 帧, 从而可以形成流畅的动画.
from pgzrun import * #导入pgzero库alien = Actor("alien.png") #调用图片, 创建角色def draw(): #定义绘制函数screen.clear() #清除屏幕内容alien.draw() #绘制角色def update(): #定义更新函数alien.x += 1 #改变角色位置
运行程序
是运行pgzero 必须要调用的函数.
只有使用了go() 函数, 才会正式执行:
- 创建窗口
- 调用
draw()函数 - 调用
update()函数 ```python from pgzrun import * #导入pgzero库
alien = Actor(“alien.png”) #调用图片, 创建角色
def draw(): #定义绘制函数 screen.clear() #清除屏幕内容 alien.draw() #绘制角色
def update(): #定义更新函数 alien.x += 1 #改变角色位置
go() #运行程序: 创建窗口、调用绘制函数、调用更新函数
❗️注意:如果程序中定义了` updte()` 和 `draw()` 函数, 调用 `go()` 函数时会交替执行 `updte()` 和 `draw()`. 导致的结果是, 角色会被反复绘制出来.所以在上面的代码中, 我们添加了 `screen.clear()` 指令来清除屏幕内容#角色##支持的图片格式- 支持- png- jpg- gif- 推荐使用 png 类型, 因为这种类型支持透明背景##创建角色`Actor('图片名', center=(坐标))`创建角色所调用的图片**必须**放在项目的 `images` 文件夹中通过` Actor() `创建的游戏角色, 必须使用 `draw()` 绘制出来, 否则不会显示如果`Actor()`函数中不声明坐标, 则默认将图片的左上角放在`原点 ( 0, 0 ) `位置`from pgzrun import * #导入pgzero库alien = Actor("alien.png", center=(WIDTH/2, 200)) #调用图片, 创建角色def draw(): #定义绘制函数alien.draw() #绘制角色go() #运行程序`##设置角色初始位置可以指定角色以下 9 个点的坐标, 以此设定角色所在位置:- topleft ( 默认 )- midtop- topright- midleft- center- midright- bottomleft- midbottom- bottomright比如, 指定角色的中心位置:```pythonfrom pgzrun import *alien = Actor("alien.png", center=(100, HEIGHT/2)) #创建角色def draw():alien.draw() #绘制角色
如果Actor()函数中不设置角色的初始位置, 则默认将图片的左上角放在( 0, 0 )的位置
设置角色的锚点
也就是角色的.pos属性以及角色的.x和.y的位置
建议将锚点设置为图片的下方中心位置, 也就是('center', 'bottom'), 这样, 当需要角色站在某个平面上时, 就更容易设置
如果不特别声明锚点, 那么默认的锚点就是几何中心点.
from pgzrun import *alien = Actor("alien.png", center=(100, HEIGHT/2), anchor=('center', 'bottom')) #创建角色def draw():alien.draw() #绘制角色
其他属性
- 图片
- .image: 可以用来更换角色的图片, 也就是 Scratch 里面的”造型”
- 尺寸
- .width
- .height
- 位置
- .x
- .y
- .left
- .right
- topleft
- midtop
- topright
- midleft
- .center
- midright
- bottomleft
- midbottom
- bottomright
- .pos(x, y)

- 角度
- .angle
- 显示或者隐藏
- .show
- 为 1 表示显示, 为 0 表示隐藏
- 指定帧
- 计算并返回当前角色与指定坐标的距离
- .distance_to((x, y))
- 计算并返回当前角色与指定坐标的角度
- .angle_to((x, y))
- 删除角色
- .remove()
- 绘制角色
- 判断角色是否与指定点产生碰撞
- .collidepoint((x, y))
- 判断角色是否与指定角色产生碰撞
- .collideactor(角色名)
- 判断角色是否与指定矩形产生碰撞
- .colliderect(角色名) ```python from pgzrun import *
alien = Actor(“alien.png”, center=(100, 100)) #调用图片, 创建角色 planet = Actor(‘planet’, center=(300, 100))
def draw(): #定义绘制函数 alien.draw() #绘制角色 planet.draw() #绘制角色
def update(): #定义更新函数 if (alien.colliderect(planet)): alien.show = False
def on_mouse_down(pos): #鼠标被按下时 if alien.collidepoint(pos): alien.image = ‘alien_move’
#屏幕##清空屏幕`screen.clear()`##填充纯色背景> 如果不声明背景填充的颜色, 默认就是`黑色 / black````pythonfrom pgzrun import * #导入pgzero库def draw(): #定义绘制函数screen.fill((128, 0, 0)) #填充屏幕背景颜色go() #运行程序
用图片作为背景
screen.blit(‘图片名’, (左上角的坐标))
from pgzrun import *def draw(): #定义绘制函数screen.blit('picture_name', (0, 0)) #使用图片做为背景go() #运行程序
绘制文本
screen.draw.text(字符串, 颜色, 坐标, 字体大小, 阴影)
from pgzrun import *def draw():button.draw()screen.draw.text("Score: " + str(10),color="white",center=(WIDTH / 2, 90),fontsize=70,shadow = (0.8, 0.8),scolor = 'black',)
绘制直线
screen.draw.line(起点, 终点, 颜色)
from pgzrun import * #导入pgzero库def draw(): #定义绘制函数screen.draw.line((100, 100), (200, 200), 'red') #绘制线段go() #运行程序
绘制空心圆
screen.draw.circle(圆心坐标, 半径, 颜色)
from pgzrun import * #导入pgzero库def draw(): #定义绘制函数screen.draw.circle((100, 100), 150, 'red')screen.draw.circle((250, 100), 150, (255, 0, 0)) #使用RGB数字来指定颜色go() #运行程序
绘制实心圆
screen.draw.filled_circle(圆心坐标, 半径, 颜色)
from pgzrun import * #导入pgzero库def draw(): #定义绘制函数screen.draw.filled_circle((100, 100), 150, 'red')screen.draw.filled_circle((250, 100), 150, (255, 0, 0)) #使用RGB数字来指定颜色go() #运行程序
绘制空心矩形
screen.draw.rect((左上角坐标, 右下角坐标), 颜色)
from pgzrun import * #导入pgzero库def draw(): #定义绘制函数screen.draw.rect(((100, 100), (200, 200)), 150, 'red')go() #运行程序
绘制实心矩形
screen.draw.filled_rect((左上角坐标, 右下角坐标), 颜色)
from pgzrun import * #导入pgzero库
def draw(): #定义绘制函数screen.draw.filled_rect(((100, 100), (200, 200)), 150, 'red')go() #运行程序
鼠标
鼠标按下
鼠标按下时响应
on_mouse_down(pos, button)
pos表示鼠标坐标button表示鼠标按键 ```python from pgzrun import *
def on_mouse_down(pos, button): print(button, “:”, pos) #鼠标按下时执行的代码
go()
##鼠标抬起鼠标按键抬起时响应`on_mouse_up(pos, button)`- pos 表示鼠标坐标- button 表示鼠标按键```pythonfrom pgzrun import *def on_mouse_up(pos, button):print(button, ":", pos) #鼠标按键抬起时执行的代码go()
鼠标移动
鼠标移动时响应
on_mouse_move(pos, button)
- pos 表示鼠标坐标
- button 表示鼠标按键 ```python from pgzrun import *
def on_mouse_move(pos, button): print(button, “:”, pos) #鼠标移动时执行的代码
go()
##其他属性- x: 鼠标的x坐标- y: 鼠标的y坐标- pos: 鼠标的坐标- LEFT: 鼠标左键- MIDDLE: 鼠标中键- RIGHT: 鼠标右键- WHEEL_UP: 鼠标滚轮上滚- WHEEL_DOWN: 鼠标滚轮下滚#键盘##按键按下键盘的按键被按下时响应`on_key_down(key)````pythonfrom pgzrun import *def on_key_down(key):print(key)go()
按键抬起
键盘的按键抬起时响应
from pgzrun import *def on_key_up(key):if key == Keys.I: # 当按键I抬起时print(key) # 打印按键go()
支持的按键
数字
- K_0
- K_1
- K_2
- K_3
- K_4
- K_5
- K_6
- K_7
- K_8
- K_9
字母
- A
- B
- C
- D
- E
- F
- G
- H
- I
- J
- K
- L
- M
- N
- O
- P
- Q
- R
- S
- T
- U
- V
- W
- X
- Y
- Z
控制键
- SHIFT
- CTRL
- ALT
- LEFT
- UP
- RIGHT
- DOWN
- PAGEUP
- PAGEDOWN
- END
- HOME
- ESCAPE
- ENTER
- SPACE
- RETURN
- BACKSPACE
- INSERT
- DELETE
功能键
- F1
- F2
- F3
- F4
- F5
- F6
- F7
- F8
- F9
- F10
- F11
- F12
- F13
- F14
- F15
在键盘事件函数中, 可使用 key == keys.RIGHT 判断 right 键是否被按下
在键盘事件函数以外, 比如在 update() 函数中, 可以通过 keyboard[keys.RIGHT] 来判断 right 是否被按下
from pgzrun import *def on_key_up(key):if key == Keys.RIGHT: # 当右方向键抬起时print('右方向键') # 打印按键def update():if keyboard[keys.RIGHT]:print('右方向键')go()
音乐
支持的音频格式
from pgzrun import *music.volume = 0.5 # 设置当前音量print(music.volume) # 获取当前音量
设置音量
music.set_volume(数字)
- 音量的范围是 0 - 1 ```python from pgzrun import *
music.set_volume(0.5)
##获取当前音量`music.get_volume()````pythonfrom pgzrun import *print(music.get_volume())
循环播放
music.play(音乐文件路径)
from pgzrun import *path = '' # 音乐文件的路径music.play(path)
播放一次后停止
music.play_once(音乐文件路径)
from pgzrun import *path = '' # 音乐文件的路径music.play_once(path)
之前播放完之后再播放
在当前正在播放的音乐结束之后, 再播放. 或者在之前代码中设定的音乐播放完之后, 再播放
music.queue(音乐文件路径)
from pgzrun import *path = '' # 音乐文件的路径music.play_once(path)
检查是否在播放
music.is_playing()
from pgzrun import *path = '' # 音乐文件的路径music.play(path)if music.is_playing():print('正在播放音乐')
停止播放
music.stop()
from pgzrun import *path = '' # 音乐文件的路径music.play(path)if music.is_playing(): # 检查是否在播放music.stop() # 停止播放
音效
支持的音频格式
sounds.xxx.play()
##停止播放`sounds.xxx.stop()````pythonfrom pgzrun import *sounds.xxx.play() #播放音效sounds.xxx.stop() #停止播放音效
获取时长
sounds.xxx.get_length()
from pgzrun import *sounds.xxx.play()print(sounds.xxx.get_length())
时间
一段时间后再调用
clock.schedule(调用的函数, 几秒之后)
from pgzrun import *path = '' # 音乐文件的路径clock.schedule(music.play_once(path), 10) # 10秒之后播放音乐
每隔一段时间调用一次
clock.schedule_interval(调用的函数, 间隔的秒数)
from pgzrun import *time = 0def update_time():global timetime = time + 1clock.schedule_interval(update_time, 1.0)
动画
创建动画
animate(actor, tween, duration, on_finished, targets)
- actor 游戏角色
- tween 动画类型 ( 类似 AfterEffect 的”速度曲线” )
- linear 线性
- accelerate 加速
- decelerate 减速
- accel_decel 先加速再加速
- elastic_start 开始时反弹
- elastic_end 结束时反弹
- elastic_start_end 开始结束都反弹
- bounce_start 开始时弹跳
- bounce_end 结束时弹跳
- bounce_start_end 开始和结束都弹跳
- duration 动画持续时间, 单位为”秒”, 默认是 1 秒
- on_finished 动画结束后的回调函数
- targets 可以为 (pos) 、 (x) 、 (y)
播放动画
running()
停止动画
stop()
