ADOBE/ ActionScript

flash 플래시 as3.0 디스플레이 오브젝트 복사 관련 (sprite, moveclip 등등)

AlrepondTech 2012. 11. 7. 15:22
반응형

 

 

 

 

=================================

=================================

=================================

 

 

 

 

 

객체 타깃을 복사하기.

function cloneDisplayObject(target):Object
{

     var targetClass:Class = Object(target).constructor;
     var duplicate = new targetClass();

      return duplicate ;

}

평범한 복사 아래 출처 내용에 심오하게 복사하는 방법이 적혀있다.

출처: http://bbs.freecount.net/bbs/bbs.php?m=view&bid=study_6&id=170&page=1&cate=&q=&sopt=

 

 

이번강좌에서는 2.0에서 존재했던 duplucateMovieClip과 유사한 기능을 구현한다.

3.0에서는 구조적프로그래밍을 강조하다보니 유연성을 희생한 면이 있다.

그래서 어찌보면 있어야될것들도 존재하지 않는 문제아닌 문제점이 생겼다.

구조가 아닌 유틸리티로 빠진것들도 있구 하여간 그렇다....

이번시간에는 그중에 자주쓰던 더플리케이트무비클립과 유사한성격을 구현한다.

첨부된파일은 내가 테스트를 하기위해 넣어놓은것이다.

 

3.0에서는 여전히 클래스들의 부모는 모두 오브젝트이다.

하지만 무비클립의 직계 부모는 2.0처럼 오브젝트가 아니다. 이부분이 문제가 생기는데 여러가지 골치아픈상황이생긴다.

그냥 한방에 해결할수있는 메소드나 클래스가 디폴트로 제공되었다면 얼마나 좋을까마는 그런것이 존재하지 않기때문에 직접만들어야한다.

여기서 자칫하면 바이트 어레이를 써야되지 않는가 하는 오류를 접할수있다.

 

선행조건은 이미 화면상에 배치된 오브젝트들에 대한 복제이다. 이것은 이미 화면상에 디스플레이 오브젝트가 동작하고있는 (예를 들어

맨처음 배치된후에 콤포넌트등 여러가지 조작을 해서 화면이 바뀐상태) 상태도 그대로 복제되어야 복제라고 할수있다.

바이트 어레이를 써서 복제하는것은 amf 의 오브젝트를 복사하는것일뿐 복제가 아니다.

바이트 어레이를 써서 시도를 아래와같이하였다.

    import flash.display.Sprite;
    import flash.net.registerClassAlias;
    import flash.utils.ByteArray;

var test: Sprite = new Sprite(); 
test.addChild(new aaa());
var temp: ByteArray = new ByteArray(); 
temp.writeObject( test); 
temp.position = 0;

var duplicate: Sprite=new Sprite();

var obj:Object=temp.readObject();
for(var i:String in obj){
 trace(i+":"+obj[i]);
}

//이시점에서 내용물이 출력된다. 모든 들어있는사항이 뽑혀나온다. 여기까지는 좋다.

하지만 프로퍼티의 내용들을 모두 빠짐없이 복제대상에 넣어야되는데 이것만 가지고는 복제가 불가능하다.

-----------------------출력결과-----------------------

x:0
y:0
blendMode:normal
rotation:0
scale9Grid:null
alpha:1
mouseChildren:true
name:instance2
scrollRect:null
cacheAsBitmap:false
accessibilityProperties:null
scaleX:1
visible:true
soundTransform:[object Object]
width:147.95000000000002
tabChildren:true
opaqueBackground:null
hitArea:null
tabEnabled:false
height:120
doubleClickEnabled:false
buttonMode:false
contextMenu:null
accessibilityImplementation:null
mouseEnabled:true
mask:null
focusRect:null
tabIndex:-1
transform:[object Object]
useHandCursor:true
scaleY:1
filters:
//--------------------------------------------------

 

그럼이제 아래 예제를 본다.

 

 

bbb라는 인스턴스명을 가진 무비클립을 이미 스테이지에 놓았다.

bbb는 두개의 프레임이구 두번째프레임은 빨간색이다.

 

 

 import flash.display.*;
 import flash.geom.Rectangle;


function cloneDisplayObject(target)
{
var targetClass:Class = Object(target).constructor
var duplicate = new targetClass() 
duplicate.transform = target.transform;
duplicate.filters = target.filters;
duplicate.cacheAsBitmap = target.cacheAsBitmap;
duplicate.opaqueBackground = target.opaqueBackground;
if (target.scale9Grid) {
var rect:Rectangle = target.scale9Grid;
rect.x /= 20, rect.y /= 20, rect.width /= 20, rect.height /= 20;
duplicate.scale9Grid = rect;
}
if (target.hasOwnProperty("numChildren"))
{
for (var i = 0 ; i < target.numChildren; i ++)
{
duplicate.addChild(cloneDisplayObject(target.getChildAt(i)));
}
}
return duplicate;
}

 

 bbb.gotoAndStop(2);
 var n:MovieClip=cloneDisplayObject(bbb)
 addChild(n);
 n.gotoAndStop(2);
 n.x=200;
 
 var o:DisplayObject=cloneDisplayObject(n)
 addChild(o);
 o.x=350;

 

 

 

 

 

//-----------------------------------------

위처럼 기본적인것들을 복제해서 넣어 놓으면 그대로 작동한다. 이것이 가능한이유는 물론 무비클립이 다이너믹 클래스기때문에 가능하다. 외부에서 데이터를 넣어줄수있기에 그것을 응용한것이다.

하지만 위에서 봤듯 복제의 메커니즘은 해당 무비클립의 수퍼클래스를 알아내어 그대로 생성하구(무비클립이 될것이므로 무비클립의 기본기능들은 모두 상속받게될것이다) 다시 거기다 필요한 양념들을 추가로 넣는것이다.

뭔가 부족해보이는데 여기서 우리는 아까 알아본 바이트 어레이를 적절해 추가해서

완전한 복제가 가능하도록할수도있다. 이렇게되면 좌표까지도 똑같아진다.

경우에따라 여러가지 상황이 발생할수있으니 두개를 모두 만들어놓으면 매우 편리하지 않을까싶다.

 

제발좀 이런건 디폴트로좀 만들어달란 말이쥐쥐주쥐쥐쥐 도비

 

 

=================================

=================================

=================================

 

 

 

반응형