所用技术和软件
python 2.7
pygame 1.9.3
pyCharm
准备工作
安装好 pygame 在第一次使用 pygame 的时候,pyCharm 会自动 install pygame。
下载好使用的素材。
技术实现
初始化 pygame
首先要初始化 pygame ,之后设定一些基本的要点,比如窗口大小(尽量避免魔法数字),窗口标题以及背景图像。pygame 通过加载图片,最后返回一个 surface 对象,我们不需要关系图片的格式。但是通过 convert()这个函数,会使我们的图片转换效率提高。
默认图片左上角为原点 (0,0)。
显示窗口
如果我们这样设定,当我们运行的时候,窗口会一闪而过,并不会出现我们想象的画面。因为窗口只是运行一下就会关闭,所以我们要写一个循环,使窗口一直保持出现。当然如果我们简单的写一个 while True那么我们的程序就出现了死循环,卡死。
所以还需要写个退出。
将 player 显示在屏幕上,并且刷新屏幕
效果如下
让飞机 “飞” 起来
飞机已经出现在我们的屏幕上了,现在需要让飞机动起来让他可以上下左右的移动。
首先要获取键盘事件,获取键盘上什么按键被按下。
简单的说就是获取飞机的图片,初始化飞机的矩形区域。 rect
该属性会获得四个值。分别是左上角 x
, y
坐标,矩形的宽度。 topleft
初始化飞机的左上角坐标,也就是飞机出现的位置。如下图所示。
让子弹飞
子弹要沿着发射方向射出去。可以在屏幕上一直移动,直到移出屏幕。
我们只要有定义一个子弹对象,让这个对象显示在屏幕上就可以。
先定义飞机子弹类,基本和定义 player一样,获得图片,裁剪图片,设置图片初始位置,在屏幕上显示图片
下一步就是让飞机的子弹跟随飞机。
我们需要在 Player 类里面添加方法。
首先我们规定,按下空格发射子弹。
下一步就是让子弹在屏幕上移动。
创建移动的方法。
这个和我们的预期还是有差别的,频率太快了。
关于pygame 的键盘重复事件 官方好像并没有这个设置。那么我们只能在添加一个计数器,通过计算器的数值来判断子弹是否发射。这里的数值是多次测试后,自己感觉一个比较满意的频率。可以自己调整。
绘制敌机
下一步就是绘制敌机。敌机是从屏幕上方移动到屏幕下方。我们任就需要一个类来设置敌机。设置类任就和我们前面的差不多,加载资源,设置 rect,设置位置。
现在我们就应该想想敌机的特点了,其实他和子弹的特点基本一直,只不过方向不一样而已。还有一点是敌机是随机生成的。
碰撞检测
飞机和敌机还有子弹都有了,我们现在需要进行完成碰撞检测。有下面几种场景。
敌机和玩家碰撞在一起
子弹和敌机碰撞在一起
无论是那种情况的碰撞,其实就是两张图片有了交集。
如图
执行结果
当玩家被击中的时候,在显示一张 GameOver 图片提示
细节处理
精细的碰撞检测
从图上看,当敌机看似还没有和我们接触时,但是已经 GameOver 了。
实际情况是这样的,所有的图片都是矩形,当两张图片的矩形边框线碰撞的时候,就算两个对象碰撞,所以我们要更加精细的使用碰撞检测。
我们可以按着图片中心的某个长度为半径,在这个半径内发生碰撞才是碰撞。
正常发射子弹的动画效果已经做完。我们还需要进行被击中爆炸的动画效果。
击中的原理和正常也一样。只不过先要判断当前飞机状态,是否被击中。
同样我们需要创建 Group() 来存放被击中的敌机。
之后的处理逻辑基本相似,不多介绍
音乐
有了动画还的有音乐。
音乐的处理只要在特定的地方播放音乐就好,比如子弹发射的时候,背景音乐,被击中的时候,游戏结束的时候,等等。他们的处理逻辑都一样。先加载资源,然后在播放。
第一个参数是写的文字;第二个参数是个布尔值,以为这是否开启抗锯齿,就是说True的话字体会比较平滑,不过相应的速度有一点点影响;第三个参数是字体的颜色;第四个是背景色,如果你想没有背景色(也就是透明),那么可以不加这第四个参数
字体也有了,文本也有了,下一步就是绘制。通过 get_rect()获得矩形,之后绘制和精灵绘制方法一样
基本到这里算是写了一个相对完整的游戏。
联系客服