我们已经完成了飞机大战的大部分东西,但是游戏还是没有办法正式开玩,因为子弹并不能打掉飞机。只有完成了这一个工作,游戏才算基本成型。

今天的内容就非常简单了,就是做到这个碰撞检测,以及控制好子弹和飞机的消失。pygame里的sprite模块里有碰撞检测部分,但是,我们这里自己动手实现一个碰撞检测的函数。


检测碰撞的方法很简单,就是子弹的位置在飞机图片的内部。由于子弹和飞机的速度比较快,所以不需要非常精确地判别。

我们认为,如果子弹的坐标(b.x, b.y)在飞机的图片范围内,也就是(e.x, e,y)到(e.x + e.width, e.y + e.height)这个矩形范围内就行。(这里需要回忆一下,我们的子弹的坐标是子弹图片的中心,敌机的坐标是它图片左上角的坐标)

所以,碰撞就是检测:

e.x < b.x < e.x + e.width

e.y < b.y < b.y + b.height

如果子弹确定已经达到了敌机,要做的事就是让子弹重置,也让飞机重置。

代码实现就是这样一个函数:

def checkHit(enemy,bullet):
if enemy.x < bullet.x < enemy.x + enemy.image.get_width() \
and enemy.y < bullet.y < enemy.y + enemy.image.get_height():
enemy.active = False
bullet.active = False
return True
else:
return False

这个函数可以用来检测碰撞,然后我们在原来的主循环里的代码段更改成这样:

for b in bullet:
if b.active:
b.move(time_passed_second)#移动子弹
for e in enemy:
if e.active:
checkHit(e,b)
screen.blit(b.image, (b.x, b.y))#显示子弹

然后运行你的代码,你就可以看到。子弹能够打掉飞机了。当然,你们都发现了。这个效果很突兀。之后,我会在上面加上动画显示效果,整个图像会不那么突兀。


现在子弹能够打掉敌机了,但是敌机没办法碰撞掉自己的飞机,我们可以再写一个敌机和自己飞机的碰撞检测。

这里的碰撞检测,我们用另外一种方法来检测:

我们通过两点之间的距离小于一定值以后,就认为是碰撞了。求距离用了两点间距离公式,这里不用复习了吧。

def checkCrash(enemy):
plane_x, plane_y = pygame.mouse.get_pos()
enemy_x, enemy_y = enemy.x, enemy.y
enemy_x += enemy.image.get_width()/2
enemy_y += enemy.image.get_height()/2
distance = sqrt(float(plane_x - enemy_x)**2 + float(plane_y - enemy_y)**2)
if distance < 75:
return True
else:
return False

这里用了sqrt()开平方,所以要在前面加一句from math import sqrt

这种方法,对于连个圆形的对象比较碰撞,相当好用,但是对于我们的飞机形状还是表现稍差,具体用什么方法,大家自己可以考虑。


现在我们完成的大部分的东西,既可以打飞机又可以被飞机撞毁。然后我们应该加一些内容让它显得更丰富。比如说一个记分的模块,比如说游戏结束后显示结束,选择再来一次的模块。

这些东西,今天就暂不往下讲了,大家可以自己实现,明天我给大概的框架。

由于程序已经比较长了,就不发上来了。等差不多写完功能再发吧。

2015/11/7用Python写游戏,pygame入门(7):碰撞检测的更多相关文章

  1. 2015/11/1用Python写游戏,pygame入门(1):pygame的安装

    这两天学习数据结构和算法,有时感觉并不如直接做项目来的有趣.刚刚学完python的基本使用,现在刚好趁热打铁做个小项目. 由于本人一直很想制作一款游戏,就想使用Python制作一个基础的游戏.搜了一下 ...

  2. 2015/11/9用Python写游戏,pygame入门(8):按钮和游戏结束

    昨天没有更新内容,今天相对多写一些. 因为我们已经基本完成游戏框架,但是游戏结束后,并不知道怎样比较好开始.我本来本着懒的原则,想结束后显示一个黑屏,然后你重新点一下鼠标就重新开始.但是那样实在太不像 ...

  3. 2015/11/6用Python写游戏,pygame入门(6):控制大量的对象

    昨天我们已经实现了这个游戏的三个基本类. 但是现在它还是没办法做成一个适合玩的游戏,毕竟只有一架敌机的游戏是很乏味的.所以,我们需要好多子弹,也需要好多敌机. 所以,我们要创建list,这个list存 ...

  4. 2015/11/3用Python写游戏,pygame入门(3):字体模块、事件显示和错误处理

    游戏里面一般是肯定会出现文字显示的,即使是俄罗斯方块也应该显示分数.那么我们应该怎样来显示文字呢,今天一起学习一下pygame的font模块. 使用字体模块 pygame可以直接调用系统字体,也可以调 ...

  5. 2015/11/5用Python写游戏,pygame入门(5):面向对象的游戏设计

    昨天的内容里有了运动的子弹,虽然我们只添加了一个子弹,但你可以看到我们需要记录子弹的x,y坐标,每次要更新它的坐标.如果我们想要有多颗子弹,就需要存储多个坐标.那时候处理起来就不显得那么简单,也许我们 ...

  6. 2015/11/4用Python写游戏,pygame入门(4):获取鼠标的位置及运动

    按昨天的说法,今天将开始做一个简单的游戏了. 目标是拷贝微信的飞机大战,当然拷贝完以后大家就具备自己添加不同内容的能力了. 首先是要拿到一些图片素材,熟悉使用图像处理软件和绘画的人可以自己制作,并没有 ...

  7. 2015/11/2用Python写游戏,pygame入门(2):游戏中的事件和显示

    pygame是一个比较大的库,以我这点弱小的实力是没办法详解的.所以我只讲我懂得那些部分,其他部分由大家慢慢查找了解. ------------------------------- 我用pygame ...

  8. 用Python和Pygame写游戏-从入门到精通(py2exe篇)

    这次不是直接讲解下去,而是谈一下如何把我们写的游戏做成一个exe文件,这样一来,用户不需要安装python就可以玩了.扫清了游戏发布一大障碍啊! perl,python,java等编程语言,非常好用, ...

  9. python小游戏-pygame模块

    一.tkinter模块的GUI 基本上使用tkinter来开发GUI应用需要以下5个步骤: 导入tkinter模块中我们需要的东西. 创建一个顶层窗口对象并用它来承载整个GUI应用. 在顶层窗口对象上 ...

随机推荐

  1. 404 Note Found Team's First Blood

    团队构成: 队员学号姓名队长标注: 031602114--胡绪佩(队长) 031602113--何宇恒 081600410--胡青元 031602627--刘恺琳 031602525--刘一好 031 ...

  2. 构建基于Chromium的应用程序(Winform程序加载Html页面)

    chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决 ...

  3. 深入理解JAVA集合系列一:HashMap源码解读

    初认HashMap 基于哈希表(即散列表)的Map接口的实现,此实现提供所有可选的映射操作,并允许使用null值和null键. HashMap继承于AbstractMap,实现了Map.Cloneab ...

  4. angular入门学习文档之一

    一.数据双向绑定 angular(下面统一简称ng)强大的地方莫过于它内置的数据双向绑定功能,下面我们通过一个简单的例子来演示ng强大的双向绑定数据的能力. 代码如下: 1.dom结构: 1.< ...

  5. VS2012 Nuget 安装 AutoMapper时报错的解决方法

    VS2012 在.net 4.0下安装AutoMapper时,会报以下错误: “AutoMapper”已拥有为“Standard.Library”定义的依赖项. 'AutoMapper' alread ...

  6. 执行SCP命令拷贝文件失败

    scp是我最常用的远程文件拷贝工具,今天发现突然不能用了: svan-mac:hive-tools xiean$ scp  -Pxx target/urs-hive-tools-jar-with-de ...

  7. Android 5.0 Activity切换动画

    在Androiod5.0中,Google定义了Material Design的规范.而动画切换,能给用户直观的连贯性的体验,也是Google推崇的. 为此,在Android5.0中,Android新支 ...

  8. 深入理解JAVA虚拟机JVM

    深入理解JAVA虚拟机JVM Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.java之所以能实现一次编写到处执行,也就是因为jVM.原理:编 ...

  9. HDU.1847 Good Luck in CET-4 Everybody! ( 博弈论 SG分析)

    HDU.1847 Good Luck in CET-4 Everybody! ( 博弈论 SG分析) 题意分析 简单的SG分析 题意分析 简单的nim 博弈 博弈论快速入门 代码总览 //#inclu ...

  10. BZOJ 1010 [HNOI2008]toy 玩具装箱

    2017.6.9:经过我的不懈努力,终于把此题A掉了,但上凸和下凸总是那么让人费解…… P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意 ...