如何在影片剪辑中获取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 影片剪辑?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 as3 同时访问所有影片剪辑(以及影片剪辑中的影片剪辑......)?