Actionscript 3像素完美碰撞。如何? (学习目的)

时间:2010-07-07 15:03:35

标签: actionscript-3 bitmap rotation pixel collision

我知道有人为此创建课程(即http://coreyoneil.com/portfolio/index.php?project=5)。但我想学习如何自己动手,这样我就可以按照自己需要的方式创造所需的一切。

我读过有关BitMap和BitMapData的内容。我应该能够将MovieClip拖到BitMap上,这样我就可以循环查找碰撞的像素。然而,处理偏移是奇怪和困惑的..它的接缝像MyBitMap.rect总是x = 0和y = 0 ......我无法找到找到事物的原始位置... < / p>

我正在考虑先做一个hitTestObject,然后如果这是肯定的,我会研究像素碰撞的动画片段矩形之间的交集。 但是还有另一个问题(动画片段的旋转)......

......我需要一些关于如何做的启发。 请,任何帮助将不胜感激..

4 个答案:

答案 0 :(得分:1)

如果您使用具有透明度的BitmapData对象,则可以使用BitmapData.hitTest(firstPoint:Point, firstAlphaThreshold:uint, secondObject:Object, secondBitmapDataPoint:Point = null, secondAlphaThreshold:uint = 1):Boolean

您必须从全局坐标更改为本地BitmapData坐标,如果旋转它将需要一些数学运算。这很容易实现(查找关于维基的更多信息的仿射变换):

var coordTransform:Matrix = new Matrix();

coordTransform.rotate(rotationRadians);
coordTransform.translate(x, y);

coordTransform.transformPoint(/* your point */);

答案 1 :(得分:1)

闪存中像素完美碰撞检测的经典参考是Grant Skinner's article。这是AS2,但AS3的逻辑是相同的(如果你稍微谷歌,有可用的端口)。

如果我没记错的话,只要两个测试对象具有相同的父对象,这个特定的实现就可以工作,但是可以修复。

关于BitmapData xy值,我知道这可能令人困惑;然而,它的工作方式对我来说很有意义。 BitmapData正如其名称所暗示的那样:像素数据。它不是显示对象,不能在显示列表中;如果您考虑它,那么让xy不同于0并没有多大意义。处理此问题的最简单方法可能是存储源对象的(x,y)偏移量(您绘制的显示对象)并将其转换为全局坐标空间,这样您就可以比较任何对象,无论它们的位置如何在显示列表中(使用类似var globalPoint:Point = source.parent.localToGlobal(new Point(source.x,source.y))

的内容

答案 2 :(得分:1)

我之前使用的是Troy Gilbert的像素完美碰撞检测类(改编自Andre Michelle,Grant Skinner和Boulevart),效果非常好(处理旋转,不同的父母等):

http://troygilbert.com/2007/06/pixel-perfect-collision-detection-in-actionscript3/
http://troygilbert.com/2009/08/pixel-perfect-collision-detection-revisited/

并且从那里他也链接到这个项目(我没有使用,但看起来真的令人印象深刻):

http://www.coreyoneil.com/portfolio/index.php?project=5

答案 3 :(得分:0)

毕竟我设法做到了,我已经为碰撞检测,碰撞角度和其他附加功能编写了我的课程。

最令人困惑的过程可能是正确对齐位图以进行比较。当将一个movieclip绘制到一个BitmapData时,如果我们addChild()相应的Bitmap,我们可以看到它的一部分是不可见的。它似乎只是从中心向右和向下绘制,使顶部和左侧部分远离绘制。解决方案是在draw方法的第二个参数中给出一个变换矩阵,该变量矩阵对齐位图并使其全部被绘制。

这是我的类中一个函数的示例,用于创建用于比较的位图:

    static public function createAlignedBitmap(mc: MovieClip, mc_rect: Rectangle): BitmapData{
                var mc_offset: Matrix;
                var mc_bmd: BitmapData;

                mc_offset = mc.transform.matrix;
                mc_offset.tx = mc.x - mc_rect.x;
                mc_offset.ty = mc.y - mc_rect.y;
                mc_bmd = new BitmapData(mc_rect.width, mc_rect.height, true, 0);
                mc_bmd.draw(mc, mc_offset);

                return mc_bmd;
}

为了使用它,如果你在时间轴上,你可以:

className.createAlignedBitmap(myMovieClip, myMovieClip.getBounds(this))

请注意使用getBounds返回嵌入了影片剪辑的矩形。这允许计算偏移矩阵。

此方法与此处显示的http://www.mikechambers.com/blog/2009/06/24/using-bitmapdata-hittest-for-collision-detection/

非常相似

顺便说一下,如果这对你来说很有意思,请查看我稍后会发布的其他问题。