卸载MovieClip和RemoveChild AS3

时间:2014-12-05 16:56:38

标签: actionscript-3 movieclip removechild

我开发了一个代码,用于加载影片剪辑,与两个动态文本进行比较。

如果动态文本大于另一个,它将在特定的影片剪辑中休息。我正在尝试开发一种比较数字的光标系统。

动作脚本从.txt文件导入数据(使用EXCEL和VBA导出)。我创建了一个代码来使用计时器重新加载所有数据。我创建它,所以没有必要重新打开.swf文件。

以下是自动重新加载代码:

// timer loading 
var timer:Timer = new Timer(2500);
timer.addEventListener(TimerEvent.TIMER, onTimer);
timer.start();

现在,代码正在应用于所有操作,包括重新下载.txt文件的操作,这里是:

function onTimer(evt:TimerEvent):void { //primeiro indicador parte
    var loader:URLLoader = new URLLoader(new URLRequest("bdaily.txt"));
    loader.addEventListener(Event.COMPLETE, completeHandler);

function completeHandler(event:Event):void { 
    var loadedText:URLLoader = URLLoader(event.target); bdaily.text = loadedText.data; 
}

现在,此代码正在比较.txt(动态文本)并加载或不加载新的影片剪辑。

var clp_index = parseInt(bdaily.text) >= parseInt(basketdtarget.text) ? 1 : 2
var new_clp = clp_index == 1 ? new clp_01() : new clp_02()
addChild(new_clp)

问题是:

- >一切正常,所有数据都被加载并显示在动态文本中。

真实的是,由于设置了循环定时器,所有影片剪辑都在无限循环中加载,正在消耗大量内存。代码正在运行,但是它将影片剪辑加载到影片剪辑上方。

我需要实现我的代码并插入代码以在再次调用循环后擦除影片剪辑。

1 个答案:

答案 0 :(得分:0)

有几种方法可以实现这一目标。我会展示其中几个。

  1. new_clp var global设置为当前班级或时间轴(将其声明移至与计时器相同的位置)

    var timer:Timer = new Timer(2500);
    timer.addEventListener(TimerEvent.TIMER, onTimer);
    timer.start();
    
    var new_clp:DisplayObject;
    

    然后,在创建新剪辑之前将其删除:

    if(new_clp){ //if there is already something in this variable, then remove it
        removeChild(new_clp);
    }
    
    var clp_index = parseInt(bdaily.text) >= parseInt(basketdtarget.text) ? 1 : 2
    new_clp = clp_index == 1 ? new clp_01() : new clp_02()
    addChild(new_clp)
    
  2. 浏览当前作用域显示列表并删除所有clp_01clp_02个实例:

    var i:int = numChildren;
    while(i--){
        if(getChildAt(i) is clp_01 || getChildAt(i) is clp_02){
            removeChild(getChildAt(i));
            //if you have any listeners attached to the object, remove them now
        }
    }
    
    var clp_index = parseInt(bdaily.text) >= parseInt(basketdtarget.text) ? 1 : 2
    var new_clp = clp_index == 1 ? new clp_01() : new clp_02()
    addChild(new_clp)
    
  3. 内存管理要考虑的其他因素是,如果你只有两个片段,只要让它们一直加载,并在每个定时器滴答时改变它们的可见性:

    var timer:Timer = new Timer(2500);
    timer.addEventListener(TimerEvent.TIMER, onTimer);
    timer.start();
    
    var clp1:clp_01 = new clp_01;
    var clp2:clp_02 = new clp_02;
    
    addChild(clp1);
    addChild(clp2);
    

    然后在你的另一段代码中:

    var clp_index = parseInt(bdaily.text) >= parseInt(basketdtarget.text) ? 1 : 2
    clp1.visible = clp_index == 1;
    clp2.visible = clp_index == 2;