это репост предыдущего вопроса с дополнительной информацией на этот раз.
Файлы: 2shared.com / file / hRKhEiqh / Script_Test.html и 2shared.com / video / UZNmqzXt / a_anconeus.html
Эта проблема воспроизводится на моем компьютере с помощью нового проекта .fla в Actionscript 3.0 в Flash Professional CS5. Это редактирование моего оригинального вопроса с дополнительной информацией.
Я работаю над проектом для загрузки внешних SWF-файлов и поиска по именам экземпляров по соответствующим ключевым словам, а именно «перетаскиванию» и «отбрасыванию», чтобы определить совпадения фрагмента ролика, затем присоединяю прослушиватели событий к этим MC, которые содержат прослушиватели событий D & D и код.
Конкретной проблемой является переключение глубины для видеороликов, вложенных в динамически загружаемые внешние SWF-файлы.
Где у меня проблемы, это конкретные команды:
swapChildrenAt, setChildIndex, swapChildren, removeChild / addChild. Я пробовал все четыре с той же проблемой дублирования. Позвольте мне объяснить.
При нажатии на перетаскиваемый MC он перемещается в верхний индекс динамически загруженного SWF-файла, поэтому он виден над всем остальным в этом SWF-файле. Проблема в том, что попытка любой из этих команд дублирует MC. Что происходит, это:
Событие MOUSE_DOWN запускается на MC:
Индекс целевой MC записывается как «2», индекс, на который мы переключимся, - «20» (максимальный индекс SWF).
setChildIndex вызывается у целевого родителя MC: mc.parent.setChildIndex (mc, (mc.parent.numChildren-1))
MC переходит к индексу 20, затем на том уровне, где он был расположен ранее, создается еще один экземпляр MC (индекс 2), это происходит после завершения события MOUSE_DOWN, точно не знаю, когда.
Этот дубликат был подтвержден с помощью прослушивателя EVENT.ADDED_TO_STAGE, прикрепленного к сцене, чтобы перехватить каждый объект типов MovieClip, добавленный на сцену. Я проверил SWF, чтобы убедиться, что нет дубликатов MovieClips, следы также подтверждают это.
В аналогичных постах упоминается та же проблема дублирования, но ни у кого нет решения, которое, как я обнаружил, будет работать в моем случае.
http://www.kirupa.com/forum/showthread.php?t=359452
http://board.flashkit.com/board/showthread.php?t=775200
http://forums.adobe.com/thread/199983
В качестве последнего замечания, если я закомментирую оператор подстановки индекса, код прекрасно работает, когда MC просто остается на своем нижнем z-индексе, а не на вершине. К сожалению, это не будет работать как решение, так как я не собираю внешние SWF-файлы.
Чтобы дублировать это поведение, вам нужен внешний SWF AS3 с двумя как минимум двумя MC с именами экземпляров «drag01» и «drop01» или что-то, что соответствует ключевым словам «drag» и «drop». Укажите на этот файл строковую переменную SWF, и вы увидите проблему с дублированием.
Спасибо и всего наилучшего
Cameron
Редактировать: новый усеченный код, скопированный в пустой файл AS 3.0 с теми же ошибками.
import flash.net.URLRequest;
import flash.display.Loader;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.net.URLLoader;
var swf:String = "a_anconeus.swf";
loadSWF(swf);
stage.addEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStageReport, true);
stage.addEventListener ( Event.ADDED_TO_STAGE , onAddedToStageReport , true ) ;
function onRemovedFromStageReport (evt:Event)
{
{
trace("REMOVED: " + evt.target.name + " at depth: " + evt.target.parent.getChildIndex(evt.target));
}
}
function onAddedToStageReport (evt:Event)
{
{
trace("ADDED: " + evt.target.name + " at depth: " + evt.target.parent.getChildIndex(evt.target));
}
}
function onDragMouseDown(event:MouseEvent):void
{
var drag:MovieClip = MovieClip(event.target);
var topPosition:uint = drag.parent.numChildren - 1;
trace("click: "+drag.name +", ontarget = "+drag.ontarget + ", current z: " + drag.parent.getChildIndex(drag) + " new z: " + topPosition);
//drag.parent.setChildIndex(drag, topPosition);
var indexToDelete:int = drag.parent.getChildIndex(drag);
//this.parent.removeChild(this);
trace("index to delete: " + indexToDelete +", what's there: " + drag.parent.getChildAt(indexToDelete).name);
drag.startDrag();
//drag.parent.setChildIndex(drag, drag.parent.numChildren-1); //set child depth to top
trace("after change, what's there: " + drag.parent.getChildAt(indexToDelete).name);
//drag.parent.swapChildren(drag, drag.parent.getChildAt(drag.parent.numChildren -1));
}
function onDragMouseUp(event:MouseEvent):void
{
trace("mouse up: "+event.target.name + ", index: " +event.target.parent.getChildIndex(event.target));
var drag:MovieClip = MovieClip(event.target);
drag.stopDrag(); //Movieclips have simple drag methods
}
/*function dragEnterFrameHandler(event:Event):void {
var drag:MovieClip = MovieClip(event.target);
if (drag.mousedown == false)
{
if (drag.onTarget == true)
{
//send it to the drop X/Y
drag.x -= (drag.x - drag.dropon.x)/5;
drag.y -= (drag.y - drag.dropon.y)/5;
}
else if (drag.onTarget == false)
{
drag.x -= (drag.x - drag.homeX)/5;
drag.y -= (drag.y - drag.homeY)/5;
}
}
}*/
function loadSWF(filepath:String)
{
trace("calling loader");
var loader:Loader = new Loader();
var url:String = filepath;
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
loader.load(new URLRequest(url));
}
function onAddedToStage ( evt:Event )
{
trace("calling onAddedToStage");
/*if (evt.target is MovieClip) //filter only movieclips
{
var mc:MovieClip = MovieClip(evt.target);
// trace ( "onAddedToStage, evt: " + mc.name + ", " +(mc.parent.numChildren-1) ) ;
if (String(mc.name).indexOf("drag") != -1)
{
var dropString:String = String(mc.name).split("drag").join("drop");
if (mc.parent.getChildByName(dropString))
{
trace("our droptarget: " + mc.dropon);
mc.addEventListener(MouseEvent.MOUSE_DOWN, onDragMouseDown);
mc.addEventListener(MouseEvent.MOUSE_UP, onDragMouseUp);
mc.buttonMode = true;
}
}
}*/
}
function onCompleteHandler(loadEvent:Event)
{
trace("load complete");
var swf:MovieClip = MovieClip(loadEvent.currentTarget.content);
//swf.addEventListener ( Event.ADDED_TO_STAGE , onAddedToStage, true ) ;
//trace("event attached, adding child");
trace("child add started");
addChild(swf);
trace("child add finished");
var children:Number = (swf.numChildren-1);
trace("children: " + children);
for (var i:Number = 0; i <= children; i++)
{
trace("LOOP STARTS HERE");
if (swf.getChildAt(i) is MovieClip)
{
//trace("MC: yes");
var mc:MovieClip = MovieClip(swf.getChildAt(i));
trace("name: " + mc.name);
if (String(mc.name).indexOf("drag") != -1)
{
var dropString:String = String(mc.name).split("drag").join("drop");
if (swf.getChildByName(dropString))
{
trace("removing: " + mc.name);
children--;
swf.removeChild(mc);
trace("removed");
//swf.addChild(mc);
/*mc.addEventListener(MouseEvent.MOUSE_DOWN, onDragMouseDown);
mc.addEventListener(MouseEvent.MOUSE_UP, onDragMouseUp);
mc.buttonMode = true;*/
}
}
}
}
trace("finish function");
}