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:

    }

}

person user1685872    schedule 20.09.2012    source источник
comment
В идеале вы должны называть свои переменные с помощью lowerCamelCase, чтобы избежать путаницы. Имена классов обычно начинаются с заглавной буквы.   -  person crooksy88    schedule 20.09.2012
comment
Пожалуйста, рассмотрите возможность использования растра (bitmapData) и copyPixels для «рендеринга» вашей игры для значительного повышения производительности.   -  person AturSams    schedule 20.09.2012


Ответы (3)


Замени свой

removeChild(SomeSprite); 

с участием

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

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

person Roman Trofimov    schedule 20.09.2012
comment
Спасибо, не могли бы вы помочь мне сделать несколько пуль? - person user1685872; 21.09.2012
comment
Можешь описать свою проблему с пулями? - person Roman Trofimov; 21.09.2012

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

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

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

Заметьте, у вас всего одна пуля, это нормально?

person Vesper    schedule 20.09.2012
comment
Ну, это не так просто. Вам нужен массив, который будет содержать все ваши пули, и вам придется проверять каждую из них, находятся ли они в границах и поражают ли они ваших врагов (конечно, каждый враг против каждой пули), и еще один массив для вражеские пули. Все это проверяется в одном слушателе ENTER_FRAME, который никогда не удаляется, вместо этого вы удаляете маркер из этого массива, также удаляете его из отображения и буквально забываете об этом. Техника повторного использования лучше, чем эта, но сначала вам нужно научиться ходить, прежде чем вы сможете летать. - person Vesper; 21.09.2012
comment
Я на самом деле довольно хорошо летаю на Java и C ++, я просто не понимаю логики использования не кода, но в любом случае вы говорите, что я должен заполнить оператор for и массив с пулями, запустить их и повторно погрузить правильно ?? - person user1685872; 24.09.2012
comment
Не только огонь, но и отслеживание на протяжении всей их жизни. Но да, как-то так. - person Vesper; 24.09.2012
comment
Чувак, спасибо за твои ответы, но, пожалуйста, помоги мне еще раз. Я просмотрел много туториалов и не могу понять, почему мои стреляют одними и теми же пулями, как вы это увидели и что я могу сделать, вам нужен обновленный код? - person user1685872; 26.09.2012
comment
Это довольно сложная задача, но сначала вам нужно удалить NewBullet и заменить его массивом пуль, затем заставить вашего игрока стрелять более чем одной пулей под разными углами, а затем заставить их всех лететь. Подсказка: то, что вы делаете с одной пулей, нужно делать с каждой активной пулей, но не используйте слушатели на пулях — они слишком медленные и вы рискуете получить утечки памяти. - person Vesper; 26.09.2012