Actionscript 3.0 Flash中Sprite的碰撞检测

时间:2012-04-13 12:23:19

标签: actionscript-3 flash collision-detection

我正在AS3.0中制作一款类似于非常类似于kurve的游戏。到目前为止,我已经完成了4个不同玩家的动作,并且工作正常。

我现在要进行碰撞检测,以便测试一个'蠕虫' - 可以说是否与彼此或它自己的尾巴碰撞。

据我了解,如果我使用hitTestObject();它将使用整个对象的注册区域,这将是一个巨大的问题,因为这个注册进行了包含所有对象的4面注册。因此,如果使用它,它只会通过输入这个矩形而不是击中实际的蠕虫来“碰撞”。这是否正确理解?

我一直在寻找不同的碰撞检测方法,似乎无法找到适合我项目的最佳方法。

我的想法是检查'蠕虫'是否在白色背景上绘制他们的新精灵。如果他们不是,那它肯定会有所作为。

您可以在此处查看我如何使用我的代码:code in .as format linked to an .fla file

对不起我的问题,希望它有点道理。 任何帮助是极大的赞赏!!

最好的问候 - Jesper

3 个答案:

答案 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检测系统我在官方网站上找到了这个,这使我能够在像素级别上对位图进行碰撞检测。

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7d55.html

希望它以同样的方式帮助你。

答案 2 :(得分:0)

观看该游戏的截图,我认为最好的模型是将每个蠕虫描述为一个圆圈链。然后将网格中的世界/水平分开,单元格大于圆弧半径。

碰撞检查将是:

  1. clear grid
  2. 将每个圆圈放入它所在的一个或多个网格单元格中
  3. 遍历所有单元格,对于每个单元格:
    • 对于此单元格中的每对圆(部分),检查它们是否相交。如果他们这样做;碰撞。 请注意,这可能会导致A和B圈之间发生多次碰撞,因此您还需要检查以避免重复。
  4. 步骤1和2可以通过不清除网格来优化,而不是步骤2,在移动后更新每个圆圈的单元格。如果您将单元格的大小调整为圆的大小的5倍,则圆圈可以保留在同一单元格中几帧,从而避免过多的添加/删除操作。

    我现在在我的一个项目中做类似的事情,除了太空船!我的网格单元目前是256x256(我觉得你的项目太大了)我的单位半径约为20。