Удаление спрайтов со сцены

Привет, ребята, у меня проблема с моими страницами во flash. Итак, я создал 5 страниц, каждая из которых содержит несколько мувиклипов (текст, графика, формы и т.д.). Однако есть одна конкретная страница, которая содержит автоматически сгенерированный контент через. спрайты. Если я попаду на эту страницу, появятся спрайты, но когда я перейду на другую страницу, они все еще будут там, за исключением того, что не является спрайтом (исчезнет). Я рву на себе волосы, мне удалось удалить несколько спрайтов, но некоторые все еще появляются. Ниже показан макет того, который не удаляется;

var container:Sprite = new Sprite();

//loop places several "item" in this container sprite and a scroll bar
var item:myItem = new myItem();
var sb:customScrollBar = new customScrollBar();

container.addChild(item);
container.addChild(sb);

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

Вот что я пробовал:

removeChild(container); //nothing, this was called from another keyframe where the container was not generated from
stage.removeChild(container); //nothing

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

Примечание. У меня также есть несколько кнопок, которые также были сгенерированы НЕ внутри контейнера, как показано ниже, и они работали, когда я запускал removeChild (button1), поэтому я не знаю, почему контейнер не работает.

FLA (cs4) http://www.4shared.com/file/2swJjnNm/mevame.html

Предварительный просмотр http://bodog-bonuses.com/mevame/


person 1337holiday    schedule 19.09.2010    source источник
comment
Если вы получаете сообщение об ошибке «Предоставленный DisplayObject должен быть дочерним...», похоже, что контейнер не является дочерним элементом рабочей области. Вы можете проверить это следующим образом: if (stage.contains(container)) { trace(true); } . Посмотрите, что произойдет, когда вы запустите это.   -  person debu    schedule 19.09.2010
comment
Хм, не знал, что ты так умеешь. Я попробовал это, и это вернуло true. Я возился с этим, и иногда я заставляю его работать, а затем из ниоткуда, когда я пытаюсь сделать это снова, он терпит неудачу.   -  person 1337holiday    schedule 20.09.2010
comment
Вы знаете, что здесь ссылка на вещь, просто чтобы вы могли ее увидеть. bodog-bonuses.com/mevame , если вы просматриваете только ссылки в меню, вы обратите внимание, все они работают. Если вы перейдете на вкладку меню, затем щелкните салат (коробку), появится калькулятор. Теперь это автоматически сгенерированный материал, обратите внимание, если вы перейдете на любую другую страницу, он все равно останется там. Однако, если вы идете в дом, он удаляется, но только один раз.   -  person 1337holiday    schedule 20.09.2010
comment
Звучит странно, и его трудно отлаживать, не имея передо мной проекта. Попробуйте поставить точку останова на строку с вызовом removeChild, а затем запустить отладчик и посмотреть, что находится внутри этого объекта при каждом его запуске. Кроме того, проверьте свой код и убедитесь, что вы не добавляете дочерние объекты в другое место. В противном случае, если вы хотите отправить код, я посмотрю.   -  person debu    schedule 20.09.2010
comment
хм, хорошо, я попробую отладить его. Я отредактировал пост так что внизу есть ссылка на фла но его cs5. (дайте мне знать, если вы хотите, чтобы я преобразовал его в cs4 или что-то еще)   -  person 1337holiday    schedule 20.09.2010
comment
А, только что увидел, что вы добавили FLA, но у меня нет CS5. Если сохраните как CS4, то завтра посмотрю.   -  person debu    schedule 20.09.2010
comment
о, братан, я только что обновил ссылку и большое спасибо :)   -  person 1337holiday    schedule 20.09.2010
comment
где вы добавляете контейнер на свою сцену ??   -  person Eugene    schedule 20.09.2010


Ответы (3)


Вы не получите ошибку аргумента 2025, ЕСЛИ вы будете следовать

//initialization
var container:Sprite = new Sprite();

...... 
......
addChild(container);

//------- later
if(contains(container))
  removeChild(container);

Нет необходимости создавать имя, это гарантирует, что спрайт или DisplayObject будут добавлены в DisplayList. Тогда вы не получите y ArgumentError 2025.

person Luqman_Ahmad    schedule 25.07.2012

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

var container:Sprite = new Sprite();
container.name = "container";

//------- later
var child:DisplayObject = getChildByName("container");
removeChild(child);

Если вам нужно удалить всех детей, вы также можете сделать это

while( this.numChildrem > 0 )
     this.removeChildAt(0);
person PatrickS    schedule 20.09.2010

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

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

person Aaron    schedule 20.09.2010