2011-02-24 84 views
0

這是此次更新信息的前一個問題的重新發布。切換深度會導致重複MC

的文件:2shared.com/file/hRKhEiqh/Script_Test.html2shared.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。什麼情況是這樣的:

對MC

MOUSE_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"); 
} 
+0

你可以添加一個鏈接,我們可以測試這個?我經常做類似的事情,我從來沒有見過這種行爲。如果它與你裝載的SWF文件的設置有關,那麼嘗試用虛擬文件重新創建你的問題是毫無意義的。 – weltraumpirat 2011-02-24 07:31:28

+0

PS:我可以說的一件事是:你的代碼包含錯別字。有時你使用'drag.onTarget',有時候使用'drag.ontarget'。由於您始終使用MovieClip引用,並且MovieClip是動態的,因此編譯器不會抱怨這一點。但你一定要修復它。 – weltraumpirat 2011-02-24 07:34:25

+0

嗨,這裏上傳: 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

回答

0

謎解決:)

看着你的swf我可以看到它有兩幀,所以一旦您開始拖移,下一幀渲染和對象回來。

測試這個我添加到swf.stop(); YOUT onCompleteHandler

+0

你是個聰明人,你已經解決了它。添加swf.stop();已經解決了這個問題,它是一個2幀的SWF。我將把支票用於警告用戶使用多幀SWF,感謝您的幫助。 – Cameron 2011-02-27 04:30:36

0

我無法打開示例文件,因爲我只有CS3,但我可以告訴你我的想法是最可能的原因。當你重新制作這些剪輯,然後再發現它們重複時,在這段時間內是否有任何種類的時間線播放?就像在這個示例fla?
Unintentional cloning

的問題是,當您從其所公佈的顯示列表中的影片剪輯,但顯示列表是一個影片剪輯正在播放,在夾子重新播放舊框架,或在任何其他方式「預計」剪輯是在你發佈fla時的位置,它只是「克隆」它並將其放回......或者說,它「克隆」它知道它應該是什麼,已經移動了它。這就是我在上面的fla中所說的。我重新剪輯foo剪輯,隨機將它放置在舞臺上的某個位置,然後當movieclip循環回到第1幀時,它發現「這裏應該有一個foo,但沒有,最好製作一個。」

+0

I確定主FLA的第1幀只有一個腳本,外部SWF上也沒有腳本。跟蹤語句有希望成爲一個有用的線索,特別是如果您只刪除了剪輯並且不重新添加它,會自動出現,並且它會在任何函數之外執行它。但是,感謝您的建議,請繼續下去。 – Cameron 2011-02-25 11:59:21

+0

onCompleteHandler內movieclip'swf'的時間軸上存在多少幀?它是否大於1? – scriptocalypse 2011-02-25 15:42:33

+0

Pret肯定它只有1幀沒有動作。 – Cameron 2011-02-26 01:26:49