2011-11-21 26 views
0

是否有任何方法可以用來了解我正在使用的兩個動畫片段中的哪一個在Flash中的時間軸「層」排列中位於上方或下方。通過as3代碼瞭解flash時間軸中的圖層順序

我問的是如果有兩個movieclips'a'和'b'。一個在Flash專業版的時間軸10層,第一層的'b'在第一層可以使用純as3代碼更改索引順序,以便在第一層的movieclip頂部的第10層上可視地保留動畫片段?

謝謝。 毗溼奴

回答

1

[[編輯]]

所附方法不會如果兩個目標對象是在一個共享父葉節點工作。


時間軸兒童總是在任何動作生成的孩子與時間線類相關聯。

例如

如果您有時間軸X,它擴展了ClassA,並且在類A中添加了子E,F,G,但時間軸X包含層B,C,D,每個層中都有一個符號, b在時間軸的底部,下面就可以觀察到:

child 5: G 
child 4: F 
child 3: E 
child 2: D 
child 1: C 
child 0: B 

要在felipemaia的回答擴大,我已經設計了下面的方法來確定哪些影片剪輯處於絕對高於其他。這尚未經過徹底測試,但應作爲您開發的基準。

function selectAbove(obj1:DisplayObject, obj2:DisplayObject):DisplayObject 
{ 

    var obj1_parentCount:int = parentCount(obj1); 
    var obj2_parentCount:int = parentCount(obj2); 

    var target:DisplayObject; 
    var other:DisplayObject; 

    if (obj1_parentCount > obj2_parentCount) 
    { 
     target = obj1; 
     other = obj2; 
    } 
    else 
    { 
     target = obj2; 
     other = obj1; 
    } 

    var container:DisplayObjectContainer = 
     (target is DisplayObjectContainer) ? target as DisplayObjectContainer : target.parent ; 

    var container_last:DisplayObjectContainer; 

    var sharedParent:DisplayObjectContainer; 

    while(container) 
    { 
     if(container.contains(other)) 
     { 
      sharedParent = container; 
      break; 
     } 

     container_last = container; 
     container = container.parent; 
    } 

    if(!sharedParent) 
    { 
     throw new Error("An object does not maintain its parent in the display heirarchy!"); 
    } 

    var ret:DisplayObject; 

    if(container == other) 
    { 
     ret = target; 
    } 

    return container != other ? 
     container.getChildIndex(container_last) < container.getChildIndex(other) ? 
      other : 
      target 
     : 
     target 
    ; 
} 

function parentCount(obj:DisplayObject):int 
{ 
    var ret:int = 0; 

    while(obj) 
    { 
     ret++; 
     obj = obj.parent; 
    } 

    return ret; 
} 

此方法適用於嵌套顯示層次結構。我沒有測試過這個100%,但最初的病例按預期完成。

祝你好運!

+1

男人!這很有幫助! :))我的意思是,不只是代碼,而是概念。萬分感謝 !我打算將此附加到我的實用程序庫中! – Vishnu

+0

真棒!很高興我能幫上忙! – stat

1

要驗證這DisplayObject是否在上面,你就要有自己的指標與方法getChildIndex()比較:

var mc1 : MovieClip; 
var mc2 : MovieClip; 

// THIS CODE ASSUMES THAT mc1 and mc2 HAVE THE SAME PARENT 
var parentMC : MovieClip = MovieClip(mc1.parent); 

var topmost : MovieClip = parentMC.getChildIndex(mc1) < parentMC.getChildIndex(mc2) ? mc1 : mc2; 

誰擁有最低的指數之一就是最上面的一個。

編輯:

只要影片剪輯具有相同的父,你可以操縱的對象的索引與swapChildren()swapChildrenAt()setChildIndex()。所以帶來了影片剪輯到最前,你會做MovieClip(parent).setChildIndex(this, 0);

+0

如果您問如何切換影片剪輯的順序,是的,無論圖層如何(只要它們都在同一父級上),都可以查看我的編輯。 – felipemaia

+0

這不是,我在找什麼,好吧,我現在有這個想法。谷歌告訴我;) – Vishnu

0

我不認爲有在ActionScript的背景層,但你可以決定哪些的DisplayObject情況下,進一步利用起來:

DisplayObjectContainergetChildIndex()

+0

是的,我知道這一個。但我問的是如果有兩個movieclips'一'和'B'。一個在Flash專業版的時間軸10層,第一層的'b'在第一層可以使用純as3代碼更改索引順序,以便在第一層的movieclip頂部的第10層上可視地保留動畫片段? – Vishnu

+0

@VishnuAjit一個可憐的和不完整的問題並沒有打開我當時的downvote的有效答案。 – Marty