更多课程 选择中心

Python培训
美国上市教育机构

400-111-8989

Python培训

Python实战【用Python写游戏第十节】命中目标

  • 发布:Python培训
  • 来源:Crossin的编程教室
  • 时间:2019-03-29 16:13

欢迎大家来到Python自学教程实战篇,我们上一讲已经对游戏加点效果造出了一大波飞机正在接近的景象,但是我们是打飞机呀,怎么打,打中的效果是什么呢?今天我们就一起来学习一下吧:

现在,我们的“打飞机”游戏已经到了万事俱备只欠东风的阶段:有了子弹也有了敌机,但它们之间还没有办法擦出火花。这节课的内容就是让玩家可以真正的“打”飞机。

我们判断子弹命中飞机的依据很简单:就是子弹的位置在飞机图片的内部。这不需要很精确,因为在快速的游戏过程中,人眼也无法分辨细微的差别。来看下面这张示意图:

Python实战【用Python写游戏第十节】命中目标

按照我们的设定(为了简化,假设子弹的长宽忽略不计),当子弹的坐标(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 < e.y+e.height

当命中后,要做两件事:把敌机重置;把子弹重置。(之后还可以加上得分)

在代码中的实现:

def checkHit(enemy, bullet):

if (bullet.x > enemy.x and bullet.x < enemy.x + enemy.image.get_width()) and (bullet.y > enemy.y and bullet.y < enemy.y + enemy.image.get_height()):

enemy.restart()

bullet.active = False

我们把这段是否命中的检测代码写成一个函数checkHit(enemy, bullet),在主循环中,检测每一颗active的子弹是否命中任何一个enemy:

for b in bullets:

if b.active:

for e in enemies:

checkHit(e, b)

运行代码,你就可以痛击敌机了,虽然效果还很突兀。

在游戏中,我们把这种判断两样物体是否有重合关系的处理称为“碰撞检测”。其实在pygame中,已经为我们实现好了更方便更高效的碰撞检测方法。这里自己手动实现一个简单的碰撞检测,可以对其原理有更好的认识。

Python实战【用Python写游戏第十节】命中目标

Python实战【用Python写游戏第十节】命中目标

恭喜您在Python自学的道路上又坚持了一天,我们目前学习的知识比之前的要复杂一些,但是也比之前的有趣多了,所以希望大家跟上我们的步伐,继续加油!

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:Python实战【用Python写游戏第九节】一大波飞机
下一篇:Python实战【用Python写游戏第十一节】GAME OVER

【Git第八节】移除文件

【Python实战】四行Python代码就能知道你那的天气,你敢信?

Python实战【用Python写游戏第十三节】exe打包

Python实战【用Python写游戏第十二节】屡败屡战

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省