2012-07-11 2 views
1

카운터 기능을 만들기 위해 AS3 클래스를 작성했습니다. 파란색 영역에서 마우스를 클릭 한 채로 값을 정의하십시오. 나는 변화를 일깨워주는 지시자 그림을 사용자들에게 보여 주려고한다.ArgumentError : removeChild 오류 # 2025

하지만 파란색 영역에서 조금 빠른 마우스를 드래그 할 때 오류가 발생합니다 : 나는 몇 가지 유사한 문제의 게시물을 읽고

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

+0

안녕 Neil, 네, 뭔가를 제거하려고했습니다. 마우스를 빨리 드래그하면이 오류가 발생합니다. 마우스를 천천히 드래그하면 정상적으로 작동합니다. 나는 그 이유와 그것을 실제로 고치는 법을 모른다. – Nick

+0

드래그 코드는 어디에 있습니까? – Neil

답변

1

.

이 SUB1이 인스턴스화되었지만, 그것은 당신이 그것을 제거하려고 할 때 추가되지 않은 :

child

표시 객체에 removeChild(obj)를 호출하기 전에, 첫 번째 테스트는 그것으로 추가 된 경우 if(contains(obj))이 사실인지 평가하여 어린이. 이 문제는 다른 아이들과 계속되면, 당신이 추가 테스트를 추가해야합니다

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

:

는 test.as 라인 67에서, 당신은 sub1가 표시 목록에 추가되었는지 확인 조건 테스트를 수행해야합니다 다음과 같은 블록 :

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

오오 그렇습니다! 그것은 효과가있다! 고마워요 제이슨! 하지만 또 다른 질문이 있습니다. 마우스를 빠르게 끌면 일부 개체가 추가되지 않는 이유는 무엇입니까? 나는이 문제가 여전히 존재한다고 생각한다. 이 코드에서 어떻게 수정합니까? 고맙습니다! – Nick

+0

'Event.ENTER_FRAME'은 빠른 움직임을 위해 충분히 빠르지 않습니다. 프레임 당'if (num == 1) '의 특정 값을 테스트하는 대신'if (num> = 1)'과'if (num> = 2)'등을 사용하면'num == 1 '가 건너 뛰었고 그 값이'2'이면'num> = 1'의 논리가 여전히 호출됩니다. –

+0

오 예! 네가 옳아! 나는이 방법으로 그것을 고친다. 멋지다! 고맙습니다! – Nick

관련 문제