如何在 AS3 中让 MovieClip 自行移除?

Posted

技术标签:

【中文标题】如何在 AS3 中让 MovieClip 自行移除?【英文标题】:How to make a MovieClip remove itself in AS3? 【发布时间】:2011-03-12 04:59:45 【问题描述】:

AS3 中的removeMovieClip() 等价于什么?

显然很多人都有同样的问题: 堆栈溢出:

    How to completely remove a movieclip in as3 Remove movie clip as3 How to remove childmovieclip and add to new parent movieclip

其他:

    removeMovieClip(this) in AS3? Destroy/Delete a Movieclip??? Remove movie clip

但对我来说,他们的解决方案似乎都不起作用:

我正在使用 AS3 开发 flash CS4

我有一个非常简单的电影,只有一个名为 click 的按钮。按下按钮后,会创建一个新的 coin 实例:

this.click.addEventListener(MouseEvent.CLICK,justclick);
function justclick(e:MouseEvent)
    var money=new coin
    this.addChild(money)
    money.x=e.stageX
    money.y=e.stageY

它可能不是最好的代码,但它工作正常。现在,硬币 MovieClip 应该显示一个小动画并自行移除。在好的旧 AS2 中,我会添加:

this.removeMovieClip()

在动画的最后一帧。但这在 AS3 中不存在。 我试过了,没有成功:

this.parent.removeChild(this) // 'Cannot access a property or method of nullobject reference'...     

this.removeMovieClip() // 'removeMovieClip is not a function'      

removeMovieClip(this) //'call to possibly undefined method removeMovieClip'       

unloadMovie(this)//'call to possibly undefined method removeMovieClip'       

解决方案?

谢谢,

【问题讨论】:

【参考方案1】:
this.parent.removeChild(this);

这个应该可以工作;这是我用的。我在切换到 AS3 时遇到的一个问题是,有时它不会被添加为子权限,因此您可能需要检查一下。如果您还没有,您还必须通过将它放在顶部来导入 flash.display:

import flash.display.*

你还应该在移除它之前移除它上面的事件监听器。

【讨论】:

谢谢,这是关于事件监听器的。现在它完美地工作了。顺便说一句,“import flash.display.*”是为了什么? 它可以让你使用 flash 自带的 display 包中的类中的函数。顺便说一句,如果有人解决了您的问题,您应该接受该答案。 ;)【参考方案2】:

如果您的动画在第 20 帧结束。

注意:使用 19 是因为闪存从零 (0) 开始计数帧,类似于数组索引。

class animatedCloud


    public function animatedCloud()
        addFrameScript(19, frame20);
    

    private function frame20()
        parent.removeChild(this);
    

【讨论】:

【参考方案3】:

始终确保那些自动删除的影片剪辑可以被垃圾收集。 此解决方案从已加载的 swf 库符号中删除了我的所有实例:

var mc:MovieClip = new definition() as MovieClip;
addChild(mc);

mc.x = 1000 * Math.random();
mc.y = 1000 * Math.random();

mc.addFrameScript(mc.totalFrames - 1, function onLastFrame():void

    mc.stop();
    mc.parent.removeChild(mc);
    mc = null;
);

【讨论】:

【参考方案4】:
public static function removeDisplayObject(displayObject:DisplayObject):void 
    /* normal code
    if(displayObject && displayObject.parent)
        displayObject.parent.removeChild(displayObject);
    
     */
    displayObject ? displayObject.parent ? displayObject.parent.removeChild(displayObject) : null : null;

【讨论】:

【参考方案5】:

我在 MovieClip 末尾的一个额外的空白关键帧中使用它应该自行删除:

stop();
MovieClip(parent).removeChild(this);

发现它是正确和最佳的解决方案。

【讨论】:

以上是关于如何在 AS3 中让 MovieClip 自行移除?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用movieclip作为AS3中另一个可拖动对象的边界?

AS3 将图像添加到扩展 MovieClip 的类

我如何使用Movieclip名称数组控制as3中的这些剪辑?

在 DisplayObjectContainer 中识别 AS3 中的 MovieClip

AS3 MovieClip 无法持续​​播放

Flash 横幅中的 AS3 视差效果阻止 Movieclip 按钮运行