Ошибки Flash 2007, 2025; увеличение очков, похоже, приводит к сбою игры

#flash #actionscript-3 #actionscript #flash-cs5

#flash #actionscript-3 #actionscript #flash-cs5

Вопрос:

Я работаю над небольшой игрой на Flash, чтобы разобраться с основами AS3. Однако я столкнулся с некоторой проблемой, которую, похоже, не могу разгадать.

У меня есть «аватар» моего игрока, который должен подбирать мелкие монеты, появляющиеся с правой стороны экрана. Эти монеты перемещаются влево, где мой игровой персонаж может их подобрать. Я хочу удалить их с экрана и увеличить счет на 10, когда персонаж поднимает монету.

Однако, похоже, есть пара ошибок: когда я беру монету, я получаю эти ошибки:

 TypeError: Error #2007: Parameter child must be non-null
ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
  

Я помещаю монеты в массив, а затем запускаю для них цикл foreach, чтобы заставить их двигаться, и вызываю для них hitTestObject ():

 for each(var muntje:Muntje in geldArray)
        {
            muntje.moveMuntje();
            if(playerLola.hitTestObject(muntje))
            {
                removeChild(muntje);
                gameScore.addToValue(10);
            }
        }
  

Кроме того, когда я беру монетку, игра не вылетает полностью; кажется, что она просто немного останавливается, выбрасывает (спам) пару таких сообщений об ошибках, а затем увеличивает счет на 10, после чего игра продолжается.

РЕДАКТИРОВАТЬ: я предполагаю, что я не могу использовать removeChild () здесь, потому что ‘muntje’ на самом деле не является дочерним элементом? Я пробовал такие вещи, как stage.removeChild(muntje) , но это тоже не сработало. Как бы мне убрать монеты со сцены?

Есть помощь? Заранее спасибо.

Ответ №1:

Самый безопасный способ удалить DisplayObject — это

 if (muntje amp;amp; muntje.parent) muntje.parent.removeChild(muntje);
  

Таким образом, вам все равно, кто хранит объект, он просто удаляется из чего-либо (если он вообще был добавлен к чему-либо).

Комментарии:

1. Большое спасибо. Это сделало это. Тем не менее, мой результат обновляется более чем на 10, потому что hitTestObject, похоже, запускает addToValue () более одного раза. Есть ли способ заставить его сработать только один раз? Возможно, с логическим значением?

2. После сбора монеты вы можете вообще удалить in из geldArray, чтобы он больше не запускался.

3. Как бы я это сделал? С помощью splice? Я довольно новичок в AS3, поэтому я не знаю большинства этих методов. Я пойду почитаю об этом 🙂 Спасибо за ваше время!

4. Запустите for цикл в обратном направлении: for (var i:int = geldArray.length - 1; i>=0; i--) . Тогда вы можете сделать geldArray.splice(i, 1) — это удаляет один элемент в позиции i. Массив — один из важнейших классов, набирайтесь практики с ним! 😀

5. Подойдет 🙂 Я ввел указанный вами код, но теперь другие мои монеты перестают двигаться, когда я собираю одну; D Я попытаюсь разобраться! Еще раз спасибо.