切换深度会导致MC重复

时间:2011-02-24 03:15:24

标签: actionscript-3

这是前一个问题的重新发布,这次有更多信息。

文件:2shared.com/file/hRKhEiqh/Script_Test.html2shared.com/video/UZNmqzXt/a_anconeus.html

在我的机器上使用Flash Professional CS5中的Actionscript 3.0中的新.fla项目可以重现此问题。这是我原始问题的编辑,包含更多信息。

我正在开发一个加载外部SWF的项目,并通过实例名称搜索匹配的关键字,即'drag'和'drop'来识别movieclip匹配,然后将事件监听器附加到包含D& D事件的MC听众和代码。

具体问题是切换动态加载的外部SWF文件中的Movieclips的深度。

我遇到问题的具体命令是:

swapChildrenAt,setChildIndex,swapChildren,removeChild / addChild。我已经尝试了所有四个同样的重复问题。让我解释一下。

单击可拖动的MC时,它会移动到动态加载的SWF的顶部索引,因此它在该SWF中的所有其他内容上方可见。问题是尝试任何这些命令都会复制MC。会发生什么:

MC上的MOUSE_DOWN事件触发: 目标MC的索引记录为'2',我们将切换到的索引是'20'(SWF的最大索引) 在目标MC父级上调用setChildIndex:mc.parent.setChildIndex(mc,(mc.parent.numChildren-1)) MC移动到索引20然后MC的另一个实例在它之前定位的层(索引2)处创建,这发生在MOUSE_DOWN事件完成之后,我不确定是什么时候。

使用附加到舞台的EVENT.ADDED_TO_STAGE侦听器确认此副本,以捕获添加到舞台的MovieClip类型的每个对象。我已经检查了SWF以确认没有重复的MovieClip,这些痕迹也证实了这一点。

类似的帖子提到了相同的重复问题,但没有人找到我认为可以解决的解决方案。

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-index而不是在顶部。不幸的是,由于我没有构建外部SWF,因此无法解决这个问题。

要复制此行为,您需要一个带有两个至少两个MC的外部AS3 SWF,其实例名称为“drag01”和“drop01”,或者与关键字“drag”和“drop”匹配的内容。将String变量'SWF'指向该文件,您应该看到重复问题。

谢谢和问候 卡梅伦

编辑:新修剪的代码,复制到具有相同错误的空白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 :(得分:0)

我无法打开您的示例文件,因为我只有CS3,但我可以告诉您我认为最可能的原因。当您重新显示这些剪辑然后发现它们已经重复时,是否有任何类型的时间线播放同时发生?就像在这个样本fla?中 Unintentional cloning

问题在于,当您从发布它的显示列表中删除动画片段时,该显示列表位于正在播放的动画片段中,当片段重新播放旧帧时,或者以任何其他方式“我希望“剪辑成为你发布fla时的位置,它只是”克隆“它并把它放回去......或者更确切地说,它”克隆“它知道如果你还没有移动它会是什么。这就是我在上面的fla中所说明的内容。我重新设置了foo剪辑,随机将它放在舞台上的某个地方,然后当movieclip循环回到第1帧时,它发现“这里应该有一个foo,但是没有。更好的制作一个。”

答案 1 :(得分:0)

神秘解决了:)

看着你的swf我可以看到它有两个帧,所以一旦你开始拖动,下一帧渲染并且对象回来。

为了对此进行测试,我将swf.stop();添加到了onCompleteHandler