首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActionScript3删除子错误

ActionScript3删除子错误
EN

Stack Overflow用户
提问于 2015-08-27 20:07:59
回答 2查看 82关注 0票数 0

最近,我一直在将as2 fla转换为as3 (AS3中的新版本),并且整个程序都在进行导出,但是当我尝试在加载新swf之前删除以前加载的swf时,会出现一个错误。

代码语言:javascript
复制
ArgumentError: Error #2025: The supplied DisplayObject
must be a child of the caller.
at flash.display::DisplayObjectContainer/removeChild()
at MethodInfo-11()

我知道这个错误与我的removeChild代码有关:

代码语言:javascript
复制
`stage.addEventListener(MouseEvent.CLICK, removeSWF);
function removeSWF (e:MouseEvent):void 
{
if(vBox.numChildren !=0){        
   // swfLoader.unloadAndStop();
    vBox.removeChild(swfLoader);// empty the movieClip memory
}
}`

但是,我似乎找不到一个合适的重写为这段代码将工作和没有一个错误。这段代码正在运行,所以我不确定是否值得花时间修复这个错误,或者只留下它。我已经把它搞砸了几天了,所以在这一点上,我无法修复它,这让我很沮丧。在这种情况下,阶段鼠标点击侦听器是有用的,因为我在这段代码中没有显示一个后退按钮,在移到另一个场景之前清除加载的swf。是否有人看到了这方面的简单解决方案,或者您是否认为没有必要去追求,因为代码可以满足我的要求?整个代码:

代码语言:javascript
复制
function launchSWF(vBox, vFile):void    {
var swfLoader:Loader = new Loader();
var swfURL:URLRequest = new URLRequest(vFile);
swfLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadProdComplete);
swfLoader.load(swfURL);

function loadProdComplete(e:Event):void {
    trace("swf file loaded");   
    vBox.removeChild(preLoader);
    vBox.addChild(swfLoader);   
    currentSWF = MovieClip(swfLoader.content);
    currentSWF.gotoAndPlay(1);
    currentSWF.addEventListener(Event.ENTER_FRAME , checkLastFrame);
    swfLoader.x = 165;
    swfLoader.y = 15;

    function checkLastFrame(e:Event):void { 
        if (currentSWF.currentFrame == currentSWF.totalFrames) {
        currentSWF.stop();
        // trace("DONE");     
        }
    }      
} 
var preLoader:loader = new loader();
preLoader.x = 450;
preLoader.y = 280;
vBox.addChild(preLoader);

        function onProgressHandler(event:ProgressEvent){
            var dataAmountLoaded:Number=event.bytesLoaded/event.bytesTotal*100;
            //preLoader.bar.scaleX = dataAmountLoaded/100;
            preLoader.lpc.text= int(dataAmountLoaded)+"%";
            //trace(preLoader.bar.scaleX );
        }   
//NEW ERRORS BUT WORKING
stage.addEventListener(MouseEvent.CLICK, removeSWF);
function removeSWF (e:MouseEvent):void 
{
if(vBox.numChildren !=0){        
   // swfLoader.unloadAndStop();
    vBox.removeChild(swfLoader);// empty the movieClip memory
}
}
}
var container:MovieClip = new MovieClip();
var currentSWF:MovieClip = new MovieClip();

fall_b.addEventListener(MouseEvent.CLICK, fall_bClick);
  function fall_bClick(e:MouseEvent):void {
  var swfFile:String = 'load/fall.swf';
  launchSWF(container, swfFile);
  addChild(container);
  }

face_b.addEventListener(MouseEvent.CLICK, face_bClick);
  function face_bClick(e:MouseEvent):void {
  var swfFile:String = 'load/face.swf';
  launchSWF(container, swfFile);
  addChild(container);
  }

rott_b.addEventListener(MouseEvent.CLICK, rott_bClick);
  function rott_bClick(e:MouseEvent):void {
  var swfFile:String = 'load/rottgut.swf';
  launchSWF(container, swfFile);
  addChild(container);
  }
//MORE SWFS...

如果有人有任何建议,我们将不胜感激

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-27 20:36:13

首先,function launchSWF(vBox, vFile):void {没有关闭。您还拥有函数内部的函数,如果单击花括号开始和结束的行来跟踪它们,就可以很容易地解决这些问题。

我看不出你说的代码有什么问题,但我猜这不是所有的代码。如果使用Flash,则可以使用允许调试来显示错误所在的行。

编辑:,请注意,这还没有经过测试,因为我正在手机上编写代码。尽管如此,这一点现在应该奏效:

代码语言:javascript
复制
var container:MovieClip;
var currentSWF:MovieClip;

var swfFile:String;

var swfLoader:Loader;
var preLoader:Loader;

var swfURL:URLRequest;

init();

function init():void {
    preLoader = new Loader();
    preLoader.x = 450;
    preLoader.y = 280;
    vBox.addChild(preLoader);

    container = new MovieClip();
    currentSWF = new MovieClip();
    fall_b.addEventListener(MouseEvent.CLICK, fall_bClick);
    face_b.addEventListener(MouseEvent.CLICK, face_bClick);
    rott_b.addEventListener(MouseEvent.CLICK, rott_bClick);

    stage.addEventListener(MouseEvent.CLICK, removeSWF);
}

function launchSWF(vBox, vFile):void {
    swfLoader = new Loader();
    swfURL = new URLRequest(vFile);
    swfLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
    swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadProdComplete);
    swfLoader.load(swfURL);
}

function loadProdComplete(e:Event):void {
    trace("swf file loaded");   
    vBox.removeChild(preLoader);
    vBox.addChild(swfLoader);   
    currentSWF = MovieClip(swfLoader.content);
    currentSWF.gotoAndPlay(1);

    currentSWF.addEventListener(Event.ENTER_FRAME , checkLastFrame);
    swfLoader.x = 165;
    swfLoader.y = 15;
}

function checkLastFrame(e:Event):void { 
    if (currentSWF.currentFrame == currentSWF.totalFrames) {
        currentSWF.stop();
        // trace("DONE");
    }      
} 

function onProgressHandler(event:ProgressEvent) {
     var dataAmountLoaded:Number = (event.bytesLoaded / event.bytesTotal * 100);
     //preLoader.bar.scaleX = dataAmountLoaded/100;
     preLoader.lpc.text = int(dataAmountLoaded)+"%";
     //trace(preLoader.bar.scaleX );
}

function removeSWF (e:MouseEvent):void {
    if(vBox.numChildren !=0){        
        //swfLoader.unloadAndStop();
        vBox.removeChild(swfLoader);// empty the movieClip memory
    }
}

function fall_bClick(e:MouseEvent):void {
    swfFile = 'load/fall.swf';
    launchSWF(container, swfFile);
    addChild(container);
}

function face_bClick(e:MouseEvent):void {
    swfFile = 'load/face.swf';
    launchSWF(container, swfFile);
    addChild(container);
}

function rott_bClick(e:MouseEvent):void {
    swfFile = 'load/rottgut.swf';
    launchSWF(container, swfFile);
    addChild(container);
}
票数 0
EN

Stack Overflow用户

发布于 2015-08-28 15:44:23

我把这个重写了。我无法在原始代码中清除vBox错误,而且在发布的内容中我还得到了许多其他错误。在教程中看到了vBox代码。我认为它应该引用预加载程序和swf的加载程序,vFile用于实际的.swf。下面的代码预加载多个swfs并清除它们,没有错误。非常感谢你的帮助,AntBirch。我现在开始更多地理解as3中的加载器了。

代码语言:javascript
复制
//LOAD FIRST PIECE ON OPEN (required to removeChild later)
   var swfLoader:Loader = new Loader();
   var defaultSWF:URLRequest = new URLRequest("load/fall.swf");
   swfLoader.load(defaultSWF);
   swfLoader.x = 165;
   swfLoader.y = 15;
   addChild(swfLoader);
//PRELOADER
   var preLoader:loader = new loader();
   preLoader.x = 450;
   preLoader.y = 280;

function loadProdComplete(e:Event):void {
   trace("swf file loaded");    
   removeChild(preLoader);
   addChild(swfLoader); 
}

function onProgressHandler(event:ProgressEvent){
   var dataAmountLoaded:Number=event.bytesLoaded/event.bytesTotal*100;
   preLoader.lpc.text= int(dataAmountLoaded)+"%";
}
//BUTTONS
function btnClick(event:MouseEvent):void {

   swfLoader.unloadAndStop();
   removeChild(swfLoader);
   swfLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,      onProgressHandler);
swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,  loadProdComplete);    
addChild(preLoader);    
var newSWFRequest:URLRequest = new URLRequest("load/" + event.target.name +    ".swf");
swfLoader.load(newSWFRequest);
swfLoader.x = 165;
swfLoader.y = 15;;
addChild(swfLoader);
}

// BUTTON LISTENERS
fall.addEventListener(MouseEvent.CLICK, btnClick);  
face.addEventListener(MouseEvent.CLICK, btnClick);
rott.addEventListener(MouseEvent.CLICK, btnClick);  
angel.addEventListener(MouseEvent.CLICK, btnClick);
ratts.addEventListener(MouseEvent.CLICK, btnClick); 
metal.addEventListener(MouseEvent.CLICK, btnClick);
//etc...    


//BACK BUTTON
BB3.addEventListener(MouseEvent.CLICK, BB3Click);

function BB3Click(e:MouseEvent):void {
   swfLoader.unloadAndStop();
   removeChild(swfLoader);
   this.gotoAndPlay(1 ,"Scene 2")
}   
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32258517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档