Переключение глубин вызывает дублирование МС - PullRequest
0 голосов
/ 24 февраля 2011

это репост предыдущего вопроса с дополнительной информацией на этот раз.

Файлы: 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");
}

Ответы [ 2 ]

0 голосов
/ 26 февраля 2011

тайна раскрыта:)

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

, чтобы проверить это, я добавил swf.stop(); к yout onCompleteHandler

0 голосов
/ 25 февраля 2011

Я не могу открыть ваши образцы файлов, потому что у меня есть только CS3, но я могу сказать вам, что я считаю наиболее вероятной причиной. Когда вы переопределяете эти клипы, а потом обнаруживаете, что они продублированы, есть ли какая-нибудь временная шкала воспроизведения, которая происходит в это время? Как в этом примере FLA?
Непреднамеренное клонирование

Проблема заключается в том, что при удалении фрагмента ролика из списка отображения, в который он был опубликован, этот список отображения находится в воспроизводимом фрагменте ролика, когда клип повторно воспроизводит старый кадр, или любым другим способом ». ожидает, что «клип будет там, где он был, когда вы опубликовали fla, он просто« клонирует »его и помещает обратно… или, скорее,« клонирует »то, что, как он знает, был бы, если бы вы его еще не переместили , Это то, что я проиллюстрировал выше. Я перезаписываю клип foo, случайным образом размещаю его где-нибудь на сцене, затем, когда мувиклип возвращается к кадру 1, он обнаруживает, что «здесь должен быть foo, но его нет. Лучше создайте его».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...