Сценарий действия 3 - ArgumentError: Ошибка № 2025: предоставленный объект DisplayObject должен быть дочерним по отношению к вызывающей стороне - PullRequest
0 голосов
/ 29 июня 2018

Я следую этому уроку для Action Script 3 на http://markbennison.com/actionscript/as3-space-shooter/2-coding-projectiles/

Я нахожусь на части 2 Кодирование снарядов Я не знаю, почему оно говорит «Ошибка» все время, когда я нажимаю кнопку воспроизведения

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

Вот точный код, который я пытаюсь проработать, чтобы стрелять пулями при нажатии пробела, есть и другие способы исправить ошибку аргумента.


функция addBullet (startX, startY): void {

//declare an object instance from the bullet Class
var b: Bullet = new Bullet();

//set the new bullet's x-y coordinates
b.x = startX;
b.y = startY;

//add the new bullet to the stage
stage.addChild(b);

//store the object in an array
bullets_arr.push(b);

}

function moveBullet (): void {

//loop through all instances of the bullet

//loop from '0' to 'number_of_bullets'
for (var i: int = 0; i < bullets_arr.length; i++) {
    //move the bullet
    bullets_arr[i].x += bulletSpeed;

    //if the bullet flies off the screen, remove it
    if (bullets_arr[i].x > stage.stageWidth) {
        //remove the bullet from the stage
        stage.removeChild(bullets_arr[i]);

        //remove the bullet from the array
        bullets_arr.removeAt(i);
    }
}

}


Может кто-нибудь дать мне советы, чтобы что-то изменить или?

1 Ответ

0 голосов
/ 29 июня 2018

Ошибка означает, что при запуске этой строки:

stage.removeChild(bullets_arr[i]);

Предмет, на который ссылается bullets_arr[i], фактически не находится на сцене. Скорее всего, потому что он уже был снят со сцены.

Хотя это может и не быть точной причиной вашей ошибки, здесь есть одна большая проблема - удаление элементов из массива, который вы сейчас просматриваете.

Когда вы делаете: bullets_arr.removeAt(i);, вы изменяете размер массива bullets_arr.

На первой итерации i равно 0. Ваша первая пуля - bullets_arr[0], вторая - bullets_arr[1] ваша третья - bullets_arr[2] и т. Д. Если в первом цикле вы удалите элемент из массива, это означает, что индексы сместились, поэтому теперь ваш второй bullet имеет значение bullets_arr[0], но в следующем цикле значение i увеличивается до 1, так что теперь вы фактически пропустили второй маркер и проверяете третий элемент, который после удаления первого маркера теперь находится по индексу 1.

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

for (var i: int = bullets_arr.length - 1; i >= 0; i--) {
...