代码之家  ›  专栏  ›  技术社区  ›  Nathan

AS3如何使用相同实例名称的多个电影剪辑进行hitTest?

  •  0
  • Nathan  · 技术社区  · 7 年前

    嘿,大家好,所以我有一个电影剪辑在我的 platforms 电影剪辑已调用 mcTaco 所以 platforms.mcTaco 。我添加 平台 以及 player 我使用代码动态地检查是否存在与阶段的hitTest冲突。当我检查 游戏者 平台。麦克塔科 科利森一切正常。当我复制 麦克塔科 在中创建多个实例 平台 movieclip说我有主要问题。

    我知道我必须将它们添加到一个数组中,并使用for循环检查多个 平台。麦克塔科 但我不知道如何做到这一点。我正在为我的代码使用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\u FRAME事件侦听器中,我这样做是为了测试 游戏者 平台。麦克塔科 像这样的hitTest:

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

    我只是需要一些帮助来弄清楚怎么做。我有我的玉米卷阵列 private var aTacoArray:Array; 实例化,但我不知道如何推动 平台。麦克塔科 将电影剪辑到其中,以使用for循环对其进行测试。如果您能提供帮助,我们将不胜感激。我只是不想 if (player.hitTestObject(platforms.mcTaco1) || player.hitTestObject(platforms.mcTaco2) etc...)

    2 回复  |  直到 7 年前
        1
  •  1
  •   Organis    7 年前

    您需要在每个平台中循环子对象,以按其类或/和名称获取所有玉米饼。

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

    一些注释。

    首先,调用类 麦克塔科 并提供相同的实例名称 麦克塔科 是令人头痛的问题,因为如果您引用的是一个已声明实例的类,代码有时会不确定。

    第二,用大写字母给你的班级打电话,因为这样很好。一个好的苏格兰人 麦克塔科 就足够了。

        2
  •  0
  •   Philarmon    7 年前

    您将玉米饼推到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");
            }
        }
    }