设为首页收藏本站

Crossin的编程教室

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

【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
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2013-9-5 19:51:05 |显示全部楼层
liqing215 发表于 2013-9-4 20:59
这个是干嘛吖? 设置哪儿的字体?

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

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2016-1-13 17:53:03 |显示全部楼层
百分之三十 发表于 2016-1-13 15:36
请问:为什么把这里的checkHit函数放在class Bullet中,然后主循环里写b.checkHit时,编译报错:TypeError: ...

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

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2016-11-24 13:27:14 |显示全部楼层
BDHELLO 发表于 2016-11-24 11:42
为什么我的程序运行起来出现鼠标不动画面不动的现象?

是不是你代码里的循环写的有问题。
对照例子代码看看,缩进什么的有没有搞错了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

5#
发表于 2017-3-11 15:24:16 |显示全部楼层
wwb951108 发表于 2017-3-10 17:18
老师为什么我屏幕里总是有一个飞机命中不了

不知道……
查一查你碰撞检测那里的循环,是不是有个飞机不在循环列表里
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2017-3-16 17:56:08 |显示全部楼层
wwb951108 发表于 2017-3-15 19:07
老师我感觉没出错啊

我也没看出问题。这个不大能直接这么看出来,得具体调试了,先想办法重新问题,然后多加输出,看看哪里出了问题
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

7#
发表于 2017-9-17 11:57:20 |显示全部楼层
gysgo2 发表于 2017-9-17 02:13
请问老师,如果在命中目标后再加个爆炸效果该怎么实现?

增加一种爆炸的 sprite,用帧动画实现爆炸效果(这个网上可以搜到)
然后击中了之后,就在击中的位置放这个sprite,放完就移除
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

8#
发表于 2017-9-18 22:54:23 |显示全部楼层
lsp84ch83 发表于 2017-9-18 19:18
以下是我对照论坛写的飞机代码,但是我的子弹距离很短,附件图片为运行效果 ...

那你可以通过调节 speed 或者 interval_b 来修改。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

9#
发表于 2018-1-12 16:32:15 |显示全部楼层
Youngkuso 发表于 2018-1-12 13:14
不仅延迟,还能感觉到打到敌机的子弹会明显变慢

你的代码里不是击中敌机就 actice False ,然后不移动了吗
你这个要自己调试代码来看的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

10#
发表于 2018-3-15 17:15:12 |显示全部楼层
skybeak 发表于 2018-3-14 16:18
请问判断飞机是否被打中的那段代码
            for e in enemies:
                checkHit(e, b)

可以,一个功能可以有不同的实现
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

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

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

GMT+8, 2024-5-3 01:12 , Processed in 0.032031 second(s), 25 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部