AS3如何使用相同实例名称的多个影片剪辑来测试?

时间:2018-03-14 01:19:08

标签: actionscript-3 flash flash-cs6 flashdevelop

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

我知道我必须将它们添加到数组中并使用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数组private var aTacoArray:Array;实例化,但我不知道如何将platforms.mcTaco影片剪辑推入其中以使用for循环来测试它。任何有关如何做到这一点的帮助将不胜感激。我只是不想做if (player.hitTestObject(platforms.mcTaco1) || player.hitTestObject(platforms.mcTaco2) etc...)

2 个答案:

答案 0 :(得分:1)

您需要在每个平台内循环子项以按类或/和名称获取所有炸玉米饼。

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");
            }
        }
    }
}

一些注释。

首先,调用类 mcTaco 并提供相同的实例名称 mcTaco 会让人头疼,因为有些时候您的代码无法确定,如果您引用的话一类声明的实例。

其次,用大写的头字母打电话给你的课,因为它很好。一个不错的苏格兰 McTaco 就足够了。

答案 1 :(得分:0)

您可以像使用平台一样将炸玉米饼推送到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");
        }
    }
}