2012-07-11 96 views
1

我寫了一個AS3類來做一個Counter函數。在藍色區域單擊並按住鼠標以定義一個值。我試圖向提醒變化的用戶展示指標圖片。ArgumentError:Error#2025 when removeChild

但是,當我拖動鼠標有點快的藍色區域將出現一個錯誤:

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller. 
    at flash.display::DisplayObjectContainer/removeChild() 
    at test/get2() 

我看過一些類似的問題的帖子,但我不能修復這個問題。你能給我什麼幫助嗎?謝謝!

Download .fla and .as in CS6

Download .fla and .as in CS5

的代碼如下:

package { 
    import flash.display.Sprite; 
    import flash.text.TextField; 
    import flash.events.MouseEvent; 
    import flash.text.TextFormat; 
    import flash.events.Event; 

    public class test extends Sprite{ 
     var i:int=20; //Set a var for the number displayed in stage. 
     var mx1:Number; //Set a var to save MouseY when MOUSE_DOWN 
     var mx2:Number; //Set a var to save MouseY when MOUSE_UP 
     var num:int=0; //Set a var to calculate result 
     var sub1:subbar1=new subbar1(); 
     var sub2:subbar2=new subbar2(); 
     var sub3:subbar3=new subbar3(); 
     var add1:addbar1=new addbar1(); 
     var add2:addbar2=new addbar2(); 
     var add3:addbar3=new addbar3(); 

     public function test() { 
      init1(); //Set TextField and addEventListener 
      initbar(); //Set indicator picture position when drag mouse 
     } 

     private function init1():void{ 
      label=new TextField(); 
      label.text=String(i); 
      label.width=280; 
      label.selectable=false; 
      label.x=140; 
      label.y=90; 
      addChild(label); 
      Controler.addEventListener(MouseEvent.MOUSE_DOWN,get1); //addEventListener to bluearea 
     } 

     private function initbar(){ 
      sub1.x=sub2.x=sub3.x=add1.x=add2.x=add3.x=30; 
      sub1.y=35; 
      sub2.y=55; 
      add3.y=sub3.y=75; 
      add2.y=95; 
      add1.y=115; 
     } 

     private function get1(evt:MouseEvent):void{ 
      mx1=mouseY; 
      trace(mx1); 
      Controler.removeEventListener(MouseEvent.MOUSE_DOWN,get1); 
      stage.addEventListener(MouseEvent.MOUSE_UP,get2); //addEventListener to MOUSE_UP 
      stage.addEventListener(Event.ENTER_FRAME,lifebar); //add ENTER_FRAME to display indicator picture when move mouse 
     } 

     private function get2(evt:MouseEvent):void{ 
      mx2=mouseY; 
      trace(mx2); 
      if(mx2<=135&&mx2>=35&&mouseX<=130&&mouseX>=50){ //Limited enable area as the blue area 
       if(num>=4){ //Set i value depends on num 
        i=i-3; 
       }else if(num<=-4){ 
        i=i+3; 
       }else{ 
        i=i-num; 
       } 
       label.text=String(i); 
      } 
      if(num==1){ //remove indicator picture when MOUSE_UP 
       removeChild(sub1); 
      } 
      if(num==2){ 
       removeChild(sub1); 
       removeChild(sub2); 
      } 
      if(num>=3){ 
       removeChild(sub1); 
       removeChild(sub2); 
       removeChild(sub3); 
      } 
      if(num==-1){ 
       removeChild(add1); 
      } 
      if(num==-2){ 
       removeChild(add1); 
       removeChild(add2); 
      } 
      if(num<=-3){ 
       removeChild(add1); 
       removeChild(add2); 
       removeChild(add3); 
      } 
      stage.removeEventListener(MouseEvent.MOUSE_UP,get2); 
      Controler.addEventListener(MouseEvent.MOUSE_DOWN,get1); 
      stage.removeEventListener(Event.ENTER_FRAME,lifebar); 
     } 

     private function lifebar(evt:Event):void{ //Set a ENTER_FRAME to display indicator picture 
      num=(mouseY-mx1)/12+1; 
      trace(num); 
      if(mouseY!=mx1&&num==1){ 
       addChild(sub1); 

      } 
      if(num==2){ 
       addChild(sub2); 
      } 
      if(num==3){ 
       addChild(sub3); 
      } 
      if(num==-1){ 
       addChild(add1); 
      } 
      if(num==-2){ 
       addChild(add2); 
      } 
      if(num==-3){ 
       addChild(add3); 
      } 

     } 

    } 

} 
+0

聽起來你正試圖刪除已刪除的內容,請先嚐試使用yourContainer.contains(yourChild)進行檢查。 – Neil 2012-07-11 10:15:46

+0

嗨尼爾,是的,我試圖刪除一些東西。當我快速拖動鼠標時會發生此錯誤,如果我慢慢地拖動鼠標,它會很好。我不知道原因以及如何解決這個問題。 – Nick 2012-07-11 10:38:03

+0

拖動代碼在哪裏? – Neil 2012-07-11 10:40:02

回答

1

您正在試圖刪除尚未被添加爲一個孩子到顯示列表的顯示對象。

即使SUB1已被實例化,它並沒有被當時加入你試圖將其刪除:

child

之前的顯示對象上調用removeChild(obj),如果它已添加第一個測試作爲一個孩子通過評估if(contains(obj))是否屬實。

在test.as線67,您應該執行條件測試,看看是否sub1已添加到顯示列表中:

if(num==1) { 
    if(contains(sub1)) // test to see if sub1 is on the display list 
     removeChild(sub1); 
} 

如果這個問題與其他孩子繼續,你應該增加額外的測試像這樣的塊:

if(num==2){ 
    removeChild(sub1); 
    removeChild(sub2); 
} 
+0

哦,是的!有效!謝謝賈森! 但是我還有另一個問題,爲什麼如果我快速拖動鼠標會導致一些對象不被添加?我認爲這個問題依然存在。如何解決這個代碼?謝謝! – Nick 2012-07-12 04:22:11

+0

'Event.ENTER_FRAME'對於快速移動來說速度不夠快。而不是每幀測試'if(num == 1)'的具體值,使用'if(num> = 1)'和'if(num> = 2)'等等,這樣如果'num == 1 '跳過了,值現在是'2','num> = 1'的邏輯仍然會被調用。 – 2012-07-12 04:33:33

+0

哦,是的!你是對的!我以這種方式修復它。那很棒!謝謝! – Nick 2012-07-12 05:39:27