2012-01-27 11 views
0

私はスライドショースタイルのプレゼンテーションを作成しようとしています。プレゼンテーションは、各スライド/ページがムービークリップであり、スライドアニメーションを介して移行します。私が持っている の問題は、私はラグの問題を防ぐために、一度に、ステージ上のすべてのムービークリップを望んでいないことを私が達成しようとしているものの例である:Flash AS3:ArgumentError:Error#2025:指定されたDisplayObjectは、呼び出し元の子でなければなりません。

  • 現在のページは、次のボタンがあるページAであり、ページ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]}); 

子供はまだそれを削除する前に存在している場合、最初のチェックに考えてみましょう。あなたが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

0

、あなたはそのクラスの新しいインスタンスを作成している(あるいは少なくともそれはそれは次のようになります。これは、のようなものは、新しい関数を呼び出す必要になります私に)。そのページはステージ上にあるものと同じではありません。

コンストラクタでは、変数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]}); 
    } 
} 

私はあなたのグラフィックスが大きいかどうか、またはそれらが動くかどうか、あなたはステージ上で複数のパフォーマンス上の問題にぶつかるかもしれませんが、あなたがローディングの問題を回避しようとしていると仮定しました。

+0

ステージ上のインスタンス変数にcurentPageを設定するにはどうすればよいですか?私はそうしていると思っていました。 var currentPage:MovieClip = new pageArray [currentArray]; しかし、私はpage1、page2などを返す配列を使って設定できると考えていました。 また、私は何時でもステージ上に複数のmcを持っているとかなりのFPSの違いがあるようですちょうど1つ持っている。私はそれぞれのmcで一定のトゥイーンが起こっています。 – user1172903

関連する問題