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)
- 다른 자식의 위치에 영향을주지 않고 표시 목록에서 두 어린이 위치를 서로 바꿉니다. -
swapChildrenAt(index1,index2)
- 인덱스로 위치한 자식을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
가 가장 상위에 있습니다.
표시 객체에는 부모가 하나만있을 수 있습니다. 따라서 자식이 이미 부모를 가지고 있고 다른 객체에 추가하면 이전 부모에서 제거됩니다.
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-order)를 나타내는 다른 매개 변수를 전달합니다. 0
은 가장 아래의 위치 / 레이어입니다.
this.addChild(redCircle);
this.addChild(greenCircle);
this.addChildAt(blueCircle,0); //This will add the blue circle at the bottom
이제 파란 동그라미가 형제 밑에 있습니다. 나중에 자식 인덱스를 변경하려는 경우 자식 부모에 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)
동일한 결과를 생성합니다.
표시 객체 제거
개체를 제거하려면 그 반대가 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를 사용하여 타임 라인에서 만든 표시 객체의 상위를 코드를 통해 조작하면 해당 자식은 타임 라인에서 더 이상 자동으로 제거되지 않으므로 코드를 통해 제거해야합니다.
레이어링
한 세트의 표시 객체가 다른 객체 세트 (예 : 머리 위의 화살표, 방금 폭발 한 무언가에 대한 폭발 등)보다 위에 있어야한다고 결정할 수있는 상황이있을 수 있습니다. 가능한 한 간단하게이 작업을 수행하려면 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()
하여 내용을 수동으로 전환하는 것입니다.
관리자 클래스는 모든 하위 프레임 클래스를 준비해야하며 전환이 호출 될 때마다 다음과 유사한 함수를 사용할 수 있습니다.
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]
}
물론, 문자열 세트는 사전 정의되어야합니다. 예를 들어, 소개 화면에는 게임을 시작하는 두 개의 단추, 예를 들어 "게임 시작"및 "음소거 시작"이있을 수 있으며 단추는 다른 이벤트를 보내야 처리됩니다 매니저 클래스에서 다르게
이 패턴은 필요한만큼 깊게 갈 수 있습니다. 프로젝트의 프레임에 여러 프레임이있는 MovieClip이 있으면이 메서드를 사용하여 스프라이트에 분리 할 수도 있습니다.