AS3 如何对具有相同实例名称的多个影片剪辑进行 hitTest?

AS3 How to hitTest with multiple Movie Clips of the same Instance Name?

大家好,我的 platforms 电影剪辑中有一个名为 mcTaco 的电影剪辑,所以 platforms.mcTaco。我使用代码将我检查 hitTest 碰撞的 platformsplayer 添加到舞台上。当我检查 playerplatforms.mcTaco collison 时,一切正常。当我复制 mcTacoplatforms 电影片段中创建它们的多个实例时,我遇到了主要问题。

我知道我必须将它们添加到数组并使用 for 循环来检查多个 platforms.mcTaco 实例的 hitTest,但我不知道如何完成此操作。我正在为我的代码使用 IDE Flash Develop,这是我目前所拥有的:

我像这样将我的平台添加到舞台上:

//ADD PLATFORMS AND ENVIRONMENT
    private function addPlatForms():void
    {
        //Add Obstacle Platforms
        platforms = new mcPlatforms();
        platforms.x = (stage.stageWidth / 2) - 80;
        platforms.y = (stage.stageHeight / 2) + 165;
        addChildAt(platforms, 1);
        aPlatformArray.push(platforms);
        //trace(aPlatformArray.length + " NPLATFORMS");
    }

我的播放器:

//Add Character
        player = new mcPlayer();
        player.x = (stage.stageWidth / 2) - 80;
        player.y = (stage.stageHeight / 2) + 78;
        addChildAt(player, 1);

在我的 ENTER_FRAME 事件监听器中,我这样做是为了测试 playerplatforms.mcTaco hitTest,就像这样:

private function tacoHitTestHandler():void 
    {
        if (player.hitTestObject(platforms.mcTaco))
        {
            platforms.mcTaco.visible = false;
            trace("HIT TACO");
        }
    }

我只是需要一些帮助来弄清楚如何去做这件事。我实例化了我的 Taco Arrayprivate var aTacoArray:Array;,但我不知道如何将 platforms.mcTaco 影片剪辑推入其中以使用 for 循环对其进行测试。任何有关如何执行此操作的帮助将不胜感激。我只是不想做 if (player.hitTestObject(platforms.mcTaco1) || player.hitTestObject(platforms.mcTaco2) etc...)

您需要在每个平台内循环子项,以通过他们的 class or/and 名称获取所有炸玉米饼。

private function tacoHitTestHandler():void 
{
    // Loop through the list of the platforms.
    for (var i:int = 0; i < aPlatformArray.length; i++)
    {
        // Get a platform instance from the Array.
        var aPlatform:mcPlatforms = aPlatformArray[i];

        // Loop through the children of a platform.
        for (var j:int = 0; j < aPlatform.numChildren; j++)
        {
            // Get a potential taco.
            var aTaco:mcTaco = aPlatform.getChildAt(j) as mcTaco;

            // Skip if it is not a taco.
            if (!aTaco) continue;

            // Ignore invisible objects.
            if (!aTaco.visible) continue;

            // Ignore wrong tacos by name.
            if (aTaco.name != "mcTaco") continue;

            // Hit test against taco.
            if (player.hitTestObject(aTaco))
            {
                aTaco.visible = false;
                trace("HIT TACO");
            }
        }
    }
}

一些注意事项。

首先,调用 class mcTaco 并给出相同的实例名称 mcTaco 令人头疼,因为有时如果您引用的是已声明实例的 class,那么您的代码将无法确定。

其次,用大写首字母称呼您的 classes,因为这样很好。一个不错的苏格兰 McTaco 就足够了。

您将 taco 推送到 aTacoArray 的方式与您在平台上执行的方式相同:

aTacoArray.push(myTacoMC);

然后你可以遍历它们并测试每个碰撞:

private function tacoHitTestHandler():void 
{
    for(var i:int = 0; i < aTacoArray.length; i++)
    {
        // get taco from array
        var currentTaco:MovieClip = aTacoArray[i];

        if (player.hitTestObject(currentTaco))
        {
            currentTaco.visible = false;
            trace("HIT TACO");
        }
    }
}