2012-12-05 4 views
3

게임에서 영화 클립을 제어 할 수있는 Catcher 클래스가 있습니다. 게임을 끝내고 다시 시작할 수 있도록 프로그래밍하려고합니다. 그래서 모든 것을 제거하고 메뉴로 돌아 가야합니다. 해결해야 할 간단한 것이어야하지만 어떻게 찾을 수없는 것 같습니다.AS3 : 오류 1009 오버플로없이 movieclip을 올바르게 제거하는 방법은 무엇입니까?

지금까지 나는 ourCatcher.parent.removeChild (ourCatcher)를 가지고 있습니다. 스테이지에서 내 영화 클립을 제거합니다. 무언가를 무대에 떨어 뜨리는 기능 중 하나를 중지시키는 if 문. SoundMixer.stopAll(); 음악을 멈추게합니다. 그러면 게임 오버플로 인 3 프레임으로갑니다.

괜찮아 보이지만 오류 콘솔에 1009 개의 오류가 넘쳐서 게임을 다시 시작하면 속도가 느려집니다. 포수가 무대에서 제거되어 null이 되었기 때문에 포수 내의 이동 기능이 아직 실행 중이며 오류가 발생하는 것으로 보입니다.

포수와 모든 것을 참조 해제해야한다는 것을 알고 있지만 내 상황에서는 온라인으로 문서를 찾을 수 없습니다. 모두는 내가 시도하고 작동하지 않는 다른 방법이있는 것 같습니다.

나는 캐릭터 이동 사용하고 포수 클래스의 두 가지 기능

:

public function Catcher(stageRef:Stage) 
    { 
     stop(); 
     this.stageRef = stageRef; 
     key = new KeyObject(stageRef); 


     addEventListener(Event.ENTER_FRAME, loop, false, 0, true); 
    } 

    //movement 
    public function loop(e:Event):void 
    {   
     if (key.isDown(Keyboard.A)) 
       vx -= walkSpeed; 

     else if (key.isDown(Keyboard.D)) 
       vx += walkSpeed; 

     else 
       vx *= friction; 

     //update position 
     x += vx; 

     //speed adjustment 
     if (vx > maxspeed) 
      vx = maxspeed; 
     else if (vx < -maxspeed) 
      vx = -maxspeed; 

     //stay inside screen 
     if (x > stageRef.stageWidth) 
     { 
      x = stageRef.stageWidth; 
      vx = -vx 
     } 

     else if (x < 0) 

     { 
      x = 0; 
      vx = -vx; 
     } 


     if (key.isDown(Keyboard.A)) 
     { 
      scaleX = -1; 
     } 

     else if (key.isDown(Keyboard.D)) 
     { 
      scaleX = 1; 
     } 

     movement(); 

     // Jumping 
     jump += gravity; 

     if (y > stage.stageHeight /1.5) 
     { 
      jump = 0; 
      canJump = true; 
     } 

     if (key.isDown(Keyboard.SPACE) && canJump) 
     { 
      jump = -10; 
      canJump = false; 
     } 

     y += jump; 


    } 

내가 CatchingGame라고 무대에서 일을 제거하고있어 다른 클래스와는 떨어지는 기능이 있습니다 객체, 나는 playerlives == 0 일 때 거기에 코드 위에 게임을 두었습니다.

if (playerLives == 0) 
       { 
       stop(); 
       ourCatcher.parent.removeChild(ourCatcher); 
       SoundMixer.stopAll(); 
       gotoAndStop(3); 
       } 

나는이 게임이 내 첫 플래시 게임이기 때문에 아마 실수를 저질렀습니다. 이 게임이 내 게임을 마무리 짓는 마지막 단계이기 때문에 어떤 도움이라도 대단히 감사하겠습니다.

답변

0

그 자체를 제거하기 위해 부모를 참조하여 자식을 제거하는 대신 (실제로이 기능이 제대로 작동하는지 테스트해야 함). 먼저 eventListener ENTER_FRAME을 제거한 다음 Catcher를 제거하는 Catcher를 작성/인스턴스화하는 동일한 위치에 함수를 작성하십시오.

if (playerLives == 0) { 
    stop(); 
    removeCatcher(); 
    SoundMixer.stopAll(); 
    gotoAndStop(3); 
} 

// new location in the main code where the catcher is created 
function removeCatcher():void { 
    ourCatcher.cleanUp(); 
    removeChild(ourCatcher); 
} 

// in the Catcher class 
function cleanUp():void { 
    removeEventListener(Event.ENTER_FRAME, loop); 
} 
+0

안녕하세요. 빠른 응답에 감사드립니다. 이것은 1009 오류를 제거하지만, 이제 2025 오류가 발생합니다. ArgumentError : Error # 2025 : 제공된 DisplayObject는 호출자의 자식이어야합니다. 나는 물건들이 엉뚱한 곳에 섞여 있을지도 모른다고 생각한다. flash.display : DisplayObjectContainer와 /로 removeChild() CatchingGame/removeCatcher() CatchingGame/moveObjects에서 \t에서 \t에서 \t는() – Zimbozo

+0

당신은 존재하는 외부 어딘가에 아이를 제거하고 있습니다. removeCatcher가 – Gone3d

+0

을 만든 동일한 프레임에 있고 부모가 클래스 인 경우 removeCatcher가 만든 프레임에 있는지 확인하십시오. – Gone3d

0
if (ourCatcher.parent) ourCatcher.parent.removeChild(ourCatcher); 
else trace("Catcher without a parent still plays! DEBUG THIS!"); 

기본적으로, 당신이 가장 가능성이 포수의 제어 흐름을 잃어 가고있다, 즉, 겉보기에 두 번 무대에서 자신을 제거하려고한다. 그것이 처음으로 제거 된 후에는 parent이 null이되어 1009가됩니다. 그리고 2028을 쳤을 때와 같은 이유가 적용됩니다. 포수는 더 이상 어디에도 자녀가 없습니다.

+0

예, 맞습니다. 이런 일이있는 것 같습니다. 그래도 제대로 제거해야합니까? – Zimbozo

+0

음, 스테이지에서 캐처를 제거 할 때 이벤트 리스너를 제거하십시오. 다른 것, 그리고 당신이 고칠 필요가있는 것을 보여주기 위해 더 많은 코드를 제공해야합니다. – Vesper

관련 문제