从具有多个帧的影片剪辑中删除 child?
Remove child from a movie clip with several frames?
我有一个名为 MC 的影片剪辑,它有两层。第二层有 5 帧,第一层只有一个影片剪辑 item
从第 1 帧到第 5 帧。
然后,在我的代码中,我创建了一个名为 soulItem
的新 MovieClip
,并将 item
添加到 soulItem
,然后添加 soulItem
进入 MC
。然后,item
从他的 parent (MC
) 中删除。
然后,当 MC
转到第 2 帧时发生了一些错误。有一个新的 item
实例,它的 parent 是 MC
,并且不等于soulItem
中的 item
。屏幕上都有显示,numChildren
加1.
代码如下:
public function FiveElementBall(MC:MovieClip) {
var soulItem:MovieClip = new MovieClip();
var item:MovieClip = MC.getChildByName('item') as MovieClip;
MC.addChild(soulItem);
}
private function update():void {
MC.gotoAndStop(2);
}
我按如下方式解决了这个问题:
private function update():void {
if(MC.getChildByName('item') != null) {
dispose(soulItem);
var soulItem:MovieClip = new MovieClip();
var item:MovieClip = MC.getChildByName('item') as MovieClip;
soulItem.addChild(item);//Then, item was removed from MC's Children.
MC.addChild(soulItem);
}
MC.gotoAndStop(2);
}
当新的项目实例出现时(当框架改变时),我再次处理并初始化soulItem
。那么就对了。
但我想知道我的猜测是否正确,为什么会这样?
当它是 MC
的 child 时,我可以解决从 MC
中删除 item
,因为 soulItem
是正确的,唯一错误是出现a new instance of item
。(在一帧中,它的parent为null,也没有soulItem
或MC
,在另一帧中,它的parent为MC
).
But I want to know is my guess right and why it is?
关键帧的位置很重要。当播放头移动到放置实例的关键帧时,如果实例不存在,它将创建一个新实例。
例如,假设您在 MC
中的关键帧如下所示:
在这种情况下,item
在第 1 帧上有一个关键帧,它跨越 5 帧。这不会导致您描述的行为:您可以重新设置父级 item
并转到第 2 帧,并且将 不 创建一个新的 item
实例。
但是,如果您随后返回到第 1 帧(例如 gotoAndStop(1)
或 prevFrame()
),播放器会击中放置 item
instance 和 will 创建一个新的实例,就像你描述的那样,如果在那里找不到实例。
将关键帧视为对玩家期望在该帧存在的内容的描述。您可以更改 between 关键帧,但是当播放器到达关键帧时,它会重新评估显示是否具有该关键帧所描述的一切,如果没有,则使其如此。无法通过代码更改关键帧。您能做的最好的事情就是避免将播放头移动到放置您打算修改的实例的关键帧;例如永远不要回到第 1 帧。
出于这个原因,如果您有多个帧,那么用代码移动时间轴实例通常不是一个好主意。最好全部通过代码或全部通过关键帧来完成。
例如,不是在时间轴中有一个 item
实例,而是导出符号(例如 Item
)并通过代码创建它:
public function FiveElementBall(MC:MovieClip) {
var soulItem:MovieClip = new MovieClip();
var item:Item = new Item();
soulItem.addChild(item);
MC.addChild(soulItem);
}
我有一个名为 MC 的影片剪辑,它有两层。第二层有 5 帧,第一层只有一个影片剪辑 item
从第 1 帧到第 5 帧。
然后,在我的代码中,我创建了一个名为 soulItem
的新 MovieClip
,并将 item
添加到 soulItem
,然后添加 soulItem
进入 MC
。然后,item
从他的 parent (MC
) 中删除。
然后,当 MC
转到第 2 帧时发生了一些错误。有一个新的 item
实例,它的 parent 是 MC
,并且不等于soulItem
中的 item
。屏幕上都有显示,numChildren
加1.
代码如下:
public function FiveElementBall(MC:MovieClip) {
var soulItem:MovieClip = new MovieClip();
var item:MovieClip = MC.getChildByName('item') as MovieClip;
MC.addChild(soulItem);
}
private function update():void {
MC.gotoAndStop(2);
}
我按如下方式解决了这个问题:
private function update():void {
if(MC.getChildByName('item') != null) {
dispose(soulItem);
var soulItem:MovieClip = new MovieClip();
var item:MovieClip = MC.getChildByName('item') as MovieClip;
soulItem.addChild(item);//Then, item was removed from MC's Children.
MC.addChild(soulItem);
}
MC.gotoAndStop(2);
}
当新的项目实例出现时(当框架改变时),我再次处理并初始化soulItem
。那么就对了。
但我想知道我的猜测是否正确,为什么会这样?
当它是 MC
的 child 时,我可以解决从 MC
中删除 item
,因为 soulItem
是正确的,唯一错误是出现a new instance of item
。(在一帧中,它的parent为null,也没有soulItem
或MC
,在另一帧中,它的parent为MC
).
But I want to know is my guess right and why it is?
关键帧的位置很重要。当播放头移动到放置实例的关键帧时,如果实例不存在,它将创建一个新实例。
例如,假设您在 MC
中的关键帧如下所示:
在这种情况下,item
在第 1 帧上有一个关键帧,它跨越 5 帧。这不会导致您描述的行为:您可以重新设置父级 item
并转到第 2 帧,并且将 不 创建一个新的 item
实例。
但是,如果您随后返回到第 1 帧(例如 gotoAndStop(1)
或 prevFrame()
),播放器会击中放置 item
instance 和 will 创建一个新的实例,就像你描述的那样,如果在那里找不到实例。
将关键帧视为对玩家期望在该帧存在的内容的描述。您可以更改 between 关键帧,但是当播放器到达关键帧时,它会重新评估显示是否具有该关键帧所描述的一切,如果没有,则使其如此。无法通过代码更改关键帧。您能做的最好的事情就是避免将播放头移动到放置您打算修改的实例的关键帧;例如永远不要回到第 1 帧。
出于这个原因,如果您有多个帧,那么用代码移动时间轴实例通常不是一个好主意。最好全部通过代码或全部通过关键帧来完成。
例如,不是在时间轴中有一个 item
实例,而是导出符号(例如 Item
)并通过代码创建它:
public function FiveElementBall(MC:MovieClip) {
var soulItem:MovieClip = new MovieClip();
var item:Item = new Item();
soulItem.addChild(item);
MC.addChild(soulItem);
}