2012-01-27 65 views
0

我試圖創建一個幻燈片樣式演示文稿,其中每個幻燈片/頁面是一個動畫片段,並且它們通過滑動動畫進行轉換。 我的問題是,我不希望在一次悉數登場,影片剪輯,以防止滯後的問題,什麼我想要實現的例子:Flash AS3:ArgumentError:錯誤#2025:提供的DisplayObject必須是調用者的孩子。

  • 當前頁是第一個,下一個按鈕卡嗒一聲
  • 網頁B被放置在使用addChild階段(但擺放出來的視圖)
  • 網頁A滑出可見階段
  • 網頁B滑入可見階段使用來自階段被去除
  • 網頁A removeChild - 這是我遇到問題的地方。

我必須事先爲我的代碼道歉,我其實是一名設計師,我仍然在學習AS3的基礎知識。我可能以非常迂迴/愚蠢的方式做到了這一點,但現在我會猜測。

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

code

回答

1

很可能你的「oldPage」還沒有添加到舞臺/動畫片段在某些時候,好像就在beggining。

所以不是:

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 
} 
+0

我認爲這是我出錯的地方 - 我從來沒有在任何時候真正將'oldPage'添加到舞臺上,我嘗試將'currentPage'重命名/重新定義爲'oldPage',這樣我就可以將其修改爲在使用removeChild之前,左邊沒有工作。 – user1172903 2012-01-27 07:12:15

0

當你實例oldPage,你正在創建一個類的新實例(或至少這是它是什麼樣子對我來說)。該頁面與舞臺上的頁面不同。

在您的構造函數中,將變量currentPage設置爲舞臺上的頁面的實例變量(無論您在對象屬性中調用它)。然後,在您的nextClicked中,在將oldPage重置爲新添加的頁面之前,在oldPage中存儲currentPage。

FWIW,約定是類名總是大寫。如果你已經這樣做了,那麼確實知道page1,page2等是你正在實例化的Classes會更容易。

另外請注意,由於在啓動時沒有舞臺上的實例,因此可能不會節省太多時間,因爲它們會在幀1之前編譯到電影中。即使未選中「嵌入幀1」按鈕,也會通過引用他們在您的Class文件中編譯的第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]}); 
    } 
} 

我猜如果你的圖形很大或者它們移動了,你可能遇到舞臺上有不止一個的性能問題,但是我認爲你試圖解決加載問題。

+0

我怎麼會去設置curentPage到舞臺上的實例變量?我以爲我是這樣做的: var currentPage:MovieClip = new pageArray [currentArray]; 但相反我認爲我可以使用返回page1,page2等的數組來設置它。 同樣,當我在任何給定時間在舞臺上有多個mc時,我似乎會得到顯着的FPS差異,而不是隻有一個。每個MC都有不斷的補間。 – user1172903 2012-01-30 22:06:44

相關問題