ArgumentError: Ошибка № 2025: предоставленный объект DisplayObject должен быть дочерним по отношению к вызывающей стороне. AS3

Я пытаюсь сделать игру типа космических захватчиков со стрельбой пулями и столкновением кораблей, используя функцию hitTestObject, но я не могу получить removeChild(); функция для работы без ошибок выше. Вот кодекс, что мне делать.

import flash.ui.Keyboard;
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.display.MovieClip;

var count:int = 1;

//adding the components
var NewBullet:MovieClip = new Bullet;

    var Ship_M:MovieClip = new Ship; 
    Ship_M.x = 270;
    Ship_M.y = 470;
    addChild(Ship_M);


    var Ship_E:MovieClip = new E_Ship;
    Ship_E.x = 270;
    Ship_E.y = 5;
    addChild(Ship_E);


stage.addEventListener(Event.ENTER_FRAME , Rec);
function Rec(e:Event):void{
  if (NewBullet.hitTestObject(Ship_E))
  {
    removeChild(Ship_E);
    removeChild(NewBullet);

  }

   if (Ship_E.hitTestObject(Ship_M))
   {
      removeChild(Ship_E);
      removeChild(Ship_M);
    }



    }

function Moves(e:Event):void{

            NewBullet.y -= 30;

    if (NewBullet.y < 0 )
        {

         removeChild(NewBullet);

          count++;
    removeEventListener(Event.ENTER_FRAME, Moves);

        }

          trace (count);
    }



//For Moving the Spaceship          
stage.addEventListener(KeyboardEvent.KEY_DOWN, Move);

function Move (event:KeyboardEvent):void{

 switch(event.keyCode)

    {
        case 37: 
            if (Ship_M.hitTestObject(Stop_L1))
            {
                Ship_M.x -=  0;
            }
            else
            {
                Ship_M.x -=  10;
            }
        break;

        case 38:
            if (Ship_M.hitTestObject(Stop_U1))
            {
                Ship_M.x -=  0;
            }
            else
            {
                Ship_M.y -=  10;
            }

        break;

        case 39:
            if (Ship_M.hitTestObject(Stop_R1))
            {
                Ship_M.x -=  0;
            }
            else
            {
                Ship_M.x +=  10;
            }

        break;

        case 40:
            if (Ship_M.hitTestObject(Stop_D1))
            {
                Ship_M.x -=  0;
            }
            else
            {
                Ship_M.y +=  10;
            }

        break;


        case 32:
        addChild(NewBullet);
        NewBullet.x = Ship_M.x;
        NewBullet.y = Ship_M.y;

        addEventListener(Event.ENTER_FRAME, Moves);
        break;

        default:

    }

}

3 ответа

Замените свой

removeChild(SomeSprite); 

с

if (SomeSprite.parent)
    SomeSprite.parent.removeChild(SomeSprite); 

Родитель объектов может вызывать только removeChild.

Это может вам не понадобиться в ваших конкретных обстоятельствах, но у меня есть вспомогательная функция для удаления ребенка и предоставления ему права на GC, которая выглядит следующим образом:

private function remove(child:DisplayObject):void
{
    if(child && child.parent)
    {
        child.parent.removeChild(child);
        child = null;
    }
}

Скорее всего, вы делаете removeChild(NewBullet) дважды, сначала, когда он нажимает на Ship_E, и второй, когда он покидает границу. Простое решение будет заключаться в том, что всякий раз, когда ваш NewBullet удаляется со сцены, установите для него флаг, скажем "включенный", который будет означать, что пуля может вызывать события, и проверяйте его в коде всякий раз, когда вам нужно проверить наличие пули.

Обратите внимание, у вас есть только одна пуля, это нормально?

Другие вопросы по тегам