【问题标题】:Collision Detection of Sprites in Actionscript 3.0 FlashActionscript 3.0 Flash中精灵的碰撞检测
【发布时间】:2012-04-13 12:23:19
【问题描述】:

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

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

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

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

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

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

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

最好的问候 - 杰斯珀

【问题讨论】:

标签: actionscript-3 flash collision-detection


【解决方案1】:

如果您想要一个具有高效 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 参考。

【讨论】:

  • 这个功能太好了,但我觉得有问题。当我设置不同的分辨率时,它根本不起作用......
  • 这正是我所需要的。谢谢!
【解决方案2】:

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

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

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

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

【讨论】:

  • 感谢您的回答。我一整天都在尝试这个,但似乎仍然找不到任何解决方案。我相信我必须使用位图碰撞检测,但我不知道如何。希望明天我能用新的眼光解决它。 ://
【解决方案3】:

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

碰撞检查将是:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-05-04
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多