2009-09-04 4 views
0

Я загружаю swf через класс Loader(). Когда swf загружается, я просматриваю все дочерние элементы root и удаляю любой TextField с помощью removeChild(). Сначала это работает - TextField удаляется. Но, как анимация в загруженных swf-финишках и циклах, удаленный TextField как-то снова появляется. TextField - это динамический текст. Если я удалю StaticText, это будет удалено. Что здесь происходит?AS3/CS4 удалено TextField снова после окончания анимации

loopChildren(root); 
function loopChildren(dispObj:*):void { 
    for (var i:int = 0; i< dispObj.numChildren; i++) { 
     var obj:DisplayObject = dispObj.getChildAt(i); 
     if (obj is DisplayObjectContainer) { 
      loopChildren(obj); 
     } 
     else { 
      if (obj is TextField) { 
       obj.parent.removeChild(obj); 
       i--; 
      } 
     } 
    } 
} 

Если я позвоню loopChildren с таймером (5 сек Intervall) и следа (obj.name) для всех детей, я заметил, что изменения obj.name. TextField называется instance11, instance32, instance54 и так далее. Кажется, что новый экземпляр создается и добавляется непрерывно?

EDIT: Если я передам код непосредственно в swf и запускаю его без использования обертки, он работает так, как ожидалось. Мне нужно упустить что-то, что происходит, когда оно загружается через другой фильм?

EDIT2: Я должен сказать, что TextField, который я пытаюсь удалить, находится в отдельном слое на той же временной линии, что и анимация. Если я поместил анимацию в свою временную шкалу, она, похоже, будет работать так, как ожидалось. Но не может ли динамический текст и твин жить вместе?

+0

Я бы заподозрил ключевые кадры анимации ... возможно, они добавляют новый экземпляр текстового поля? – subb

ответ

2

Похоже, ваше текстовое поле определено на сцене (т. Е. В FLA, не созданное сценарием), а на слое, на котором он находится, возможно, есть ключевой кадр, который воспроизводится в какой-то момент вашего твина.

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

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

Таким образом, короткий ответ (слишком поздно!) На ваш вопрос заключается в том, что в целом вы должны попытаться обработать свои элементы сцены с помощью твинов с временной шкалой или сценария, но не для обоих. Вот почему ваше решение в редакции # 2 работало; потому что, перемещая твин на свою собственную временную шкалу (я предполагаю), вы больше не играли по ключевым кадрам, которые закодировали информацию о рассматриваемом текстовом поле. Другое решение, вероятно, заключалось бы в том, чтобы удалить текстовое поле с оскорблением по временной шкале (путем воспроизведения на ключевом кадре, где это текстовое поле больше не существует). Или, конечно, вы также можете контролировать свое текстовое поле исключительно по сценарию, создавая его и уничтожая его, поэтому он никогда не является частью графика.

+0

Хорошая работа, вы находитесь на всех своих предположениях! Как вы, наверное, уже поняли, я пытаюсь манипулировать элементами в swf-фильмах, загружая фильм в родительский фильм. Проблема в том, что я хочу, чтобы изменения, которые я вношу в структуру и текст, были постоянными. Знаете ли вы, как это сделать? Я предполагаю, что один из способов заключается в том, чтобы каким-то образом связать мой контрольный ActionScript с ключевыми кадрами загруженного фильма и убедиться, что он выполняется, когда кинематограф пеет, делая изменения снова и снова. – 2009-09-07 08:19:28

+0

Думаю, я задам еще один вопрос относительно этого. – 2009-09-07 08:42:45

0

Почему бы просто не установить текстовое поле в пустую?

loopChildren(root); 

function loopChildren(dispObj:DisplayObjectContainer):void 
{ 
    for each(var i:int = 0; i < dispObj.numChildren; i++) 
    { 
     var obj:DisplayObject = dispObj.getChildAt(i); 
     if (obj is DisplayObjectContainer) 
     { 
      loopChildren(obj); 
     } 
     else if (obj is TextField) 
     { 
      TextField(obj).text = ""; 
     } 
    } 
}