1

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

我读过有关 BitMap 和 BitMapData 的信息。我应该能够将 MovieClips 绘制到 BitMap 上,这样我就可以循环像素以查找碰撞。但是,处理偏移量很奇怪和令人困惑。它看起来像 MyBitMap.rect 总是 x = 0 和 y = 0 ......我无法找到东西的原始位置......

我正在考虑先做一个hitTestObject,然后如果这是肯定的,我会调查movieclips矩形之间的交叉点以进行像素碰撞。但是还有另一个问题(电影剪辑的旋转)......

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

4

4 回答 4

1

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

您必须从全局坐标更改为本地 BitmapData 坐标,如果旋转则需要一些数学运算。这很容易实现(在 wiki 上查找仿射变换以获取更多信息):

var coordTransform:Matrix = new Matrix();

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

coordTransform.transformPoint(/* your point */);
于 2010-07-07T17:26:39.973 回答
1

闪光中像素完美碰撞检测的经典参考是这篇Grant Skinner 的文章。它是 AS2,但 AS3 的逻辑是相同的(如果你用谷歌搜索一下,就有可用的端口)。

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

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

于 2010-07-08T02:49:20.637 回答
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

于 2010-07-08T23:49:25.923 回答
0

毕竟我设法做到了,而且我已经为碰撞检测、/碰撞角度和其他附加内容编写了我的课程。

最令人困惑的过程可能是正确对齐位图以进行比较。当将一个movieclip draw() 转换成一个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/

顺便说一句,如果这对您来说很有趣,请查看我稍后会发布的另一个问题。

于 2010-07-15T22:07:04.827 回答