设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 60261|回复: 44
打印 上一主题 下一主题

【Pygame 第10课】 命中目标

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2013-9-3 20:37:27 |只看该作者 |倒序浏览

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


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

10show.jpg

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


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


在代码中的实现:

  1. def checkHit(enemy, bullet):
  2.         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()):
  3.             enemy.restart()
  4.             bullet.active = False</font></font>
复制代码

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

  1. for b in bullets:
  2.     if b.active:
  3.         for e in enemies:
  4.             checkHit(e, b)</font></font>
复制代码

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


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


10-1.jpg

10-2.jpg

#==== Crossin的编程教室 ====#
微信ID:crossincode
论坛:http://crossin.me
QQ群:156630350

面向零基础初学者的编程课
每天5分钟,轻松学编程

pcqr.jpg

10.py

2.37 KB, 下载次数: 383

第10课源码

#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

88

积分

注册会员

Rank: 2

沙发
发表于 2013-9-3 23:48:00 |只看该作者

回帖奖励 +2

终于可以打飞机了!
回复

使用道具 举报

0

主题

0

好友

37

积分

新手上路

Rank: 1

板凳
发表于 2013-9-4 10:25:59 |只看该作者
····打起来了
回复

使用道具 举报

3

主题

0

好友

161

积分

注册会员

Rank: 2

地板
发表于 2013-9-4 15:54:17 |只看该作者

回帖奖励 +2

看看效果咋样
回复

使用道具 举报

0

主题

0

好友

65

积分

注册会员

Rank: 2

5#
发表于 2013-9-4 20:59:51 |只看该作者

回帖奖励 +2

<font color="rgb(62, 62, 62)"><font face="Helvetica,">  这个是干嘛吖? 设置哪儿的字体?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2013-9-5 19:51:05 |只看该作者
liqing215 发表于 2013-9-4 20:59
这个是干嘛吖? 设置哪儿的字体?

。。。
这个是发到论坛上时候,不知道怎么被混到代码格式里的。
之前没注意,现在已经改掉了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

65

积分

注册会员

Rank: 2

7#
发表于 2013-9-5 21:08:37 |只看该作者
crossin先生 发表于 2013-9-5 19:51
。。。
这个是发到论坛上时候,不知道怎么被混到代码格式里的。
之前没注意,现在已经改掉了 ...

嘿嘿~
回复

使用道具 举报

0

主题

0

好友

558

积分

高级会员

Rank: 4

8#
发表于 2014-9-20 21:56:00 |只看该作者
终于打起来了。哈哈哈哈。
学习,纯粹。
回复

使用道具 举报

0

主题

0

好友

6

积分

新手上路

Rank: 1

9#
发表于 2016-1-13 15:36:48 |只看该作者
请问:为什么把这里的checkHit函数放在class Bullet中,然后主循环里写b.checkHit时,编译报错:TypeError: checkHit() takes exactly 2 arguments (3 given)  ?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

10#
发表于 2016-1-13 17:53:03 |只看该作者
百分之三十 发表于 2016-1-13 15:36
请问:为什么把这里的checkHit函数放在class Bullet中,然后主循环里写b.checkHit时,编译报错:TypeError: ...

这个报错应该是你函数定义参数的时候没有加上self
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-22 08:11 , Processed in 0.025890 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部