像素级碰撞的一种算法

flash中,任何形状的元件都是被包含在一个完整的矩形容器里的,此碰撞算法就是根据这一点来获取两个不规则形状的交集,这么说可能你听起来有些不明白,我们来进一步解释一下。

假如我们这里有两个不规则形状的MC,即mc1mc2。如下图:

为了更方便于的理解,我将形状做在的容器mc1mc2用单色的矩形来表示,如下图:

此时我们可以很明显的看到两个矩形的交集,根据mc1mc2深度不同,可以有以下两种情况:

通过观察以上两张图,我们可以发现,除了交集的部分,其他地方的像素值BitmapData是完全相同的,也就是说,当两个MC存在交集(即碰撞)的时候,交集部分的像素值会不同,当然,如果在这个交集部分,两个MC都没像素,这中情况,我们认为这两个MC是没有碰撞的。

进而,我们可以这么想,将两个容器矩形的合集放在一个BitmapData中。代码中,我们可以通过copyPixels来实现。

这样根据mc1mc2的深度不同,我们可以得到两个合集的BitmapData,然后我们将这两个合集里的像素值进行相减得到resultBitmapData,代码中可以通过BitmapData类的compare来实现,存在以下两种情况:

1,  两个mc的交集部分的像素值不同时为空,相减之后,如果结果resultBitmapData不为空,则我们可以判断两个mc有碰撞,如果结果resultBitmapData为空,则我们说,两个mc没有发生碰撞。

2,  两个mc的交集部分的像素值同时为空,这样只有一种结果,resultBitmapData为空,这种情况我们认识两个mc是没有发生碰撞的。

综上所述,我们可以根据resultBitmapData中的像素值是否为空来判断,两不规则的形状是否发生碰撞。具体AS代码实现如下:

 

Code

源文件地址:

http://www.brsbox.com/filebox/down/fc/5433809492a7867ccd5478d5e821015b

posted on 2009-03-02 13:42  拉登  阅读(3546)  评论(5编辑  收藏  举报

导航