Flash AS3教程:大量对象的碰撞测试
作者 佚名技术
来源 服务器技术
浏览
发布时间 2012-07-07
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 。 图1-7 这个球只可能与加阴影的单元格中的对象发生碰撞 图中所示的球根据其圆心位置分配到一个单元格。只有加阴影的单元格中的对象才有可能与它发生碰撞。这个球不可能与任何白色单元格中的对象碰撞。即使球位于其单元格的边缘,而另一个球位于某个白色单元格的边缘,它们也不可能相互接触(参见图1-8) 。 重申一次,这种情况的前提条件是单元格的大小至少与所要比较的最大对象同样大。如果任何一个球大于单元格,那么在上述情况下它们则有可能相互碰撞。以上就是基本思路。应该知道,可能还有很多其他方法。我不能确保这是最好的方法,但是可以明确我们的目标是将各个对象与它可能接触到的所有其他对象两两测试,并确保绝对不会将两个对象相互测试两次。正是这一点有些技巧。 这里将概要介绍我提出的方法,这种方法看上去可能相当抽象。目前只需大致了解要对网格的哪些区域进行碰撞检测。至于具体怎样做到将在后面讨论。 圄1-8 两个球不可能碰撞 关键词:AS3 碰撞
|
|||||||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于Flash AS3教程:大量对象的碰撞测试的所有评论