一页纸 PythonGameZero 手册

pygame zero官方网站(https://pygame-zero.readthedocs.io)获取英文文档

PythonGameZero 简称 pgzero, 它对 Pygame 进行了封装, 屏蔽了繁琐枯燥的框架代码, 让学习者可以更专注于游戏的实现逻辑, 并且更快看到成果 更详细的语法说明见官方手册(opens new window)

基本框架

坐标系

以左上角为原点 ( 0, 0 ) pythonturtle坐标系

一页纸 PythonGameZero 手册 - 图1

导入 pgzero

  1. from pgzrun import *
  2. #表示导入pgzero库里面的所有函数

注意: 导入 pgzero 库, 不是直接直接pgzero, 而是pgzrun!!! 其实pgzrunpython game zero run的缩写

设置窗口

  1. from pgzrun import * #导入pgzero库
  2. TITLE = 'hello' #设置窗口顶部的标题
  3. WIDTH = 600 #设置窗口的宽度
  4. HEIGHT = 800 #设置窗口的高度

也可以不设置, 不设置的话, 窗口顶部不会显示标题, 窗口会以默认的尺寸运行

定义绘制函数

  1. from pgzrun import * #导入pgzero库
  2. WIDTH = 600 #设置窗口的宽度
  3. HEIGHT = 800 #设置窗口的高度
  4. def draw(): #定义绘制函数
  5. screen.fill((128, 0, 0)) #设置窗口的背景颜色

我们所看到的屏幕上的物品运动, 其实是计算机每秒绘制了多次物品, 由于眼睛的”视觉暂留”特性, 所以才产生动画的感觉.

而这里的 draw()函数就是绘制指令, 加上屏幕更新函数update(), 就可以形成眼中的动画.

注意: 即使通过Actor()创建了游戏角色, 但是如果没有用 draw() 绘制出来的话, 屏幕中是看不到游戏角色的

  1. from pgzrun import * #导入pgzero库
  2. alien = Actor("alien.png") #调用图片, 创建角色
  3. def draw(): #定义绘制函数
  4. alien.draw() #绘制角色

定义更新函数

update()函数是pgzero 的主循环, 每秒钟调用 60 次. 也就是说, 在里面写上角色xy坐标的变化, 那么每秒钟执行 60 次, 相当于每秒绘制 60 帧, 从而可以形成流畅的动画.

  1. from pgzrun import * #导入pgzero库
  2. alien = Actor("alien.png") #调用图片, 创建角色
  3. def draw(): #定义绘制函数
  4. screen.clear() #清除屏幕内容
  5. alien.draw() #绘制角色
  6. def update(): #定义更新函数
  7. alien.x += 1 #改变角色位置

运行程序

是运行pgzero 必须要调用的函数. 只有使用了go() 函数, 才会正式执行:

  1. 创建窗口
  2. 调用 draw()函数
  3. 调用 update()函数 ```python from pgzrun import * #导入pgzero库

alien = Actor(“alien.png”) #调用图片, 创建角色

def draw(): #定义绘制函数 screen.clear() #清除屏幕内容 alien.draw() #绘制角色

def update(): #定义更新函数 alien.x += 1 #改变角色位置

go() #运行程序: 创建窗口、调用绘制函数、调用更新函数

  1. ❗️注意:
  2. 如果程序中定义了` updte()` `draw()` 函数, 调用 `go()` 函数时会交替执行 `updte()` `draw()`. 导致的结果是, 角色会被反复绘制出来.
  3. 所以在上面的代码中, 我们添加了 `screen.clear()` 指令来清除屏幕内容
  4. #角色
  5. ##支持的图片格式
  6. - 支持
  7. - png
  8. - jpg
  9. - gif
  10. - 推荐使用 png 类型, 因为这种类型支持透明背景
  11. ##创建角色
  12. `Actor('图片名', center=(坐标))`
  13. 创建角色所调用的图片**必须**放在项目的 `images` 文件夹中
  14. 通过` Actor() `创建的游戏角色, 必须使用 `draw()` 绘制出来, 否则不会显示
  15. 如果`Actor()`函数中不声明坐标, 则默认将图片的左上角放在`原点 ( 0, 0 ) `位置
  16. `from pgzrun import * #导入pgzero库
  17. alien = Actor("alien.png", center=(WIDTH/2, 200)) #调用图片, 创建角色
  18. def draw(): #定义绘制函数
  19. alien.draw() #绘制角色
  20. go() #运行程序`
  21. ##设置角色初始位置
  22. 可以指定角色以下 9 个点的坐标, 以此设定角色所在位置:
  23. ![](/projects/pgz_maker/202307/1772a8597739267e.png)
  24. - topleft ( 默认 )
  25. - midtop
  26. - topright
  27. - midleft
  28. - center
  29. - midright
  30. - bottomleft
  31. - midbottom
  32. - bottomright
  33. 比如, 指定角色的中心位置:
  34. ```python
  35. from pgzrun import *
  36. alien = Actor("alien.png", center=(100, HEIGHT/2)) #创建角色
  37. def draw():
  38. alien.draw() #绘制角色

如果Actor()函数中不设置角色的初始位置, 则默认将图片的左上角放在( 0, 0 )的位置

设置角色的锚点

也就是角色的.pos属性以及角色的.x.y的位置

建议将锚点设置为图片的下方中心位置, 也就是('center', 'bottom'), 这样, 当需要角色站在某个平面上时, 就更容易设置

如果不特别声明锚点, 那么默认的锚点就是几何中心点.

  1. from pgzrun import *
  2. alien = Actor("alien.png", center=(100, HEIGHT/2), anchor=('center', 'bottom')) #创建角色
  3. def draw():
  4. alien.draw() #绘制角色

其他属性

  • 图片
    • .image: 可以用来更换角色的图片, 也就是 Scratch 里面的”造型”
  • 尺寸
    • .width
    • .height
  • 位置
    • .x
    • .y
    • .left
    • .right
    • topleft
    • midtop
    • topright
    • midleft
    • .center
    • midright
    • bottomleft
    • midbottom
    • bottomright
    • .pos(x, y)

一页纸 PythonGameZero 手册 - 图2

  • 角度
    • .angle
  • 显示或者隐藏
    • .show
    • 为 1 表示显示, 为 0 表示隐藏
  • 指定帧
    • .frame 如果当前角色存在多个造型, 可以通过设置frame属性指定游戏角色显示的图片

      其他函数

  • 计算并返回当前角色与指定坐标的距离
    • .distance_to((x, y))
  • 计算并返回当前角色与指定坐标的角度
    • .angle_to((x, y))
  • 删除角色
    • .remove()
  • 绘制角色
    • .draw()

      碰撞检测

  • 判断角色是否与指定点产生碰撞
    • .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’

  1. #屏幕
  2. ##清空屏幕
  3. `screen.clear()`
  4. ##填充纯色背景
  5. > 如果不声明背景填充的颜色, 默认就是`黑色 / black`
  6. ```python
  7. from pgzrun import * #导入pgzero库
  8. def draw(): #定义绘制函数
  9. screen.fill((128, 0, 0)) #填充屏幕背景颜色
  10. go() #运行程序

用图片作为背景

screen.blit(‘图片名’, (左上角的坐标))

  1. from pgzrun import *
  2. def draw(): #定义绘制函数
  3. screen.blit('picture_name', (0, 0)) #使用图片做为背景
  4. go() #运行程序

绘制文本

screen.draw.text(字符串, 颜色, 坐标, 字体大小, 阴影)

  1. from pgzrun import *
  2. def draw():
  3. button.draw()
  4. screen.draw.text(
  5. "Score: " + str(10),
  6. color="white",
  7. center=(WIDTH / 2, 90),
  8. fontsize=70,
  9. shadow = (0.8, 0.8),
  10. scolor = 'black',
  11. )

绘制直线

screen.draw.line(起点, 终点, 颜色)

  1. from pgzrun import * #导入pgzero库
  2. def draw(): #定义绘制函数
  3. screen.draw.line((100, 100), (200, 200), 'red') #绘制线段
  4. go() #运行程序

绘制空心圆

screen.draw.circle(圆心坐标, 半径, 颜色)

  1. from pgzrun import * #导入pgzero库
  2. def draw(): #定义绘制函数
  3. screen.draw.circle((100, 100), 150, 'red')
  4. screen.draw.circle((250, 100), 150, (255, 0, 0)) #使用RGB数字来指定颜色
  5. go() #运行程序

绘制实心圆

screen.draw.filled_circle(圆心坐标, 半径, 颜色)

  1. from pgzrun import * #导入pgzero库
  2. def draw(): #定义绘制函数
  3. screen.draw.filled_circle((100, 100), 150, 'red')
  4. screen.draw.filled_circle((250, 100), 150, (255, 0, 0)) #使用RGB数字来指定颜色
  5. go() #运行程序

绘制空心矩形

screen.draw.rect((左上角坐标, 右下角坐标), 颜色)

  1. from pgzrun import * #导入pgzero库
  2. def draw(): #定义绘制函数
  3. screen.draw.rect(((100, 100), (200, 200)), 150, 'red')
  4. go() #运行程序

绘制实心矩形

screen.draw.filled_rect((左上角坐标, 右下角坐标), 颜色)

from pgzrun import * #导入pgzero库

  1. def draw(): #定义绘制函数
  2. screen.draw.filled_rect(((100, 100), (200, 200)), 150, 'red')
  3. go() #运行程序

鼠标

鼠标按下

鼠标按下时响应

on_mouse_down(pos, button)

  • pos 表示鼠标坐标
  • button 表示鼠标按键 ```python from pgzrun import *

def on_mouse_down(pos, button): print(button, “:”, pos) #鼠标按下时执行的代码

go()

  1. ##鼠标抬起
  2. 鼠标按键抬起时响应
  3. `on_mouse_up(pos, button)`
  4. - pos 表示鼠标坐标
  5. - button 表示鼠标按键
  6. ```python
  7. from pgzrun import *
  8. def on_mouse_up(pos, button):
  9. print(button, ":", pos) #鼠标按键抬起时执行的代码
  10. go()

鼠标移动

鼠标移动时响应

on_mouse_move(pos, button)

  • pos 表示鼠标坐标
  • button 表示鼠标按键 ```python from pgzrun import *

def on_mouse_move(pos, button): print(button, “:”, pos) #鼠标移动时执行的代码

go()

  1. ##其他属性
  2. - x: 鼠标的x坐标
  3. - y: 鼠标的y坐标
  4. - pos: 鼠标的坐标
  5. - LEFT: 鼠标左键
  6. - MIDDLE: 鼠标中键
  7. - RIGHT: 鼠标右键
  8. - WHEEL_UP: 鼠标滚轮上滚
  9. - WHEEL_DOWN: 鼠标滚轮下滚
  10. #键盘
  11. ##按键按下
  12. 键盘的按键被按下时响应
  13. `on_key_down(key)`
  14. ```python
  15. from pgzrun import *
  16. def on_key_down(key):
  17. print(key)
  18. go()

按键抬起

键盘的按键抬起时响应

  1. from pgzrun import *
  2. def on_key_up(key):
  3. if key == Keys.I: # 当按键I抬起时
  4. print(key) # 打印按键
  5. 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 是否被按下

  1. from pgzrun import *
  2. def on_key_up(key):
  3. if key == Keys.RIGHT: # 当右方向键抬起时
  4. print('右方向键') # 打印按键
  5. def update():
  6. if keyboard[keys.RIGHT]:
  7. print('右方向键')
  8. go()

音乐

支持的音频格式

  • wav
  • ogg
  • mp3 ( 在一些 Linux 系统上可能有问题 )

    音量属性

    music.volume
  1. from pgzrun import *
  2. music.volume = 0.5 # 设置当前音量
  3. print(music.volume) # 获取当前音量

设置音量

music.set_volume(数字)

  • 音量的范围是 0 - 1 ```python from pgzrun import *

music.set_volume(0.5)

  1. ##获取当前音量
  2. `music.get_volume()`
  3. ```python
  4. from pgzrun import *
  5. print(music.get_volume())

循环播放

music.play(音乐文件路径)

  1. from pgzrun import *
  2. path = '' # 音乐文件的路径
  3. music.play(path)

播放一次后停止

music.play_once(音乐文件路径)

  1. from pgzrun import *
  2. path = '' # 音乐文件的路径
  3. music.play_once(path)

之前播放完之后再播放

在当前正在播放的音乐结束之后, 再播放. 或者在之前代码中设定的音乐播放完之后, 再播放

music.queue(音乐文件路径)

  1. from pgzrun import *
  2. path = '' # 音乐文件的路径
  3. music.play_once(path)

检查是否在播放

music.is_playing()

  1. from pgzrun import *
  2. path = '' # 音乐文件的路径
  3. music.play(path)
  4. if music.is_playing():
  5. print('正在播放音乐')

停止播放

music.stop()

  1. from pgzrun import *
  2. path = '' # 音乐文件的路径
  3. music.play(path)
  4. if music.is_playing(): # 检查是否在播放
  5. music.stop() # 停止播放

音效

支持的音频格式

  • wav
  • ogg
  • mp3 ( 在一些 Linux 系统上可能有问题 )

    播放一次

    sounds.xxx.paly()

  • xxx是音效文件名称 ```python from pgzrun import *

sounds.xxx.play()

  1. ##停止播放
  2. `sounds.xxx.stop()`
  3. ```python
  4. from pgzrun import *
  5. sounds.xxx.play() #播放音效
  6. sounds.xxx.stop() #停止播放音效

获取时长

sounds.xxx.get_length()

  1. from pgzrun import *
  2. sounds.xxx.play()
  3. print(sounds.xxx.get_length())

时间

一段时间后再调用

clock.schedule(调用的函数, 几秒之后)

  1. from pgzrun import *
  2. path = '' # 音乐文件的路径
  3. clock.schedule(music.play_once(path), 10) # 10秒之后播放音乐

每隔一段时间调用一次

clock.schedule_interval(调用的函数, 间隔的秒数)

  1. from pgzrun import *
  2. time = 0
  3. def update_time():
  4. global time
  5. time = time + 1
  6. clock.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()