ActionScript 3
表示オブジェクトの操作
サーチ…
構文
-
addChild(child)
- このオブジェクトの子ツリーに最上位の要素として新しい項目を追加します。 -
addChildAt(child, index)
- 指定された位置にあるこのオブジェクトの子ツリーに新しい項目を追加します。一番下の項目のインデックスは0です。 -
getChildAt(index)
- 指定されたインデックスを持つ子を返します。 -
getChildIndex(child)
は、このオブジェクトの直接の子のインデックスを返します。それ以外の場合は例外がスローされます。 -
removeChild(child)
- このオブジェクトの子ツリーから、指定された直接子を削除します。付属子供の親が等しくない場合に、例外をスローしthis
。 -
removeChildAt(index)
- 参照ではなくインデックスで選択された子を削除します。子ツリーがこの幅でない場合は例外をスローします。 -
removeChildren(beginIndex:int = 0, endIndex:int = 0x7fffffff))
- Flash Player 11で追加され、インデックス範囲で子のサブセットを削除します。 -
setChildIndex(child,index)
- 子のインデックスを新しい値に変更し、その間のすべての子をシフトして解放された位置に移動します。 -
swapChildren(child1,child2)
- 表示リスト内の2swapChildren(child1,child2)
の位置を入れ替えます。他の子の位置には影響しません。 -
swapChildrenAt(index1,index2)
- インデックスによって配置された子をスワップします。
備考
表示リストは実際にはツリーであり、深さの最初のアルゴリズムで視覚化されます。以前にリストされたオブジェクトはすべて前に表示され、後でリストされるオブジェクトによって隠されることがあります。ツリーに対して使用できるすべてのテクニックは、表示リストの操作に適用できます。
表示リストの概要
AS3では、表示アセットは表示リストに追加されるまで表示されません。
AIR / Flashランタイムには階層表示構造(親が子を持つことができる親子関係)があり、 stage
は最上位の親です。
表示リストに何かを追加するには、 addChild
またはaddChildAt
を使用します。円を描き、それを表示リストに追加する基本的な例を次に示します。
var myCircle:Shape = new Shape();
myCircle.graphics.beginFill(0xFF0000); //red
myCircle.graphics.drawCircle(25, 25, 50);
myCircle.graphics.endFill();
this.addChild(myCircle); //add the circle as a child of `this`
上の例のオブジェクトを見るには、 this
(コードの文脈)も表示リスト上にある必要があります。 AS3では、 stage
は最上位の親です。
表示オブジェクトは親を1つしか持てません。したがって、子が既に親を持っていて、それを別のオブジェクトに追加すると、その子は前の親から削除されます。
Zオーダー/レイヤー
前の例のコードを3つのサークルに複製したとします。
var redCircle:Shape = new Shape();
redCircle.graphics.beginFill(0xFF0000); //red
redCircle.graphics.drawCircle(50, 50, 50); //graphics.endFill is not required
var greenCircle:Shape = new Shape();
greenCircle.graphics.beginFill(0x00FF00); //green
greenCircle.graphics.drawCircle(75, 75, 50);
var blueCircle:Shape = new Shape();
blueCircle.graphics.beginFill(0x0000FF); //blue
blueCircle.graphics.drawCircle(100, 100, 50);
this.addChild(redCircle);
this.addChild(greenCircle);
this.addChild(blueCircle);
addChild
メソッドは、同じ親の他のすべての要素の上に子を追加するので、 addChild
を使用したのと同じ順序で項目を重ね合わせた結果が得られます。
あなたが兄弟の相対的な階層化された子を必要とするならば、 addChildAt
を使うことができます。 addChildAt
使用すると、子が置かなければならないインデックス(zオーダー)を示す別のパラメータを渡します。 0
は最下位位置/層である。
this.addChild(redCircle);
this.addChild(greenCircle);
this.addChildAt(blueCircle,0); //This will add the blue circle at the bottom
今、青い円がその兄弟の下にあります。 setChildIndex
のインデックスを変更する場合は、子の親に対してsetChildIndex
メソッドを使用できます。
this.setChildIndex(redCircle, this.numChildren - 1); //since z-index is 0 based, the top most position is amount of children less 1.
これは赤い円を再配置し、他のすべての上にあるようにします。上記のコードは、 this.addChild(redCircle)
とまったく同じ結果をthis.addChild(redCircle)
ます。
表示オブジェクトの削除
オブジェクトを削除するには、逆の持っているremoveChild
とremoveChildAt
メソッドだけでなく、 removeChildren
方法を。
removeChild(redCircle); //this will take redCircle off the display list
removeChildAt(0); //this will take the bottom most object off the display list
removeChildren(); //this will clear all children from the display list
removeChildren(1); //this would remove all children except the bottom most
removeChildren(1,3); //this would remove the children at indexes 1, 2 & 3
イベント
子が表示リストに追加されると、その子に対していくつかのイベントが発生します。
-
Event.ADDED
-
Event.ADDED_TO_STAGE
逆に、削除イベントもあります。
-
Event.REMOVED
-
Event.REMOVED_FROM_STAGE
Adobe Animate / Flash Professional
FlashProfessional / Adobe Animateタイムラインを扱う場合、タイムラインに何かを追加すると、ディスプレイリストのニュアンスが自動的に処理されます。それらはタイムラインによって自動的に追加され、ディスプレイリストから削除されました。
しかし、次の点に留意するとよいでしょう:
タイムラインによって作成された表示オブジェクトの親子(addChild / setChildIndexを使用して)を操作すると、その子はタイムラインによって自動的に削除されなくなり、コードで削除する必要があります。
レイヤリング
1つのセットの表示オブジェクトが、別のオブジェクトセット、たとえば頭の上の矢、爆発したものの爆発などの上に常にあるべきであると決める場合があります。これをできるだけ簡単に実行するには、 Sprite
のセットを作成し、下から上に順番に配置し、「下」のオブジェクトに使用されているレイヤの上に設定された「上」のオブジェクトをすべて追加します。
var monsters:Vector.<Monster>;
var bullets:Vector.<Bullet>; // desired: bullets strictly above monsters
var monsterLayer:Sprite=new Sprite();
var bulletLayer:Sprite=new Sprite();
addChild(monsterLayer);
addChild(bulletLayer);
その後、いつでもあなたは追加Monster
、表示リストにに追加monsterLayer
、そしてあなたが追加するたびにBullet
、に追加bulletLayer
所望の効果を達成するために。
表示リストからすべてのオブジェクトを削除する
Flash Player 11以降をターゲットにしている場合は、組み込みのremoveChildrenメソッドがすべての子を削除するための最良の方法です。
removeChildren(); //a start and end index can be passed
従来のアプリケーションでは、同じことをループで実行できます。
while (numChildren > 0) {
removeChildAt(0);
}
フレームから手動コンテンツ切り替えへの移行
初期のFlashデベロッパーは、Flash Playerでネイティブに使用できるフレームを使用して、アプリケーションのさまざまな画面をホストします(ほとんどの場合、ゲームです)。最終的には、フレームを使用し、この問題を見落とし、フレーム構造を保持する方法を模索するだけでなく、複雑なフレームを使用する際の障害を取り除くため、何かが間違っているという問題が発生する可能性があります。この問題を解決するには、 Sprite
子孫クラスを使用するか、Adobe Flash CSで設計したものに単一フレームのMovieClip
としてフレームをエクスポートし、 addChild()
およびremoveChild()
をaddChild()
て内容を手動で切り替えます。
マネージャクラスはすべての子フレームクラスを準備しておく必要があり、トランジションが呼び出されるたびに、これに似た関数を使用できます。
var frames:Vector.<DisplayObject>; // this holds instances to ALL children
var currentFrame_alt:int; // current frame. Can't use the property
function changeFrame(frame:int):void {
removeChild(frames[currentFrame_alt]);
addChild(frames[frame]);
currentFrame_alt=frame;
}
すべての子供たちは、両方の派遣とは、とのイベントを聞くことができEvent.ADDED_TO_STAGE
後に起こるものは何でものためのエントリポイントとして使用gotoAndStop()
そのフレームをターゲット、および任意の出力遷移はで聞かれている文字列に基づいてイベントとしてコード化することができMain
クラスそれは次に移行を実行する。
frames[0].addEventListener("startGame",startGame); // assuming frame 0 is a "Play" button
function startGame(e:Event):void {
changeFrame(1); // switch to frame 1 - will display frames[1]
}
もちろん、イントロ画面にはゲームを開始するための2つのボタン、例えば「ゲーム開始」と「ミュートを開始」があり、ボタンは異なるイベントを送出して処理されるはずですマネージャークラスでは違っています。
このパターンは必要なだけ深く進むことができます。プロジェクトのフレームに複数のフレームを含むMovieClipが含まれている場合は、このメソッドでスプライトに連結解除することもできます。