我正在AS3.0中制作一款类似于非常类似于kurve的游戏。到目前为止,我已经完成了4个不同玩家的动作,并且工作正常。
我现在要进行碰撞检测,以便测试一个'蠕虫' - 可以说是否与彼此或它自己的尾巴碰撞。
据我了解,如果我使用hitTestObject();它将使用整个对象的注册区域,这将是一个巨大的问题,因为这个注册进行了包含所有对象的4面注册。因此,如果使用它,它只会通过输入这个矩形而不是击中实际的蠕虫来“碰撞”。这是否正确理解?
我一直在寻找不同的碰撞检测方法,似乎无法找到适合我项目的最佳方法。
我的想法是检查'蠕虫'是否在白色背景上绘制他们的新精灵。如果他们不是,那它肯定会有所作为。
您可以在此处查看我如何使用我的代码:code in .as format linked to an .fla file
对不起我的问题,希望它有点道理。 任何帮助是极大的赞赏!!
最好的问候 - Jesper
答案 0 :(得分:5)
如果您希望 Pixel Perfect Collision Detection 具有高效的CPU使用率,请尝试此功能:
trace("Collided: " + (areaOfCollision(mc1, mc2) != null));
trace("Where: " + areaOfCollision(mc1, mc2));
function areaOfCollision(object1:DisplayObject, object2:DisplayObject, tolerance:int = 255):Rectangle {
if (object1.hitTestObject(object2)) {
var limits1:Rectangle = object1.getBounds(object1.parent);
var limits2:Rectangle = object2.getBounds(object2.parent);
var limits:Rectangle = limits1.intersection(limits2);
limits.x = Math.floor(limits.x);
limits.y = Math.floor(limits.y);
limits.width = Math.ceil(limits.width);
limits.height = Math.ceil(limits.height);
if (limits.width < 1 || limits.height < 1) return null;
var image:BitmapData = new BitmapData(limits.width, limits.height, false);
var matrix:Matrix = object1.transform.concatenatedMatrix;
matrix.translate(-limits.left, -limits.top);
image.draw(object1, matrix, new ColorTransform(1, 1, 1, 1, 255, -255, -255, tolerance));
matrix = object2.transform.concatenatedMatrix;
matrix.translate(-limits.left, -limits.top);
image.draw(object2, matrix, new ColorTransform(1, 1, 1, 1, 255, 255, 255, tolerance), BlendMode.DIFFERENCE);
var intersection:Rectangle = image.getColorBoundsRect(0xFFFFFFFF, 0xFF00FFFF);
if (intersection.width == 0) return null;
intersection.offset(limits.left, limits.top);
return intersection;
}
return null;
}
成功完成初步hitTestObject()
后,此功能在背景上从每个涂有不同颜色的两个对象的形状拍摄快照,然后将它们覆盖在新颜色上的颜色相交,返回Rectangle
的由此产生的形状。太酷了。
要了解有关像素完美碰撞检测的更多信息,您可以谷歌碰撞检测,然后是其中一个名称:“ The ActionScript Man ”, “ Troy Gilbert ”,“ Boulevart(wim)”,“ Grant Skinner(gSkinner)”或“ Senocular ”。顺便说一句,这些家伙是很棒的AS3参考。
答案 1 :(得分:0)
您描述的问题是碰撞检测的一个非常常见的问题,因为对象具有设置的宽度和高度,因此将矩形定义为对象。
有一个解决方案是在像素级别制作一个colission检测系统我在官方网站上找到了这个,这使我能够在像素级别上对位图进行碰撞检测。
希望它以同样的方式帮助你。
答案 2 :(得分:0)
观看该游戏的截图,我认为最好的模型是将每个蠕虫描述为一个圆圈链。然后将网格中的世界/水平分开,单元格大于圆弧半径。
碰撞检查将是:
步骤1和2可以通过不清除网格来优化,而不是步骤2,在移动后更新每个圆圈的单元格。如果您将单元格的大小调整为圆的大小的5倍,则圆圈可以保留在同一单元格中几帧,从而避免过多的添加/删除操作。
我现在在我的一个项目中做类似的事情,除了太空船!我的网格单元目前是256x256(我觉得你的项目太大了)我的单位半径约为20。