1

我正在 AS3.0 中制作类似 achtung die kurve 的游戏。到目前为止,我已经完成了 4 个不同玩家的动作,并且效果很好。

我现在要进行碰撞检测,以测试“蠕虫”是否正在与彼此或自己的尾巴发生碰撞。

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

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

我的想法是检查“蠕虫”是否在白色背景上绘制它们的新精灵。如果不是,那么它一定是撞到了什么东西。

你可以在这里看到我是如何使用我的代码的:code in .as format linked to an .fla file

抱歉我的问题表述不当,希望它有点道理。任何帮助是极大的赞赏!!

最好的问候 - 杰斯珀

4

3 回答 3

5

如果您想要一个具有高效 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结果形状的形状。非常酷。

要了解有关Pixel Perfect Collision Detection的更多信息,您可以在 Google Collision Detection后面加上以下名称之一:“ The ActionScript Man ”、“ Troy Gilbert ”、“ Boulevart (wim) ”、“ Grant Skinner (gSkinner) ”或“ Senocular ”。顺便说一句,这些家伙是很棒的 AS3 参考。

于 2012-04-14T03:56:26.950 回答
0

您描述的问题是碰撞检测的一个非常常见的问题,因为对象具有设定的宽度和高度,因此将矩形定义为对象。

但是有一个解决方案可以在像素级别上制作碰撞检测系统,我在官方网站上找到了这个,这使我能够在像素级别上对位图进行碰撞检测。

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

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

于 2012-04-13T12:34:00.707 回答
0

看看那场比赛的截图,我认为最好的模型是将每条蠕虫描述为一圈圈。然后用比圆半径稍大的单元格将世界/关卡划分为网格。

碰撞检查将是:

  1. 清除网格
  2. 将每个圆圈放入它所在的 1 个或多个网格单元中
  3. 迭代所有单元格,对于每个单元格:
    • 对于此单元格中的每一对圆(部分),检查它们是否相交。如果他们这样做;碰撞。请注意,这可能会导致圆 A 和 B 之间发生超过 1 次碰撞,因此您还需要检查以避免重复。

第 1 步和第 2 步可以通过不清除网格来优化,而不是第 2 步,在每个圆移动后更新每个圆的单元格。如果您将单元格的大小调整为圆圈大小的 5 倍,则一个圆圈可以在同一个单元格中停留几帧,从而避免过多的添加/删除操作。

我现在正在我的一个项目中做类似的事情,除了太空船!我的网格单元目前是 256x256(我认为对于您的项目来说太大了),我的单元的半径约为 20。

于 2012-04-14T04:49:41.443 回答