`
sjpsega
  • 浏览: 299387 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

碰撞测试小节

 
阅读更多


    在最近的项目中,需要用到碰撞测试的知识,故特意去看了《as动画基础》、《as高级动画》,并看了网上的帖子,小有斩获。

对象与对象的碰撞测试,主要使用三种方法:

1.

DisplayObject.hitTestObject(obj:DisplayObject)
该方法的测试效率最高,但精确度最低,只对矩形物体有效,不规则物体的碰撞测试,这个方法无能为力。

 

2.

BitmapData.hitTest(firstPoint:Point, firstAlphaThreshold:uint, secondObject:Object, secondBitmapDataPoint:Point = null, secondAlphaThreshold:uint = 1):Boolean
该方法是《as高级动画》上介绍的,通常的做法是定义2个BitmapData对象bmpd1和bmpd2,
分别为new BitmapData(stage.stageWidth, stage.stageHeight, true, 0),bmpd1.draw(obj1, obj2.transform.matrix);bmpd2.draw(obj1, obj2.transform.matrix);
isHit = bmpd1.hitTest(new Point(), 255, bmpd2, new Point(), 255);进行碰撞测试。

 

 3.
BitmapData.getColorBoundsRect(mask:uint, color:uint, findColor:Boolean = true):Rectangle 
该方法非常巧妙,需要定义1个BitmapData对象,draw的时候:bmpd.draw(obj1, obj1.transform.matrix, new ColorTransform(1, 1, 1, 1, 255, -255, -255, 255)),将bmpd1绘制成红色;
之后,继续在bmpd上绘制,bmpd.draw(obj2, obj2.transform.matrix, new ColorTransform(1, 1, 1, 1, -255, 255, 255, 255), BlendMode.DIFFERENCE),采用青色绘制,并且采用"difference"的混合模式;
这样绘制后,若有重叠,重叠色为白色。之后采用var rect:Rectangle = bmpd1.getColorBoundsRect(0xFFFFFFFF, 0xFFFFFFFF, true);若rect.width>1,便可确认是否碰撞。
 
  这三种方法需要分情况使用,若测试的对象为矩形,使用方法1最合适,效率最高;若测试的对象为不规则图形,可使用方法2或方法3.

之后介绍两种网上高手写的碰撞测试方法,这两种方法均是对上面第三种方法的延伸、扩展。
1.
HitTest.complexHitTestObject(target1:DisplayObject, target2:DisplayObject, accurracy:Number = 1):Boolean 
这是tink写的一个像素级碰撞检测类,做了良好的封装,使用简单。
最上面方法3的优化主要在于,BitmapData对象的消耗主要在创建BitmapData对象的大小上,越大消耗越大,tink写的方法,首先先计算了两个物体的矩形所占位置的重叠部分,BitmapData只新建大小为该重叠部分的大小,故消耗大大减小。
 2.
BitmapHitTestPlus.complexHitTestObject(target1:DisplayObject, target2:DisplayObject)
这是Aone在tink的HitTest的基础上优化效率后的碰撞检测,整体思路是一样的,效率优化时在计算两个物体矩形重叠部分上更进一步。采用分块的思路分别计算,见效计算量。但是,经我实际使用和测试,该方法虽然比tink的方法效率高,但是精确度不够,需要改进,或根据情况使用。
 
我的代码间附件。在写这篇帖子之前,看到leng6666写了一片类似的帖子 谈谈碰撞测试(上),他写的比我详细,可以相互借鉴。
水平有限,有不足的地方也希望大家帮我指出!

ps:javaeye的编辑器真不爽……
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics