2015/11/7用Python写游戏,pygame入门(7):碰撞检测

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

今天的内容就非常简单了,就是做到这个碰撞检测,以及控制好子弹和飞机的消失。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

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



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

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

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

时间: 2024-10-13 08:09:42

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

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

这两天学习数据结构和算法,有时感觉并不如直接做项目来的有趣.刚刚学完python的基本使用,现在刚好趁热打铁做个小项目. 由于本人一直很想制作一款游戏,就想使用Python制作一个基础的游戏.搜了一下资料,看到一个很便于使用的库,也就是pygame. pygame介绍 pygame是一个建立在SDL(Simple DirectMedia Layer)上的Python模块,是一个跨平台模块.SDL是用C写的,也可以用C++开发,也有很多语言,pygame就是一个Python中使用的库. 安装pyg

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

昨天我们已经实现了这个游戏的三个基本类. 但是现在它还是没办法做成一个适合玩的游戏,毕竟只有一架敌机的游戏是很乏味的.所以,我们需要好多子弹,也需要好多敌机. 所以,我们要创建list,这个list存放Bullet或者Enemy的实例. 以Bullet为例: bullet = [] #创建子弹 for i in range(6): bullet.append(Bullet()) ... for b in bullet:#移动子弹 b.move(time_passed_second) ... fo

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

昨天的内容里有了运动的子弹,虽然我们只添加了一个子弹,但你可以看到我们需要记录子弹的x,y坐标,每次要更新它的坐标.如果我们想要有多颗子弹,就需要存储多个坐标.那时候处理起来就不显得那么简单,也许我们可以使用两个list,一个专门存储各个子弹的x坐标,另一个专门存储子弹的y坐标,问题似乎变得没那么复杂,写起来会简单一些.但是我们到现在还没有加入过敌机,如果加入了敌机,加入别的东西的设计,我们将需要很多不同的数据的存储.虽然一个思路清晰的程序员可以记住所有的坐标存储在哪个list里,但是这毕竟比较

python写游戏运维管理后台

最近在用python写游戏运维管理的后台,待功能完善后放源码,大致功能如下: 有兴趣的可以加我一起来做.

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

这次不是直接讲解下去,而是谈一下如何把我们写的游戏做成一个exe文件,这样一来,用户不需要安装python就可以玩了.扫清了游戏发布一大障碍啊! perl,python,java等编程语言,非常好用,语法优美,功能强大:VB啥的,功能上编写的时候总有那么点不舒服的地方(个人见解),可是用户和受众极多,一个很大的原因就是:VB是微软提供的,可以很方便的编译(伪?)生成exe文件.有了exe,所有的Windows都能方便的使用了. 我们不能指望用户在玩我们的游戏之前都安装一个python和pygam

2018用Python写网络爬虫(视频+源码+资料)

课程目标实现Python写网络爬虫入门适用人群数据零基础爱好者,职场新人 ,在校大学生课程简介1.基本Http请求以及验证方式分析 2.Python用于处理Html格式数据beautifulsoup模块3.Pyhton的requests模块的使用并实现爬取B站.网易云.微博.内涵段子等网站4.异步IO模块的使用,如:asyncio.gevent.aiohttp.twisted.torando 5.自定义异步IO模块 6.Scrapy框架的使用以及应用 下载地址:百度网盘 原文地址:http://

Pygame - Python游戏编程入门(0)

引言 博客刚开,想把最近学习的东西记录下来,算是一种笔记.最近打算开始学习Python,因为我感觉Python是一门很有意思的语言,很早以前就想学了(碍于懒),它的功能很强大,你可以用它来做科学运算,或者数字图像处理,或者任务的自动化,还可以构建动态网站,很多很多听起来就很有意思的实现.关于Python你还可以找到更多的资料,这里不一一赘述. 一说到开始学习一门新的编程语言,很多童鞋可能马上想到,“嗯,哥去买本书啃啃!”,结果买了本大部头,全是枯燥的语法知识,看了后面忘了前面,事倍功半.记得以前

Pygame - Python游戏编程入门(3)

前言 在上一节我们完成了对玩家飞机的基本操作,这一节我们就来创造出敌人了(°∀°)?~目标有三个,第一个是在屏幕上绘制出敌机,第二个是判断子弹是否击中了敌人,第三个是对被击中的敌人作后续的处理.明白方向后就可以开始了! 正片开始~ 1. 绘制敌机 随机是游戏中一个很重要的元素,不可预测的机制为游戏带来了更丰富的体验.这次我们要在程序中加入随机数,两行代码: # 导入random库中的randint函数 from random import randint # 返回一个整数N, a<=N<=b

python写的第一个简单小游戏-猜数字

1 #Filename:game1.py 2 3 guess=10 4 running=True 5 while running: 6 try: 7 answer=int(raw_input('Guess what i think:')) 8 except: 9 print 'Please input interga\n' 10 continue 11 12 if answer<guess: 13 print 'Your answer is too small\n' 14 continue 15