趣味Python游戏编程:第1章 神奇的游戏循环:弹跳小球
准备好了吗?我们即将开始激动人心的游戏编程之旅。或许你之前学习过一些编程知识,但若是从没接触过游戏编程,那么你仍然会对游戏程序的运行感到不解。游戏程序不像计算一个公式或谜题,得到答案之后程序就结束了,游戏程序一直是处于运行中的,只要你不主动退出,那么你可以永远待在游戏之中。这就是游戏循环的神奇魔力。
本章将深入介绍游戏循环的运作方式,以及如何运用游戏循环来编写你自己的第一个游戏——弹跳小球。我们将生成一个游戏窗口,然后在里面添加很多小球,让它们在窗口中自由移动,当小球碰到窗口四周时则发生反弹。是不是很有趣呢?
本章主要涉及如下知识点:
设置游戏开发环境
创建游戏场景
创建游戏角色
实现角色的移动
游戏循环的原理
管理多个角色
1.1 准备工作
1.1.1 选择合适的开发工具
“工欲善其事,必先利其器”,编写游戏之前需挑选一款合适的工具,这样可以大大地简化程序编写工作。Python语言的很多第三方库都提供游戏编程功能,最有名的要属Pygame库了,它提供丰富的API来实现游戏的各种效果。但是,对初学者来说,Pygame库还是显得有些复杂,这里希望采用更加简洁高效的工具,使得可以把注意力集中在游戏算法的实现上,而不需要花费太多精力去学习游戏开发库的使用。
于是本书打算采用Pgzero库来编写游戏。Pgzero的完整名称是Pygame Zero,不难看出,它是从Pygame库衍生而来的。可以说Pgzero就是Pygame的一个精简版本,能够实现Pygame库的主要功能,但是屏蔽了一些复杂的细节,使得初学者能够快速上手。
1.1.2 设置开发环境
由于Pgzero是Python的第三方库,它不能独立工作,必须在Python代码中来使用,因此首先需要安装Python开发环境。可以去Python官网下载最新的安装包进行安装(关于Python的详细安装步骤请参考附录)。现在已经准备好了游戏编程的基本环境,可以使用Python提供的IDLE编辑器来编写代码了。
且慢,你是否觉得使用IDLE编辑器来编写程序不是那么方便呢?对于简单的小程序当然无所谓了,但是游戏程序相对来说还是比较复杂的,而且游戏中需要调用一些图片或声音资源,还要对所有的游戏资源进行统一管理。因此还得寻找一个更加灵活方便的游戏编写工具,在这里我采用的是Mu编辑器。Mu编辑器是专门为Python学习者设计的一个开发工具,它的编辑器非常友好,提供了很多的便捷操作,例如代码自动提示、代码缩进标示、语法检查等功能。更重要的是,它已经集成了Pgzero库,而且提供对游戏资源的管理,这正是我们所需要的,不是吗?关于Mu编辑器的安装在附录A中有详细介绍,现在直接运行Mu编辑器试一下。在初次打开Mu编辑器的时候会提示选择运行模式,如图1.1所示。
单击“Pygame Zero”模式选项,接下来Mu编辑器便会切换到Pgzero模式,运行界面如图1.2所示。
Mu编辑器中的空白区域便是将要编写代码的地方,当程序写好之后,单击界面上方的“开始”按钮便可以运行程序了。看起来真是太棒了,还等什么呢?赶快开工吧!
1.2 从何处开始
接下来开始编写游戏。可是,游戏程序究竟什么样呢?或许你会在屏幕上输出“Hello World”,或者你知道如何编程计算斐波拉契数列的值,但是你真的确定游戏程序应该如何编写吗?
首先,游戏运行需有一个图形界面(当然,早期的计算机游戏可能是文本界面的,但那已经是很古老的事了,现在探讨的都是基于图形界面的游戏)。为了显示图形界面,这里的程序应该能够生成一个“窗口”,在其中可以显示各种图形或图像,而游戏的内容正是由各种不同的图形或图像来表示的。
试着创建一个程序窗口。
1.2.1 创建程序窗口
在Mu编辑器上方的工具栏中单击“新建”按钮,可以看到编辑器中出现了一块空白区域,这便是新创建的Python源程序文件。接着单击“保存”按钮将该源程序文件保存在磁盘上,在弹出的对话框中为文件起一个名字,操作界面如图1.3所示。
然后单击“运行”按钮试试,你会看到屏幕上出现了一个窗口,如图1.4所示。
感觉如何?是不是惊讶得合不拢嘴?明明连一行代码都没有写,竟然就能出现一个窗口。这正是Pgzero的神奇之处。事实上,Pygzero已经做了大量的“幕后工作”,使得我们可以专注于编写游戏逻辑,而不用太关注显示方面的问题。
然而眼前这个窗口黑乎乎的,并不太好看,而且窗口的大小也不是自己想要的。不要着急,我们一点点地解决问题。
1.2.2 改变窗口大小和颜色
首先解决窗口尺寸问题。在Pgzero中,通过定义两个常量值来确定程序窗口的大小,代码如下所示:
注意WIDTH和HEGIHT是Pgzero预设的两个常量,分别用来表示程序窗口的宽度和高度值(单位为像素)。上面的代码表示将程序窗口的宽度值设为500像素,高度设为300像素。我们将这两行代码输入刚刚新建的源程序文件中,然后再次运行一下,可以看到窗口的大小发生了改变。
接下来试着改变一下窗口的背景颜色。在Pgzero中,窗口的背景颜色默认是黑色(原来如此),若要改变背景颜色,需要在程序中定义一个draw()函数。那么这个draw()函数又是个什么来头呢?
draw()函数是Pgzero的“幕后主使”之一,它负责显示游戏中的各种图形或图像。只需在程序中定义自己的draw()函数,然后将需要绘制图形图像的代码写进draw()函数中,程序便会自动地执行draw()函数进行显示。
那么,要改变窗口的颜色,究竟要在draw()函数中编写什么代码呢?此时还需要借助Pgzero提供的内置对象screen来完成。事实上,Pgzero为了简化游戏编程,在内部设置了很多的对象来协助完成游戏中的各项操作。screen对象主要就是用来在窗口绘图的,它提供了很多的绘图方法,不仅能够绘制图形和图像,还能绘制文字信息,在后面的游戏编程中还会经常使用到它。
目前需要使用的是screen对象的fill()方法,它表示用某种颜色来填满整个窗口。该方法接受一个RGB元组作为参数。那什么是RGB元组呢?
说明:
了解Python的朋友可能对元组并不陌生,元组就是由一对小括号括起来的一组数值。
RGB元组是由三个数所组成的元组,每一个数代表一个颜色分量。具体来说,第一个数代表红色R(Red),第二个数代表绿色G(Green),第三个数代表蓝色B(Blue),每个数的取值范围从0到255。这其实就是我们熟知的三原色,各种颜色都可以由红绿蓝三种基本颜色混合而成,相应地,可以改变RGB元组中三个数的值来获取不同的颜色。例如(255,0,0)表示红色,(0,255,0)表示绿色,(0,0,255)表示蓝色,(0,0,0)代表黑色,(255,255,255)代表白色等(感兴趣的朋友可以去网上查找某个颜色对应的RGB值)。
了解相关知识后,可以在源代码中加入以下两行代码:
保存并运行程序,可以看到如图1.5所示的界面。没错,我们的窗口背景变成了白色。
练习:
可以试试改动fill()方法中传入的RGB数值,看看会显示什么不一样的背景颜色。
1.2.3 显示图像
现在拥有了一个程序窗口,但它似乎空空如也,并没有什么内容。我们希望在窗口里面显示点什么。例如准备将一幅精美的图片显示在窗口中,如何做到呢?
首先将图片文件放到指定的位置,即images文件夹中。单击Mu编辑器上方的“图片”按钮,会自动打开images文件夹,如图1.6所示。将图片文件复制到该文件夹中即可。