Flash AS3:ArgumentError:错误#2025:提供的DisplayObject必须是调用者的子级

时间:2012-01-27 06:29:10

标签: flash actionscript-3 contains removechild tweenlite

我正在尝试创建幻灯片样式演示文稿,其中每个幻灯片/页面都是一个动画片段,并且它们通过滑动动画进行过渡。 我遇到的问题是我不想立刻登上舞台上的所有影片剪辑来防止滞后问题,这是我试图实现的一个例子:

  • 当前页面是页面A,单击下一个按钮
  • 使用addChild将页面B放置在舞台上(但放在视图之外)
  • Page A从可见舞台上滑落
  • Page B滑入可见阶段
  • 使用removeChild将页面A从舞台中删除 - 这是我遇到问题的地方。
//greensock stuff
import com.greensock.*;
import com.greensock.easing.*;

//buttons that navigate to next and previous slides
prevBtn.addEventListener(MouseEvent.CLICK,prevClicked,false,0,true);
nextBtn.addEventListener(MouseEvent.CLICK,nextClicked,false,0,true);

//setting up array of all the pages
var pageArray:Array = [page1, page2, page3, page4, page5];
var currentArray:Number = 0;

//defining the first page and placing it on the stage
var currentPage:MovieClip = new pageArray[currentArray];
addChild(currentPage);



function nextClicked(event:MouseEvent):void{
    //check to ensure it is not the last page
    if (currentArray < pageArray.length - 1){
            //define the current slide as oldPage
            var oldPage:MovieClip = new pageArray[currentArray];
            currentArray++;
            //define the next slide as currentPage and place on stage
            var currentPage:MovieClip = new pageArray[currentArray];
            addChild(currentPage);
            currentPage.x = 1024;
            TweenMax.to(currentPage, 1, {x:0});
            TweenMax.to(oldPage, 1, {x:-1024,onComplete:removeChild,onCompleteParams:[oldPage]});
    }
}



function prevClicked(event:MouseEvent):void{
    //check to ensure it is not the first page
    if (currentArray > 0){
            //define the current slide as oldPage
            var oldPage:MovieClip = new pageArray[currentArray];
            currentArray--;
            //define the next slide as currentPage and place on stage
            var currentPage:MovieClip = new pageArray[currentArray];
            addChild(currentPage);
            currentPage.x = -1024;
            TweenMax.to(currentPage, 1, {x:0});
            TweenMax.to(oldPage, 1, {x:1024,onComplete:removeChild,onCompleteParams:[oldPage]});    }
}

2 个答案:

答案 0 :(得分:1)

很可能你的“oldPage”还没有在某个时刻添加到舞台/ movieClip,就像在开始时一样。

所以而不是:

TweenMax.to(oldPage, 1, {x:-1024,onComplete:removeChild,onCompleteParams:[oldPage]});

首先检查孩子在删除之前是否仍然存在。这需要调用一个新函数,例如:

(未经测试的代码)

TweenMax.to(oldPage, 1, {x:-1024,onComplete:tryRemoveChild,onCompleteParams:[oldPage]});

function tryRemoveChild(page:MovieClip):void {
   if(contains(page)){ //Check if child is still there
       removeChild(page); //It is, so remove
   } //Otherwise there is no child to currently remove
}

答案 1 :(得分:0)

当您实例化oldPage时,您正在创建该类的新实例(或者至少对我来说是这样的)。该页面与舞台上的页面不同。

在构造函数中,将变量currentPage设置为舞台上页面的实例变量(无论您在对象属性中调用它是什么)。然后,在nextClicked中,在将currentPage重置为添加的新页面之前,在oldPage中存储currentPage。

FWIW,惯例是类名总是大写的。如果您已经这样做了,那么更容易确定page1,page2等是您正在实例化的类。

另请注意,您可能没有通过在启动时将实例放在舞台上而节省太多,因为它们在第1帧之前被编译到电影中。即使您取消选中“嵌入第1帧”按钮,也可以通过引用它们在第1帧上编译的类文件中,强制它们在第1帧上编译。

======================================= 编辑以回答有关将变量设置为实例的问题

如果单击fla文件中舞台上的对象,请在属性面板中查看实例名称。这是舞台上的实例名称。如果它没有名称,请给它一个。如果您已经“自动声明舞台实例”,那么您已经完成了设置。如果没有,您需要在文件顶部添加变量声明,以使该实例名称可用作变量。

现在,在你的fla文件的文档类中(我假设你上面粘贴的是代码):

public function YourDocumentClassName() {
    super();
    currentPage = theNameofThatInstance;
}

nextClicked会改变为这样:

function nextClicked(event:MouseEvent):void{
     //check to ensure it is not the last page
     if (currentArray < pageArray.length - 1){
             //define the current slide as oldPage
             var oldPage:MovieClip = currentPage;
             currentArray++;//may also want to consider checking for past the end of the array and starting at the beginning
             //define the next slide as currentPage and place on stage
             var currentPage:MovieClip = new pageArray[currentArray];
             addChild(currentPage);
             currentPage.x = 1024;
             TweenMax.to(currentPage, 1, {x:0});
             TweenMax.to(oldPage, 1, {x:-1024,onComplete:removeChild,onCompleteParams:[oldPage]});
     }
 }

我想如果你的图形很大或者它们移动了,你可能遇到在舞台上有不止一个的性能问题,但我认为你试图解决加载问题。