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 удаляется со сцены, установите для него флаг, скажем "включенный", который будет означать, что пуля может вызывать события, и проверяйте его в коде всякий раз, когда вам нужно проверить наличие пули.
Обратите внимание, у вас есть только одна пуля, это нормально?