1.4.2 游戏循环
究竟什么是游戏循环呢?如果你有一点编程经验,一定编写过循环程序。所谓循环程序,就是程序在满足指定的条件下,重复不断地执行某些操作。游戏循环也是类似的原理,即把游戏操作的程序代码放置在一个循环语句中,让其自动地重复执行。那么游戏循环的执行条件是什么呢?循环中又该执行什么样的语句呢?
先来看看游戏循环的条件。想一想你玩游戏的经历,当你玩游戏的时候,除非你主动选择退出,否则你是一直处于游戏之中的。难道不是吗?从程序角度来看,自从你进入游戏开始玩,就已经处于游戏循环之中了,而且一直处于其中。因此,游戏循环的执行是无条件的,它本质上就是个死循环!天呐,没听错吧,编程课上老师可特别强调过,“编写循环程序时要检查循环条件,千万别写成了死循环”,没想到游戏程序竟然是个死循环。没错,游戏就是个死循环,或者称为无限循环。
可以用while语句来表示游戏循环,伪代码如下所示:
可以看到,while语句的循环条件设为了True,而True是个布尔类型的常数,表达的含义就是“真”。因此,while循环会一直重复地执行下去。
接着看看游戏循环中的操作语句应该如何编写。作为一个游戏,它要执行两个最基本的操作:一个是更新游戏逻辑,包括改变角色位置或图像,处理角色之间的相互作用,切换游戏场景等;另一个是绘制游戏图像,包括绘制游戏的背景,绘制角色的图像,绘制文字信息等,如图1.8所示。
图1.8 游戏循环示意图
在之前的程序中,我们编写了update()函数来改变小球坐标,也编写了draw()函数来绘制小球图像,而这两个函数恰好分别对应游戏循环中的两个基本操作:update()函数用来更新游戏逻辑,而draw()函数用来绘制游戏图像。由于游戏是不断运行的,需要不断地更新游戏逻辑,同时显示更新后的内容,因此要将update()函数和draw()函数放入游戏循环中重复执行。程序看起来应该像这样:
然而,我们编写代码的时候并不是这样写的,只是在程序中定义了update()和draw()函数,却并没有通过类似的无限循环语句来调用它们。确实是这样的,因为Pgzero不需要我们这样做,它已经在内部预先设定好了一个游戏循环,我们只负责定义update()和draw()函数,并将更新游戏逻辑和显示游戏图像的代码分别写入其中即可,Pgzero内部的游戏循环会自动调用这两个函数。
当单击Mu编辑器上的“开始”按钮时,程序会启动游戏循环来开始游戏;当单击“停止”按钮时,程序便会终止游戏循环来退出游戏。
现在终于明白游戏程序竟然是这样运作的,有一点小小的满足感,原来游戏并没有想象的那么神秘嘛。既然Pgzero已经在幕后安排好了一切,那只需要集中精力为update()和draw()这两个函数编写代码就好啦。没错,就是这么简单!