用 Python 实现打飞机,让子弹飞吧!

所用技术和软件python

python 2.7微信

pygame 1.9.3ide

pyCharm函数

准备工做学习

安装好 pygame 在第一次使用 pygame 的时候,pyCharm 会自动 install pygame。测试

下载好使用的素材。字体

技术实现动画

初始化 pygame3d

首先要初始化 pygame ,以后设定一些基本的要点,好比窗口大小(尽可能避免魔法数字),窗口标题以及背景图像。pygame 经过加载图片,最后返回一个 surface 对象,咱们不须要关系图片的格式。可是经过 convert() 这个函数,会使咱们的图片转换效率提升。对象

默认图片左上角为原点 (0,0)。

显示窗口

若是咱们这样设定,当咱们运行的时候,窗口会一闪而过,并不会出现咱们想象的画面。由于窗口只是运行一下就会关闭,因此咱们要写一个循环,使窗口一直保持出现。固然若是咱们简单的写一个 while True那么咱们的程序就出现了死循环,卡死。

因此还须要写个退出。

显示飞机

首先咱们要初始化咱们的主角飞机

仍旧须要加载咱们须要的资源,咱们的资源文件里已经准备好各类各样的飞机,可是他们都在一张切图上。

同时咱们的资源文件里还有一个叫作 shoot.pack 的文件,里面记录了每一个图片所在的位置。

咱们经过下面的代码加载资源图片,而且得到咱们须要的主角飞机。

效果以下

让飞机 “飞” 起来

飞机已经出如今咱们的屏幕上了,如今须要让飞机动起来让他能够上下左右的移动。

首先要获取键盘事件,获取键盘上什么按键被按下。

key_pressed = pygame.key.get_pressed()

经过 key_pressed 获取当前的键盘按键。并进行判断,这里写了四个函数进行对 player 移动。

下一步就是完善这四个方法。

简单的说就是按下方向键的时候(w,a,s,d)飞机向四周移动,可是不能移动离开屏幕。

此时咱们就应该把咱们的飞机造成一个类,类里面有控制飞机的方法。

这里写类比较麻烦一点

Player的出现

首先要明确一点,这个类须要什么。

咱们以前对 player 有什么操做?定义了他的图片和他出现的位置。因此咱们的构造方法就要初始化这些值。全部的这些对象,咱们在 pygame 里叫作精灵(sprite),这个概念也在其余游戏开发中使用。

简单的说就是获取飞机的图片,初始化飞机的矩形区域。rect 该属性会得到四个值。分别是左上角 x ,y 坐标,矩形的宽度。topleft 初始化飞机的左上角坐标,也就是飞机出现的位置。以下图所示。

player的控制

当飞机出现了,咱们就应该实现咱们在循环里写的方法。咱们首先要判断它还在不在屏幕内,不能让飞机飞出屏幕。能够经过 rect.top,rect.bottom,rect.left,rect.right四个方法获取飞机图片的上下左右四个边界值。

这样咱们就能对飞机进行判断

这里的 move 是咱们对飞机的移动的位移定义的常量。

让子弹飞

子弹要沿着发射方向射出去。能够在屏幕上一直移动,直到移出屏幕。

咱们只要有定义一个子弹对象,让这个对象显示在屏幕上就能够。先定义飞机子弹类,基本和定义 player 同样,得到图片,裁剪图片,设置图片初始位置,在屏幕上显示图片

运行结果

下一步就是让飞机的子弹跟随飞机。咱们须要在 Player 类里面添加方法。首先咱们规定,按下空格发射子弹。

这样咱们的子弹就会跟随飞机出现。

下一步就是让子弹在屏幕上移动。

建立移动的方法。

player 的飞机就算基本绘制好了

绘制敌机

下一步就是绘制敌机。敌机是从屏幕上方移动到屏幕下方。咱们任就须要一个类来设置敌机。设置类任就和咱们前面的差很少,加载资源,设置 rect,设置位置。

最后在屏幕显示出来

1

screen.blit(enemy_img, enemy_rect)

如今咱们就应该想一想敌机的特色了,其实他和子弹的特色基本一直,只不过方向不同而已。还有一点是敌机是随机生成的。

移动实现

碰撞检测

飞机和敌机还有子弹都有了,咱们如今须要进行完成碰撞检测。有下面几种场景。

敌机和玩家碰撞在一块儿

子弹和敌机碰撞在一块儿

不管是那种状况的碰撞,其实就是两张图片有了交集。如图pygame 给咱们提供了碰撞检测的方法。首先两个对象必须是 sprite 。经过 pygame.sprite.collide_rect() 进行碰撞检测。

咱们先进行一个测试

if pygame.sprite.collide_rect(enemy, player):print'检测成功'

结果

检测成功

此时咱们就能够完成,当玩家和敌机发生碰撞,游戏结束,当子弹和敌机碰撞,敌机消失。

一样的 pygame 给咱们提供了一个 pygame.sprite.groupcollide() 用于 Group 之间的碰撞检测.当发生碰撞的时候这两个对象都会在 Group 中移出。

用于检测敌机和子弹

pygame.sprite.groupcollide(enemies, player.bullets, 1, 1)

敌机和子弹的关系已经和好的处理。处理敌机和玩家飞机的关系。

咱们须要在 Player 里添加一个属性判断当前玩家是否被击中的 boolean 值.当集中的时候把属性改成 True.当为 True 的时候游戏结束.也就是咱们一开始设置的循环就会结束.因此咱们须要更改以前写的一些代码,使它更加完善。

在 Player 类里面添加是否击中属性。

执行结果

当玩家被击中的时候,在显示一张 GameOver 图片提示

作到这里基本算是实现了飞机大战.可是还有不少细节处理。

细节处理

精细的碰撞检测

从图上看,当敌机看似尚未和咱们接触时,可是已经 GameOver 了。实际状况是这样的,全部的图片都是矩形,当两张图片的矩形边框线碰撞的时候,就算两个对象碰撞,因此咱们要更加精细的使用碰撞检测。

咱们能够按着图片中心的某个长度为半径,在这个半径内发生碰撞才是碰撞。

pygame 给咱们提供了这样的方法。pygame.sprite.collide_circle_ratio() 能够本身算出一个半径,做为检测半径。而且能够作出一个有效检测的百分比。

动画

作了怎么就,感受它没有一点动效,感受死气沉沉的。不管是飞机飞行,仍是飞机被击中,都没有一个明确的反馈。对于2d游戏,动画其实就是一张一张的图片不停的变化。就和电影的原理相似。要想让咱们的飞机动起来,咱们须要定义一个列表来存放这些图片,而后写个循环,让他一直不停的更换图片就好。

首先咱们更改咱们的主角 Player任就是老套路,加载图片。把加载的图片放到list 里。

飞机正常飞行的图片只有两张。因此咱们要循环变化这两张图片。因此每发射一个子弹,图片变化两张。

正常发射子弹的动画效果已经作完。咱们还须要进行被击中爆炸的动画效果。

击中的原理和正常也同样。只不过先要判断当前飞机状态,是否被击中。

248,30,495,1457 这些数字是什么?如何计算出来的。先说 495 这个数字。495 这个数字很随便,只是控制子弹的发射间隔。彻底能够自定义。可是495这个数字一旦肯定,其余三个数字基本肯定。248 为 495 的一半,由于发射一个子弹,图片要变化两张。30 这个数字基本也是自定义的,只要比1大就好,他影响告终束动画出现的时间。

1488 这个数字是经过 248 肯定的,是 248 的 6倍,由于飞机被射击后会有四张图片的显示。同理,把敌机接触子弹的动画写出来。

加载图片

以后的处理逻辑基本类似,很少介绍

这样的话基本完成了动画效果。

音乐

有了动画还的有音乐。

音乐的处理只要在特定的地方播放音乐就好,好比子弹发射的时候,背景音乐,被击中的时候,游戏结束的时候,等等。他们的处理逻辑都同样。先加载资源,而后在播放。

背景音乐的播放。

pygame 在处理背景音乐的时候都在 pygame.mixer 方法中。其中播放音乐的play中的参数,第一个为播放几回,-1 为循环播放,后面的浮点表示 从第几秒开始播放。

其余音乐处理同样,很少解释。

分数&等级

分数

首先绘制得分状况,在屏幕上显示多少分。

绘制字体基本和绘制精灵是差很少的。首先要生成字体两个参数分别是字体和字号

等级

有了分数,那么再加点等级会使游戏更加有趣味性。

一样的先绘制等级。

基本到这里算是写了一个相对完整的游戏。

我有一个微信公众号,常常会分享一些python技术相关的干货;若是你喜欢个人分享,能够用微信搜索“python语言学习”关注

欢迎你们加入千人交流答疑裙:699+749+852

相关文章
相关标签/搜索