在具有居中注册点的两个bitmapData上使用bitmapData.hitTest

时间:2012-03-05 18:19:53

标签: actionscript-3 flash bitmapdata

我已经花了一整天时间,是时候请求你的帮助了:)

我正在尝试对两个显示对象进行碰撞检测,两者都有居中的注册点。

在我的舞台上,我有固定的元素,当添加到舞台时被推入名为“zoneUsed”的数组中。我项目中的所有displayObject都在中心有注册点。

我的目标是点击舞台,检查点击坐标是否可以创建一个圆圈。我的计划是为新对象创建一个Sprite,在zoneUsed数组上循环,并检查新精灵是否有足够的空间来生存。

到目前为止我的代码:

 private function checkSpaceForNewMarker (markerToCheck:Sprite):Boolean {
        var isPossible:Boolean = true;
        var bmdataToCheck:BitmapData = new BitmapData (markerToCheck.width, markerToCheck.height, true, 0);
        var m:Matrix = new Matrix ();
        m.tx = markerToCheck.width/2;
        m.ty = markerToCheck.height/2;
        bmdataToCheck.draw (markerToCheck, m);

        for (var i:int = 0; i<zoneUsed.length; i++) {
            trace ("*** CHECKING ****");
            var bmddataOnTheTable:BitmapData = new BitmapData (zoneUsed[i].width, zoneUsed[i].height, true, 0);

            var tableMatrix:Matrix = new Matrix ();
            tableMatrix.tx = zoneUsed[i].width/2;
            tableMatrix.ty = zoneUsed[i].height/2;
            bmddataOnTheTable.draw(zoneUsed[i], tableMatrix);


            if (bmdataToCheck.hitTest(new Point(markerToCheck.x, markerToCheck.y), 255, bmddataOnTheTable, new Point (zoneUsed[i].x, zoneUsed[i].y), 255)) {
                trace ("COLLISION");
                                    isPossible = false;
            } else {
                trace ("NO COLLISION");
                                    isPossible = true;
            }
        }


        return isPossible;
    }

....但是现在结果很奇怪。根据区域,我的痕迹是否有效。我做错了什么?

2 个答案:

答案 0 :(得分:1)

问题是,你正在绘制每个对象的1/4(四分之一)部分。 BitmapData与Shape, Sprite, MovieClip不同,当绘图边界超出(0,0,bitmapdata.width,bitmapdata.height)矩形的边界时,它会裁剪所有像素。 只需删除这一行:

 m.tx = markerToCheck.width/2;
 m.ty = markerToCheck.height/2;

以及

 tableMatrix.tx = zoneUsed[i].width/2;
 tableMatrix.ty = zoneUsed[i].height/2;

您不需要这种翻译。

此外,您的代码可能导致内存泄漏。您正在创建bitmapdata,但不要处置它。垃圾收集器不会释放您已分配的内存。您必须明确释放内存。每当您不需要bitmapdata.dispose()时,请致电bitmapdata

答案 1 :(得分:0)

我不确定位图的来源与测试本身有什么关系。测试的本质似乎暗示最热门测试是基于两个提供的位图的RGBA值。无论如何,而不是分开你自己的实现,我只会向你推荐Mike Chambers(adobe平台传道者)的教程。 http://www.mikechambers.com/blog/2009/06/24/using-bitmapdata-hittest-for-collision-detection/

另外,对于更多Flash教程,请查看www.gotoandlearn.com