前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Pygame 第10课】 命中目标

【Pygame 第10课】 命中目标

作者头像
Crossin先生
发布2018-04-16 14:35:25
4920
发布2018-04-16 14:35:25
举报

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

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

按照我们的设定(为了简化,假设子弹的长宽忽略不计),当子弹的坐标(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中,已经为我们实现好了更方便更高效的碰撞检测方法。这里自己手动实现一个简单的碰撞检测,可以对其原理有更好的认识。

本课完整代码文件在论坛crossin.me上可下载。

面向零基础初学者的编程课

每天5分钟,轻松学编程

回复『 p 』查看python课程

回复『 g 』查看pygame课程

回复『 t 』查看习题

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2013-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Crossin的编程教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档