这是前一个问题的重新发布,这次有更多信息。
文件:2shared.com/file/hRKhEiqh/Script_Test.html和2shared.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");
}
答案 0 :(得分:0)
我无法打开您的示例文件,因为我只有CS3,但我可以告诉您我认为最可能的原因。当您重新显示这些剪辑然后发现它们已经重复时,是否有任何类型的时间线播放同时发生?就像在这个样本fla?中 Unintentional cloning
问题在于,当您从发布它的显示列表中删除动画片段时,该显示列表位于正在播放的动画片段中,当片段重新播放旧帧时,或者以任何其他方式“我希望“剪辑成为你发布fla时的位置,它只是”克隆“它并把它放回去......或者更确切地说,它”克隆“它知道如果你还没有移动它会是什么。这就是我在上面的fla中所说明的内容。我重新设置了foo剪辑,随机将它放在舞台上的某个地方,然后当movieclip循环回到第1帧时,它发现“这里应该有一个foo,但是没有。更好的制作一个。”
答案 1 :(得分:0)
神秘解决了:)
看着你的swf我可以看到它有两个帧,所以一旦你开始拖动,下一帧渲染并且对象回来。
为了对此进行测试,我将swf.stop();
添加到了onCompleteHandler