這是此次更新信息的前一個問題的重新發布。切換深度會導致重複MC
的文件:2shared.com/file/hRKhEiqh/Script_Test.html和2shared.com/video/UZNmqzXt/a_anconeus.html
這個問題是在Flash Professional CS5在ActionScript 3.0中新的.fla項目在我的機器上重複的。這是我原始問題的更多信息。
我工作的一個項目來加載外部SWF的,並通過實例名稱匹配的關鍵詞,即「拖」和「下降」,以確定影片剪輯的比賽,然後把事件偵聽器,這些MC的其中包含d & d搜索事件監聽器和代碼。
具體問題是嵌套在動態加載的外部SWF文件中的Movieclips深度的切換。
如果我有麻煩的是具體的命令:
swapChildrenAt,setChildIndex,swapChildren,removeChild之/的addChild。我已經嘗試了所有四個同樣的重複問題。讓我解釋。
當可拖動的MC被點擊時,它被移動到動態加載的SWF的頂部索引,因此它在該SWF中的所有其他部分都可見。問題是,嘗試任何這些命令都重複MC。什麼情況是這樣的:
對MCMOUSE_DOWN事件觸發:目標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以確認沒有重複的影片剪輯,這些痕跡也證實了這一點。
類似的帖子提到相同的重複問題,但沒有人有我找到的解決方案將工作在我的情況。
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,因此這不會起到解決方案的作用。
要複製此行爲,您需要一個具有兩個至少兩個實例名稱爲「drag01」和「drop01」的MC的外部AS3 SWF,或者與關鍵字'drag'和'drop'相匹配的東西。將字符串變量'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");
}
你可以添加一個鏈接,我們可以測試這個?我經常做類似的事情,我從來沒有見過這種行爲。如果它與你裝載的SWF文件的設置有關,那麼嘗試用虛擬文件重新創建你的問題是毫無意義的。 – weltraumpirat 2011-02-24 07:31:28
PS:我可以說的一件事是:你的代碼包含錯別字。有時你使用'drag.onTarget',有時候使用'drag.ontarget'。由於您始終使用MovieClip引用,並且MovieClip是動態的,因此編譯器不會抱怨這一點。但你一定要修復它。 – weltraumpirat 2011-02-24 07:34:25
嗨,這裏上傳: http://www.2shared.com/file/hRKhEiqh/Script_Test.html 和http://www.2shared.com/video/UZNmqzXt/a_anconeus.html – Cameron 2011-02-24 20:30:49