我已经花了一整天时间,是时候请求你的帮助了:)
我正在尝试对两个显示对象进行碰撞检测,两者都有居中的注册点。
在我的舞台上,我有固定的元素,当添加到舞台时被推入名为“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;
}
....但是现在结果很奇怪。根据区域,我的痕迹是否有效。我做错了什么?
答案 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。