找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 1903|回复: 7

Flash AS3教程:大量对象的碰撞测试

[复制链接]
已绑定手机

195

主题

71

回帖

979

牛毛

一级牛人

积分
979
QQ
 楼主| 发表于 2012-6-28 08:28:27 | 显示全部楼层 |阅读模式 来自 北京市
Flash Player 10中的ActionScript比之前的版本运行速度更快,这就允许我们可以一次做更多工作,而且可以同时移动更多对象。但是限制仍然存在。如果开始在屏幕上移动大量对象,速度迟早会变得越来越慢。大量对象之间的碰撞检测更会引发问题,因为每一个对象都需要与其他各个对象进行比较。这一点并不仅限于碰撞检测,任何包含大量对象而且对象相互之间需要交互(如通过重力或群落〉的粒子系统游戏〈参见第2章〉都会遇到同样的问题。
如果只有6个相互作用的对象,每个对象则需要与其他的每一个对象结对,并完成碰撞测试、重力吸引或所需的任何动作。乍一看,这意味着需要6X6共36次单独比较,但其实并非如此。正如<<Flash ActionScript 3.0 动画教程》所述,实际上比较次数还不及其一半,准确地讲,应该是15次比较。给定对象A, B, C, D, E, F ,需要完成以下结对比较:
AB. AC. AD. AE. AF
BC.BD.BE.BF
CD. CE. CF
DE.DF
EF
注意, B不必再检查A,因为A 己经与B做过碰撞检查。达到E时,己经检查过除F以外的所有对象。而在此之后, F 已经得到了所有其他对象的检查。下面是所需实际比较次数的计算公式,这里N是对象个数:
(N2 -N) /2
对于6个对象,则计算为(36 - 6) /2 ,即15.
对于10个对象,则是000-10) /2 ,即45次检查。
20个对象意味着190次检查, 30个对象将是435次检查!
可以看到,检查次数会飞速增长,因此需要采取一些措施来加以限制。用ActionScript 3.0在屏幕上移动100个对象并不太困难,但是如果开始进行碰撞检测或者对象间的另外一些比较,就需要完成4950次单独的检查!如果使用基于距离的碰撞检测,这就意味着需要计算4950次两个对象之间的距离。如本章前面所述,如果使用位图碰撞,这就需要完成4950次下述过程t 清除两个位图,绘制两个对象,并调用hi tTest方法。每一帧都是如此!这势必导致SWF文件速度的下降。
幸好我们有一种技巧可以限制需要完成的检查次数。可以这样来考虑:如果两个相对较小的对象分别位于屏幕的两侧,它们就不太可能发生碰撞。但是为了证明这一点,需要先计算二者之间的距离,对不对?这样一来我们又回到了最初的问题上。不过,也许还有其他办法。
假设将屏幕分割成正方形单元格网格,其中每个单元格至少与最大的对象一样大,然后根据对象中心所在位置将各个对象分配到该网格的某个单元格中。如果一切正常,给定单元格中的对象只可能与其周围的8个单元格中的对象发生碰撞。例如,请看图1-7 。
0.jpg
图1-7 这个球只可能与加阴影的单元格中的对象发生碰撞
图中所示的球根据其圆心位置分配到一个单元格。只有加阴影的单元格中的对象才有可能与它发生碰撞。这个球不可能与任何白色单元格中的对象碰撞。即使球位于其单元格的边缘,而另一个球位于某个白色单元格的边缘,它们也不可能相互接触(参见图1-8) 。
重申一次,这种情况的前提条件是单元格的大小至少与所要比较的最大对象同样大。如果任何一个球大于单元格,那么在上述情况下它们则有可能相互碰撞。以上就是基本思路。应该知道,可能还有很多其他方法。我不能确保这是最好的方法,但是可以明确我们的目标是将各个对象与它可能接触到的所有其他对象两两测试,并确保绝对不会将两个对象相互测试两次。正是这一点有些技巧。
这里将概要介绍我提出的方法,这种方法看上去可能相当抽象。目前只需大致了解要对网格的哪些区域进行碰撞检测。至于具体怎样做到将在后面讨论。
1.jpg
已绑定手机

0

主题

40

回帖

26

牛毛

初生牛犊

积分
26
QQ
发表于 2012-6-28 11:58:48 | 显示全部楼层 来自 广西南宁市
学习了
已绑定手机

195

主题

71

回帖

979

牛毛

一级牛人

积分
979
QQ
 楼主| 发表于 2012-6-28 12:33:11 | 显示全部楼层 来自 北京市
感谢了

0

主题

116

回帖

19

牛毛

初生牛犊

积分
19
发表于 2012-7-4 14:00:18 | 显示全部楼层 来自 广西南宁市
厉害!强~~~~没的说了!

69

主题

704

回帖

629

牛毛

一级牛人

积分
629
发表于 2012-7-4 15:11:50 | 显示全部楼层 来自 河北省唐山市
帅,强大~学习了~

0

主题

260

回帖

3

牛毛

初生牛犊

积分
3
发表于 2012-7-11 09:51:44 | 显示全部楼层 来自 湖南省邵阳市
经验啊... 向楼主学习

0

主题

487

回帖

67

牛毛

初生牛犊

积分
67
发表于 2012-7-25 10:47:42 | 显示全部楼层 来自 安徽省芜湖市
谢谢楼主啦~~~~

463

主题

123

回帖

1309

牛毛

二级牛人

积分
1309
发表于 2012-8-1 12:51:17 | 显示全部楼层 来自 北京市
鼓励一下,帖子非常好
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-4-25 04:54 , Processed in 0.230198 second(s), 68 queries .

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表