0

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

  • 当前页面为Page A,点击next按钮
  • 页面 B 使用 addChild 放置在舞台上(但放置在视野之外)
  • 页面 A 滑出可见的舞台
  • B页滑入可见阶段
  • 页面 A 使用 removeChild 从舞台上删除 - 这是我遇到问题的地方。
//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]});    }
}
4

2 回答 2

1

您的“oldPage”很可能在某个时候还没有添加到舞台/电影剪辑中,就像刚开始时一样。

所以而不是:

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
}
于 2012-01-27T06:49:14.967 回答
0

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

在您的构造函数中,将变量 currentPage 设置为舞台上页面的实例变量(您在对象属性中调用它的任何内容)。然后,在您的 nextClicked 中,将 currentPage 存储在 oldPage 中,然后再将其重置为添加的新页面。

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]});
     }
 }

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

于 2012-01-27T13:49:12.670 回答