如何在影片剪辑中获取ChildAt 影片剪辑?

Posted

技术标签:

【中文标题】如何在影片剪辑中获取ChildAt 影片剪辑?【英文标题】:How to getChildAt a movie clip inside a movieclip? 【发布时间】:2017-08-23 22:00:12 【问题描述】:

我在带有“bgdemo”实例的影片剪辑内有一个名为“trainglePoint”的影片剪辑链接,我想知道如何让“trianglePoint”工作。

“gags”也是获得“trianglePoint”的角色

这是我下面的代码,它不起作用。

谢谢!

编辑:忘了补充说“trianglePoint”被多次放到舞台上(不知道这是否有帮助)

var pickUpsArray:Array = new Array();

stage.addEventListener (Event.ENTER_FRAME, pickUpItems);

public function pickUpItems (e:Event)
    
            for (var i=0; i<numChildren;i++)
    
        if (getChildAt(i) is bgdemo.trianglePoint)
        
            pickUpsArray.push(getChildAt(i));
        
    

        for (var j=0; j<pickUpsArray.length;j++)
        
            if (gags.hitTestObject (pickUpsArray[j]))
            
                removeChild(pickUpsArray[j]);
                trace ("hitTestObject: YES");
            
        
    

【问题讨论】:

你为什么不能只做gags.hitTestObject(bgdemo.trianglePoint)?为什么要先将其推入数组? 因为trianglePoint被多次放入bgdemo(想象它像马里奥游戏中的硬币) 好的,问题出在哪里?你有任何错误吗?尝试使用日志语句进行调试? trianglePoint 是特定的 Object 类还是只是一般的 MovieClip? 你的意思是如果你去trianglePoint符号属性。你已经检查了export for ActionScript,并且在Class: 你有什么“trianglePoint”?你应该检查它像getChildAt(i) is trianglePoint.type trace("bgdemo.trianglePoint") 【参考方案1】:

您应该改用 GetChildByName(name)。 GetChildAt 意味着您知道您想要的子层在子层中的位置。 因此,如果您的孩子被命名为“trianglePoint”并且您想访问它,只需使用 getChildByName("trianglePoint");

您的其余代码存在几个问题。 首先,你推入一个数组,但从不从中删除。使用 removechild 不会从数组中删除对象,这意味着您将始终测试它是否与“gags”发生冲突。

另一个问题是您将对象添加到每一帧的数组中。相反,您应该做的是从 GetChildByName 获取您的对象,将其推入数组 THEN 循环并与之交互。

我会这样做:

import flash.display.MovieClip

public class bgdemo extends MovieClip

var pickUpsArray:Array

public function bgdemo()//constructor for your parent movieclip

   pickUpsArray = new Array();

  this.addEventListener (Event.ADDED_TO_STAGE, init_ok);
  //this is to ensure the parent movieclip (bgdemo) is on the stage and we can access its children.


private function init_ok(e:Event):void

  this.removeEventListener(Event.ADDED_TO_STAGE, init_ok);
  //removing the listener so that we only do this once
  pickUpsArray.push(this.getChildByName("trianglePoint"));
  stage.addEventListener (Event.ENTER_FRAME, pickUpItems);


private function pickUpItems (e:Event):void

    for (var j=0; j<pickUpsArray.length;j++)
    
        if (gags.hitTestObject (pickUpsArray[j]))
        
            removeChild(pickUpsArray[j]);
            pickUpsArray.splice(j, 1); //removing the object from the array so we can't collide with it anymore
            trace ("hitTestObject: YES");
        
    



您在 bgdemo 影片剪辑的构造函数中创建一个新数组,并为影片剪辑添加到舞台这一事实添加一个侦听器。将movieclip添加到舞台后,(删除“添加到舞台监听器”),获取您的孩子,将其添加到数组并添加监听器以进入帧。 然后在每一帧上测试数组中的每个对象(此时只有 1 个)和“堵嘴”。如果 gags 和对象发生碰撞,则从显示列表和数组中删除对象。

尝试一下并告诉我它是否有效(您希望它的工作方式)。如果这不是您想要的,那么请在您的原始帖子上更加准确;)

【讨论】:

以上是关于如何在影片剪辑中获取ChildAt 影片剪辑?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CreateJs 中获取影片剪辑的宽度/高度?

如何使用 as3 同时访问所有影片剪辑(以及影片剪辑中的影片剪辑......)?

如何从另一个影片剪辑中访问影片剪辑中的帧

用flash as3语言如何将影片剪辑存入一个数组以及如何访问?

如果仅单击五个影片剪辑(不是更多),如何使影片剪辑可见

如何在 Flash html5 画布中更改影片剪辑的宽度?