Pgzero是在pygame基础上封装的一个简化版本软件包,使得在python环境下进行游戏编程更加简单。适合于入门学习者。
怎么用
开发一款简单的小游戏,我们可能会立刻想到以下几个要素:
1. 创建一个游戏的页面环境,交待游戏场景
2. 创建一个或多个游戏角色
3. 定义角色的行为
1. 什么条件下触发行为
2. 有哪些行为可以执行
下面就来聊聊怎么上手使用。再啰嗦一下,编程嘛,有一款趁手的IDE(开发编辑器)还是蛮重要的嘞。对于这个游戏编程的项目来说,Mu这个软件还是不错的([Download Mu]),比较轻量化,windows环境下使用体验较好,Mac系统中无法使用(即使下载安装了也无法打开,没办法,苹果的生态系统权限控制比较严格)。
先从大处着眼
先了解一下常见的项目结构。pgzero的使用过程中,往往直接引用某些对象名称,而不给出全部的路径,那是因为它默认执行的脚本**.py所在目录具有固定的结构,典型的案例如下:
.
├── images/
│ └── alien.png
└── intro.py
当程序需要创建一个以alien.png图片为对象的游戏角色时,alien = Actor('alien') 这个命令就会直接去找images文件夹,然后将它下面的alien.png图片导入进来,所以如果你的目录结构不符合这样的结构,就会报错喽。
找一段完整的游戏代码来看看长啥样:
import pgzrun
WIDTH = 1300
HEIGHT = 600
NUM = 3
balls = []
for i in range(NUM):
ball = Actor("ball")
ball.x = 50 * i + 100
ball.y = 100
ball.dx = 5 + i
ball.dy = 5 + i
balls.append(ball)
def draw():
screen.fill((255,255,255))
for ball in balls:
ball.draw()
def update():
for ball in balls:
ball.x += ball.dx
ball.y += ball.dy
if ball.right > WIDTH or ball.left < 0:
ball.dx = - ball.dx
if ball.bottom > HEIGHT or ball.top < 0:
ball.dy = -ball.dy
pgzrun.go()
写过python程序的朋友可能注意到了几个点:没有常见的 if __name_== '__main__' 这样的真正执行命令块,那是因为pgzrun已经封装了这些操作
没有for, while这样的循环,只是定义了如何更新、画图的方法,那同样是因为pgzrun在后台会为我们执行这样的循环,不需要显式来写
接下来就开始分解各环节来讨论。
怎样创建一个游戏的场景。
简单点,可能就是一张背景图就完事儿了。
WIDTH = 300
HEIGHT = 300
def draw():
screen.fill((128, 0, 0))
其中WIDTH,HEIGHT交待窗口环境的宽度与长度,如下图所示:
screen.fill 这个命令就是按照一组RGB的值,把屏幕背景设置为某一个颜色,具体每个RGB值对应什么颜色可以网上方便地查到(例如RGB颜色对照表)。
注意:不想了解pgzero这个screen底层实现方法的朋友可以跳过下面这小段内容,不影响对于pgzero使用的学习。
我们已经知道pgzero底层是对pygame做了封装,那么它具体是怎么实现的,感兴趣的朋友就可以去看pgzero的github源代码:https://github.com/lordmauve/pgzerogithub.com
其中screen.py的定义如下:
可见它是引用了pygame的surface对象,如果去看pygame的文档时,会读到下面这样的描述:
其中也提到了最关键是的blit(),fill()这样的方法,这样就呼应起来了。
值得注意的是,有时候我们希望背景更多彩一些,并不止是某个纯色系,那么就可以导入一张图片做为背景图。上面这段话正好提到了可以创建一个含有图片的surface,且在pygame中是通过image.load()来实现的。回头去看pgzero的源码screen.py中对于Screen这个类的定义,其中有一个方法:
因此,我们通过下面的方法就可以实现导入图片,如果这张图片大到可以平铺满整个屏幕,那就背景图了。如果图片比较小,其实也相当于导入了一个角色(不过,如果是想实现这个功能,更推荐使用Actor类来创建角色对象)。
def draw():
screen.blit('这里是图片名称',(这里是坐标位置))
再来创建游戏角色
pgzero提供了一个类:Actor,创建的方法如下:
alien = Actor('alien') #创建一个角色对象
alien.pos = 100, 56 #指定角色在screen中出现的位置
WIDTH = 500
HEIGHT = alien.height + 20 # 先定义了角色的位置,才定义高度,是怕角色展示不全
def draw():
screen.clear()
alien.draw() #这里的.draw是调用了Actor类的一个方法,而非这里定义的函数draw
如果想导入一张图片作为角色,可以直接指定图片的图称作为一个参数(前期是这张图片需要在本脚本所在文件目录下同级目录images/下),例如:
alien = Actor('alien', (50, 50)) #这里alien是一个图片名称,在当前脚本所以目录中一定有images这个文件夹,alien.png就在这个文件夹下
def draw():
screen.clear()
alien.draw()
有了角色后,怎么控制其动作呢?
这里就引出一个非常重要的函数:
def update():
alien.left += 2
if alien.left > WIDTH:
alien.right = 0
所有关于角色的设置,最终都要通过这个update函数来实现。你可以把一个常规的游戏过程理解成下面这样的序列:
while game_has_not_ended(): #如果不退出游戏,就会永远执行下面的循环。只不过pgzero帮我们实现了这个while的控制,不需要我们自己再显式地去写这个循环控制
process_input()
update()
draw()
官网上有一段关于update函数的表述摘抄如下:
所以,一款游戏的执行过程中,你可以理解一直在反复调用这个update,更新角色的位置、状态,然后再通过draw()画图显示到屏幕上。
那什么条件会触发角色的update动作呢?其中比较常用的一些触发条件整理如下:
使用时,定义一个函数,然后在其中定义条件触发后,角色会执行哪些动作,举一个例子如下:
def on_mouse_down(pos): #当在pos位置上按下鼠标时,会触发该事件
if alien.collidepoint(pos):
sounds.eep.play()
alien.image = 'alien_hurt'
更多使用技巧如声音,时间控制等操作,留给大家举一反三去探索。
小结
Pgzero提供了一套可以快速入门游戏编程的接口与方法,对于初学者来说非常值得去体验。本文介绍了pgzero使用的要点,但肯定还是需要咱们多看例子,多实践,才能真正熟练掌握。当然,要想开发更加个性化的功能,还是需要入手pygame的,这个有时间的话,咱们再接着聊。欢迎关注本专栏动态。