07
2015
06

BitmapData碰撞检测

实现原理转自:http://bbs.9ria.com/thread-24171-1-1.html

效果演示如下。


1、  首先判断这两个mc的边界矩形是否有相交的部分,不相交那就当然不会发生碰撞了。
2、如果边界矩形有相交,则取得这个矩形的范围。
3、把这个范围内的两个mcBitmapData.draw分别做出一个snapshot。要把第二个snapshot的混合模式(blendMode)设置为difference之类,使得表示这两个mc的两个snapshot的重叠部分颜色会有明显的不同。
4、最后使用BitmapData.getColorBoundsRect找出这个重叠部分。如果其宽度为0,那就是没有发生重叠,即没有碰撞,否则即为 发生了碰撞,可将这个碰撞区域返回。

 

 

已经了解过tink的碰撞检测类的老同学们对此帖的内容应该是烂熟于心了。利用bitmapData来做碰撞检测,我最早是在gskinner的博客看到,那还是flash8的时代。

这一贴的重点是再了解BlendMode和掌握BitmapData.getColorBoundsRect

那么碰撞是怎么检测到的呢?物理学上的碰撞是很普通的概念,而在绘图上,碰撞无非是两个图形之间有了叠加。这个叠加的产生只与图形的形状有关,与颜色无 关。一提叠加,熟悉ps的同学可能灵光一现。通过设置混合,ps的两个图层之间可以有不同的颜色效果。从8开始,flash也加入了这一功能并可以在AS 里操作,也就是BlendMode。而这里我们就要利用BlendMode.difference,中文为“差异”叠加。关于差异叠加对颜色的计算方式请 参考flash帮助。
接下来,我们先把需要判断的两个物体之一先draw在一个bitmapData上,并利用ColorTransform将其变为纯红色0xFF0000。 然后再加物体二,变为水蓝色(Aqua)0x00FFFF,并以“差异”的叠加方式draw在同一个bitmapData上。从我附件中的例子可以看 到,draw好后,没有叠加的部分保持原色,叠加的部分经过“差异”计算为纯白色0xFFFFFF。这就意味着,如果bitmapData里出现了白色, 那么即为有碰撞。


我们能看到白色,我们也要让程序检测到白色。这里要用到getColorBoundsRect。

  1. public      function getColorBoundsRect(mask:uint, color:uint, findColor:Boolean = true):Rectangle      

复制代码

这 个方法返回一个矩形Rectangle,为搜索到的颜色区域,Rectangle四个属性为0则没搜索到。mask为一个6位的16进制数,1为通过,0 为过滤,通常可以直接用0xFFFFFF,所有通道颜色全部通过。color为你要搜索的色值。findColor为true则搜索color所在的位 置,为false则搜索color不在的位置。

经过两步,即可完成叠加检测,也就是碰撞检测。这一思路的应用很广,除了碰撞检测,还可用于图像比较,如通过比较摄像头前后两帧画面来检测运动物体。

如果你对draw和ColorTransform还有点陌生,可以查阅我以前的帖子。



源码打包下载


« 上一篇下一篇 »

相关文章:

闪电效果  (2017-11-28 15:4:19)

线段与椭圆的交点  (2017-1-6 14:43:41)

as3录制swf并保存flv视频  (2016-12-28 8:43:41)

解九连环  (2016-12-1 20:58:11)

as3实现setTimeout和trace  (2016-11-10 16:47:37)

registerCursor注册系统光标  (2016-9-14 9:49:40)

鼠标光标管理  (2016-9-13 17:44:3)

变形框(transform)实现  (2016-9-13 16:56:6)

flash文本消除锯齿不显示  (2016-8-25 11:43:31)

greenSock的easing曲线  (2016-8-24 18:30:11)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。