플래시 플레이어에는 AVM이라는 액션스크립트 판독/실행기와 렌더링을 담당하는 렌더러가 있다. enterFrame이벤트인 경우에는 frameRate에 의존하여 실행속도(실행횟수)를 결정하게 되는데 마우스 이벤트인 경우에는 재생속도와 관계없이 독립적으로 실행을 한다. 따라서 frameRate가 낮을 경우에 버튼등을 클릭하여 화면에 표현하려면 다음 렌더링엔진이 실행할 때 까지 기다려야한다. 즉 frameRate를 초당1씩 실행하고 실행시 바로 클릭하여 어떤 액션을 화면을 통해 보여진다면 1초뒤에 클릭한 액션이 가시적으로 표현이 된다.
그러한 경우 AS1에서도 제공되었던 updateAfterEvent()를 호출하여 강제로 렌더러를 실행시킨다. updateAfterEvent가 호출되는 즉시 화면이 갱신되므로 frameRate에 영향을 받지않는 마우스 이벤트를 구현할 수 있게 된다.
Posted by 버터백통
마우스를 이용하여 많은 작업을 하다보면 현재 이벤트를 반환하는 객체상에 마우스 좌표를 전역 값으로 사용해야 하는 경우가 종종 발생한다. AS1에서는 _root._xmouse와 _root._ymouse라는 속성을 사용하여 전역(절대)좌표를 알아 낼 수 가있었는데 AS3으로 오면서 localToGlobal라는 메소드를 통해 전역좌표 값을 알아내야한다.
localToGlobal를 사용하기 위해서는 마우스이벤트에서 받은 지역 좌표 값을 저장한 Point와 함께 사용한다.

이벤트를 발생하는 객체.localToGlobal( 객체의 지역좌표값 )

가령 e로 넘어오는 객체의 지역 좌표를 localPoint라는 포인트에 저장하고 전역좌표로 변환하는 변수를globalPoint 라고 한다면 아래와 같이 변수를 선언하면 된다.
var localPoint:Point = new Point( e.localX , e.localY );
var globalPoint:Point = e.target.localToGlobal( localPoint );

경로에 해당하는 객체의 지역좌표 값을 localToGlobal()를 통하여 전역 좌표값으로 변환한다.
Posted by 버터백통
외부에서 이미지 파일을 불러오는 것은 컴파일시 [Embed]를 사용하여 swf파일안에 포함시킬 수 있다. 하지만 실행중에 이미지를 불러오려면 Load라는 클래스를 사용하여야한다. Load클래스는 이미지파일이나 비디오등의 visual관련된 파일을 불러오는 역할을 담당하고 URLLoader는 데이터를 주고 받는데 사용한다.

Loader를 통해 불러올 수 있는 파일은 jpg , gif , png , swf가 있고 load라는 메서드를 통해 파일을 불러온다.
외부의 파일로 접근하기 위해서는 Loader클래스 단독적으로 사용할 수 없다. 서버나 로컬에 접근할 수 있는 통로를 담당하는 URLRequest라는 클래스와 함께 사용한다.
 var ldr:Loader = new Loader();
ldr.load( new URLRequest( "링크" ));

위의 코드는  로더 클래스를 통해 외부 이미지를 불러오는 명령이다. 그리고 호출이후 어떠한 상태인지를 알수 있는 여러가지 이벤트를 사용할 수 있다.

* 이벤트
Event.OPEN : 로드가 시작될 때 전달됩니다.

ProgressEvent.PROGRESS : 파일이 로드되는 동안 계속해서 발생.

Event.COMPLETE : 파일 다운로드가 완료된 후, 로드된 무비 클립의 메서드와 속성이 사용 가능한 상태가 되기 전에 전달.

Event.INIT : 로드된 SWF 파일을 조작할 수 있도록, 로드된 SWF 파일의 속성과 메서드가 액세스 가능한 상태가 된 후에 전달됩니다. 이 이벤트는 complete 핸들러에 앞서 전달됩니다. 스트리밍 SWF 파일의 경우 init 이벤트는 complete 이벤트보다 훨씬 더 이전에 발생할 수 있습니다. 대부분의 경우에는 init 핸들러를 사용합니다.

HTTPStatusEvent.HTTP_STATUS : 로드 중 실패한 HTTP요청이 감지될 때 발생

IOErrorEvent.IO_ERROR : 파일을 로드할 수 없는 경우 또는 로드 프로세스 중 오류가 발생.

SecurityErrorEvent.SECURITY_ERROR :  보안샌드박스 때문에 로드할 수 없을 때 발생한다.

이러한 이벤트는 Loader클래스에 직접 사용하는 것이 아니고 contentLoaderInfo라는 속성에 리스너를 추가한다. contentLoaderInfo는 어떠한 대상이 로드될 때의 정보를 파악하여 제공하기 위해 설계된 것이다.

Loader클래스는 DisplayObjectContainer를 상속받은 클래스이다. 따라서 불러들인 컨텐츠는 Loader안에 존재하며 content속성을 통해서 컨텐츠에 접근할 수 있다.
가령 A.swf에 run라는 메서드가 있다. 이 A.swf파일을 ldr이라는 delegate로 불러들였을 때  run를 호출하기 위해서 다음과 같이 코딩한다.
var movie:* = ldr.content;
movie.run();

위에 movie의 데이터타입을 *로 설정한것은 현재 이 프로젝트에는 run이라는 메서드가 없으므로 에러를 발생한다. 이를 방지하기 위한 처리이다.

* 외부에서 이미지파일의 데이터 자체를 받아오는 경우 인코더가 필요하며 ByteArray로 변환된 데이터를 loadBytes라는 명령문으로 이미지처리 할 수있다.
Posted by 버터백통

플래시에서 버튼심벌로 등록을 하면 4개의 상태 프레임이 나온다.
up과 over , down , hit이라는 프레임으로 심플버튼에서 역시 4개의 상태를 구분하는 upState,overState,downState, hitTestState 속성이 있다. 이 속성들은 대입식으로 디스플레이 오브젝트를 값을 설정하여야 하고 반드시 hitTestState를 설정하여야 버튼으로 작동하게 된다.

upState : 평상시의 디스플레이 상태
overState : 마우스 커서가 ht영역에 닿을 때의 디스플레이 상태
downState : 마우스로 클릭하였을 때의 디스플레이 상태
hitTestState : 버튼의 영역을 결정하는 곳으로 통상 버튼의 up영역을 사용한다.


var sbtn:SimpleButton = new SimpleButton();
sbtn.upState = createRect( 0xFF0000 , 100 , 100 );
sbtn.overState = createRect( 0x00FF00 , 100 , 100 );
sbtn.downState = createRect( 0x0000FF , 100 , 100 );
sbtn.hitTestState = sbtn.upState;
sbtn.addEventListener( MouseEvent.ROLL_OVER , onOver );
sbtn.addEventListener( MouseEvent.CLICK , onConfirm );
addChild( sbtn );
 
function createRect( color:int , width:int , height:int ):Shape
  {
   var rect:Shape = new Shape();
   rect.graphics.beginFill( color );
   rect.graphics.drawRect( 0,0, width , height );
   rect.graphics.endFill();
   return rect;
  }
 
function onOver( e:MouseEvent ):void
  {
   trace("SimpleButton Over.")
  }
 
function onConfirm( e:MouseEvent ):void
  {
   trace("확인을 눌렀습니다.")
  }


이 처럼 작성된 버튼에 마우스를 가져다 대면 "SimpleButton Over."라고 출력하게 된다. 또 버튼을 클릭하게 되면 "확인을 눌렀습니다."라는 메세지를 볼 것이다.

Posted by 버터백통
화면에 보여질 수 있는 객체는 디스플레이 오브젝트를 상속받은 것들이다. 예전에는 이러한 객체는 플래시툴을 이용하여 드로잉하고 그 객체를 불러 들여와 스크립트로 제어 하였지만 AS3에서는 액션스크립트만으로 드로잉을 할 수 있다. 물론 이쁘고 복잡한 효과는 어느 정도 버려야 한다.

앞서 디스플레이 리스트를 통해 계층구조를 살펴 보았다. 그 중에 드로잉만 가능한 객체는 Shape정도가 있는데 사용 용도에 따라 부모클래스를 정해야 한다. 단순히 그래픽만 그릴 것이면 Shape정도로 사용하면 될 것이고 안에 자식을 추가 할 수 있는 컨테이너를 만들 것이면 Sprite, 모션을 만들어야 한다면 MovieClip을 exteds해야 한다.

SimpleButton : up , over , down , hit영역 등이 있는 플래시에서 제공하는 버튼 심볼과 같은 클래스이다.
Shape : 단순한 드로잉이 가능 한 객체이다.
Sprite : 자식을 추가할 수 있는 컨테이너이자 드로잉도 가능하다. 단 타임라인은 제공하지 않는다.
MovieClip : 자식을 추가 할 수 있는 컨테이너이자 드로잉도 가능하면 타임라인을 제공한다.

이처럼 적절한 클래스를 상속받아 graphics를 이용하거나 upState ,overState...등을 통해 클래스 특징에 맞는 메서드를 이용하여 visual object를 만든다.
Posted by 버터백통

컨테이너의 인덱스 번호가 큰것이 앞으로 나와 보다 작은 인덱스의 객체를 가린다고 설명하였다. 그렇다면 이미 화면에 붙어있는 객체의 인덱스 순서를 바꾸어 앞으로 혹은 뒤로 이동시키고자 할때는 setChildIndex()를 사용한다.

* setChildIndex( 이동할 객체 , 이동할 인덱스번호 )
어떠한 컨테이너에 10개의 객체가 붙어있다고 가정하면 그 컨테이너의 인덱스 범위는 0~9까지 이다. 이 컨텐이너에 제일 앞에서 두번째인 8번인덱스에 객체를 붙이고자 한다면 setChildIndex( 객체 , 8 )이라고 입력하면 된다. 또는 특정 객체 green의 위치에 앞에 붙이고자 할때 green의 인덱스 번호를 구하기 위해서는 getChildIndex라는 메서드르 사용한다. setChildIndex( 객체, getChildIndex(green) ) 이 처럼 green의 인덱스값을 구하여 그 위치에 객체를 이동 시키면 green의 인덱스는 1증가하여 해당 객체 앞에 놓이게 된다.

var red:Shape = new Shape();
red.graphics.beginFill(0xFF0000)
red.graphics.drawRect(0,0,100,100)
red.graphics.endFill();
red.x = 50
addChild( red )

var green:Shape = new Shape();
green.graphics.beginFill(0x00FF00)
green.graphics.drawRect(0,0,100,100)
green.graphics.endFill();
green.x = 100
addChild( green )

var blue:Shape = new Shape();
blue.graphics.beginFill(0x0000FF)
blue.graphics.drawRect(0,0,100,100)
blue.graphics.endFill();
blue.x = 150
addChild( blue )

var gray:Shape = new Shape();
gray.graphics.beginFill(0x666666)
gray.graphics.drawRect(0,0,100,100)
gray.graphics.endFill();
gray.x = 80
gray.y = -50
addChild( gray )

setChildIndex( gray , getChildIndex(green) )

* getChildIndex( 인덱스번호를 알려는 객체 )
getChildIndex은 어떠한 특정 객체의 인덱스값을 반환하는 메서드이다.


* getChildAt( 인덱스번호 )
delegate한 객체의 이름을 모르고 인덱스 번호를 알고있을 때 해당 객체로 접근하는 메서드이다.

Posted by 버터백통

addChild또는 addChildAt을 통하여 디스플레이 컨테이너에 추가된 객체를 지우고자 한다면 removeChild()또는 removeChildAt()을 통하여 제거해야 한다.

* removeChild( 제거할 객체 )
removeChild는 제거할 delegate를 통해 객체를 제거한다.


* removeChildAt( 인덱스번호 )
removeChildAt는 컨테이너의 인덱스번호를 참조하여 배치된 객체를 제거한다. 만얀 컨테이너의 모든 객체를 지우고자 한다면 순환문을 이용하여 배치된 객체를 제거한다.

참고 : 디스플레이 리스트에서 removeChild를 통하여 리스트에서 지우면 렌더링 엔진에서만 삭제되는 것일 뿐 객체가 완전히 삭제되는 것은 아니다. 만약 삭제하려면 객체를 참조하는 모든 것을 null로 설정해야 한다.

Posted by 버터백통
앞서 디스플레이 리스트라는 것을 공부하였다. 디스플레이 리스트는 화면에 보일수 있도록 렌더러가 그리는 대상 목록이 되는데 이 목록에 추가하기 위해서는 new생성자를 통해 AVM2에 추가하고 addChld()와 addChildAt() 메서드를 통하여 목록에 추가한다.

var red:Shape = new Shape();    //생성자를 통해 AVM에 등록한다.
red.graphics.beginFill(0xFF00FF)
red.graphics.drawRect(0,0,100,100)
red.graphics.endFill();
addChild( red )                       //addChild()를 통해 디스플레이 리스트에 등록시킨다.

* addChild( 화면에 붙일 객체)
컨테이너에 추가할 객체를 매개변수로 받아 렌더링 엔진의 디스플레이 리스트에 등록한다.
기본적으로 컨테이너에는 배열처럼 정수인덱스로 상,하를 구분하게 되는데 나중에 화면에 붙은addChild가 인덱스 값이 이전 객체보다 1이 더 크다.

* addChildAt( 화면에 붙일 객체 , 인덱스 번호 )
컨테이너에 붙일 객체를 2번 째 매개변수의 값으로 인덱싱하여 디스플레이 리스트에 등록한다.

* 컨테이너의 인덱스
컨테이너에는 배열처럼 정수색인 인덱스를 통해 객체의 깊이를 설정할거나 배치할 수 있다. 이 값은 0부터 화면에 붙은 자식수-1 만큼의 범위를 갖는다.
addChild( red1 )    
addChild( red2 )    
addChild( red3 )    
위처럼 3개의 객체가 어떤 컨테이너에 자식으로 추가 되었다면 red3이 화면 제일 앞쪽에 배치되며 red1,red2를 가리게 된다. 그리고 인덱스의 값은 2에 위치하게 된다.

이러한 인덱스는 자식이 추가되면 자동으로 1씩 증가하며 범위내에 빈공간이 없도록 배치한다. 예전 AS1에서는 swapDepth나 dupliacetMovieClip , attachMovie..등을 통하여 인덱스를 설정하였는데 인덱스 중간에 빈값이 존재하고 개발자가 입력하는 값에 의존하였다. 따라서 이로인한 객체간 인덱스 충돌을 개발자가 신경써서 코딩하여야 했지만 이제는 자동으로 관리하게 되었다. 그리고 인덱스 범위내에 객체가 지워지면 자동으로 뒤에 객체들이 앞으로 당겨져 빈공간을 채워주도록 설계가 되었다. 단 addChildAt()을 통하여 이미 채워진 인덱스에 객체를 넣거나 범위를 벗어난 값으로 배치하려 하면 에러를 발생하게 된다.

* 부모 컨테이너의 교체
A.addChild( red1 )    
A.addChild( red2 )    
A.addChild( red3 )  
B.addChild( red1 )    <- red1을 B로 이동
위처럼 red1이 A에서 B로 이동하게 되었다. 예전 같으면 A에 red1을 제거하고 새로운 red1을 만들어 B객체에 넣어 주어야 했다. 하지만 AS3에서는 위의 코드처럼 A에 addChild한 상태임에도 불구하고 B에 다시 red1을 addChild하면 자동으로 A에서는 객체가 제거되고 B의 자식으로 붙게 된다. 따라서 A의 자식수는 2개이고 B의 자식수는 1의 값으로 설정된다.









Posted by 버터백통
디스플레이 리스트라는 것은 플레시플레이어의 렌더러를 통해 화면에 그려질 객체의 리스트이다. AS3를 인식할 수 있는 플래시 플레이어는 9버전 이상부터 지원하는데 AVM2(actionscript virtual Machine)라는 액션스크립트 판독/실행기와 렌더링을 담당하는 렌더러를 포함하고있다. AS3이전 버전의 AS는 무비클립이 생성될 때 자동으로 화면에 그려지게 되고 자신이 속한 부모를 바꿀 수 없었다. 만약 부모를 옮겨야 한다면 삭제 후 새로 생성하는 과정을 거쳐야만 했다. 하지만 새로운 렌더러는 이러한 기능을 대폭 개선하여 유연한 구조와 렌더링 프로세스의 개선에 중점을 두었다.

* 디스플레이 리스트 3원소
스테이지 :
스테이지는 디스플레이 계층 구조의 최상위이다. 한 개의 무비당 유일한 한개의 스테이지를 가지고 있으며 한개의 디스플레이 컨테이너(main application class)를 갖는다. 그리고 모든 디스플레이 객체는 stage를 통하여 접근 할 수 있다.

디스플레이 컨테이너 : 객체 안에 다른 자식 객체를 가질 수 있는 객체이며 자식을 포함 할 수 있는 스테이지도 디스플레이 객체 컨테이너이고 Sprite,MovieClip, Shape도 디스플레이 객체 컨테이너이다. 디스플레이 객체 컨테이너가 디스플레이 리스트에서 지워지면 해당 컨테이너 안의 자식들도 디스플레이 리스트에서 지워진다.

디스플레이 객체 : 디스플레이 오브젝트는 눈에 보이는 원소이다. MovieClip, Sprite는 디스플레이 컨테이너인 동시에 디스플레이 오브젝트이고 TextField는 디스플레이 오브젝트이다. 이러한 디스플레이 오브젝트를 화면에 보이고자 한다면 디스플레이 리스트에 등록되어진 컨테이너에 붙여야 화면에 보여지게 된다.

[ 디스플레이 리스트 계층 구조 1]

사용자 삽입 이미지

[ 디스플레이 리스트 계층 구조 2]

사용자 삽입 이미지

DisplayObject :
DisplayObject 클래스는 표시 목록에 배치할 수 있는 모든 객체의 기본 클래스입니다.

Bitmap :

Bitmap 클래스는 비트맵 이미지를 표시하는 표시 객체를 나타냅니다.

InteractiveObject :

InteractiveObject 클래스는 사용자가 마우스와 키보드를 사용하여 상호 작용할 수 있는 모든 표시 객체의 추상 기본 클래스입니다

MorphShape :

MorphShape 클래스는 표시 목록에서 MorphShape 객체를 나타냅니다. MorphShape 객체는 ActionScript에서 직접 만들 수 없으며, Flash 제작 도구에서 모양 트윈을 만들 때 함께 만들어집니다.

Shape :

Shape 클래스는 ActionScript 드로잉 API를 사용하여 가벼운 모양을 만드는 데 사용됩니다. Shape 클래스에는 Graphics 클래스의 메서드에 액세스할 수 있게 해 주는 graphics 속성이 포함됩니다.

StaticText :

이 클래스는 표시 목록의 StaticText 객체를 나타냅니다. ActionScript로는 StaticText 객체를 만들 수 없습니다. StaticText 객체를 만들려면 제작 도구를 사용해야 합니다.

Video :

Video 클래스를 사용하면 SWF 파일에 포함하지 않고도 응용 프로그램에서 라이브 스트리밍 비디오를 표시할 수 있습니다.

DisplayObjectContainer :

DisplayObjectContainer 클래스는 표시 목록에서 표시 객체 컨테이너 역할을 할 수 있는 모든 객체에 대한 기본 클래스입니다.

SimpleButton :

SimpleButton 클래스를 사용하여 SWF 파일에 있는 버튼 심볼의 모든 인스턴스를 제어할 수 있습니다. 제작 도구에서 버튼 인스턴스를 만든 후 SimpleButton 클래스의 메서드와 속성을 사용하여 ActionScript에서 버튼을 조작할 수 있습니다.

TextField :

TextField 클래스를 사용하면 텍스트 표시 및 입력을 위한 표시 객체를 만들 수 있습니다.

Loader :

Loader 클래스는 SWF 파일이나 이미지(JPG, PNG 또는 GIF) 파일을 로드하는 데 사용됩니다.

Sprite :

Sprite 객체는 무비 클립과 유사하지만, 타임라인이 없기 때문에 타임라인이 필요 없는 객체에 적합한 기본 클래스입니다.

Stage :

전역적으로 액세스할 수 없으며 DisplayObject 인스턴스의 stage 속성을 통해 액세스해야 합니다.

MovieClip :

MovieClip 클래스는 Sprite, DisplayObjectContainer, InteractiveObject, DisplayObject 및 EventDispatcher 클래스로부터 상속됩니다. Sprite 객체와 달리 MovieClip 객체에는 타임라인이 있습니다.


Posted by 버터백통
AS3.0 Cookbook/배열2008. 7. 20. 14:00

hash table은 원소의 번호가 달리없이 키로만 구성되어 있으므로 정수색인 배열처럼 for를 사용하여 원소로 접근할 수 가 없다. 따라서 키를 검사하는  for in문을 사용한다. for in문은 선택된 연관배열의 키를 특변 변수에 담아 그 이름과 값을 검색할 수 있다.

* for in 선언법
for( key  in Object ){
   // Action
}


가령 다음과 같은 도서 데이터를 검사할 수 있고 이들을 배열에 넣어서 sortOn을 하여 필요한 데이터로 정렬 또는 가공할 수 있다.
var book1:Object = { "writer":"이외수" , "title":"사람사는 마을", "cost":10000  };
var book2:Object = { "writer":"박한별" , "title":"연예계 생활", "cost":5000  };
var book3:Object = { "writer":"브루스" , "title":"men of world", "cost":18000  };
var book4:Object = { "writer":"오라일리" , "title":"cool codes", "cost":28000  };
for (var i:int=1; i<=4; i++) {
 for ( var atrb:String in this["book" + i] ) {
  trace( atrb , ":" , this["book"+i][atrb] );
 }
}


출력
cost : 10000
title : 사람사는 마을
writer : 이외수
cost : 5000
title : 연예계 생활
writer : 박한별
cost : 18000
title : men of world
writer : 브루스
cost : 28000
title : cool codes
writer : 오라일리

* for in 문은 내장된 속성까지 보여주지 않는다.

Posted by 버터백통
AS3.0 Cookbook/배열2008. 7. 20. 13:50

연관배열은 AS3에서 Object라는 클래스로 최상위 객체로 제공한다.
선언은 키와 값을 같이 작성하며 객체문자( {} )안에 작성한다.
var obj:Object = { "키" : 값 , "키":값 ... }

접근이나 출력은 해당 배열의 키명으로 접근한다.
var obj:Object = {  "country":"korea" ,  "maker":"hyundai" , "model":"pony" , "year":1982  }
trace( obj.model )  // 출력 : pony

Posted by 버터백통
AS3.0 Cookbook/배열2008. 7. 20. 13:39

배열 원소의 무작위 정렬은 sort와 random을 같이 사용한다. sort()에서 두 원소의 비교 함수의 값이 음수일 때 앞의 원소가 두번째 원소앞에 위치하게 되고 비교함수의 값이 양수이면 첫 번째 원소는 두 번째 원소 뒤로 위치하게 된다. 따라서 sort( randomSort )에 비교 값을 양수 또는 음수의 값을 랜덤하게 넣어주면 원소끼리의 순서가 바뀌게 된다.

* sort의 비교함수 값을 임의의 값을 바꾸어 준다.
private function randomSort( elementA:Object , elementB:Object ):Number
{
   var num:Number = (Math.random() - 0.5) * 10;
   return num
}

Math.random은 0.0에서 1.0까지의 값이 랜던하게 반환한다. 따라서 -0.5를 하면 -0.5 에서 0.5까지 양수와 음수를 반환하게 되는데 각 값이 너무 작은 값이기에 소수점 한자리로 포인터를 이동시켜준다.
 




Posted by 버터백통
AS3.0 Cookbook/배열2008. 7. 20. 13:31

 배열의 원소를 정렬하는 메서드는 sort와 sortOn이 있다. sort는 기본적인 Array클래스의 정렬에 사용되며 몇개의 상수로 정렬기준을 정할 수 있다. sortOn은 연관배열의 키를 기준으로 정렬을 한다.

sort에는 다음과 같은 상수가 있다
* 배열 정렬 상수
Array.CASEINSENSITIVE : 대소문자 구분 없이 오름차순으로 정렬
Array.DESCENDING : 내림차순으로 정렬
Array.NUMERIC : 숫자를 기준으로 오름차순
Array.RETURNINDEXEDARRAY : 오름차순으로 정렬하고 그 원소 번호를 반환
Array.UNIQUESORT : 오른차순으로 정렬하자는 않고 원소의 번호만 반환 , 같은 값이 있을 경우 0을 반환


* Array.NUMERIC을 제외한 sort는 배열안에 숫자가 있을 경우 아스키로 취급하여 그 값의 크기로 정렬한다.
* Array.UNIQUESORT를 제외하고는 전부 원소의 상태를 정렬한다.

sortOn은 키를 기준으로 정렬한다.
옵션으로 키와 소트 상수를 제공한다.

sort를 잘사용하면 편리한 점이 많이 있다. 그 중에 숫자 값의 최소와 최대를 구하면 간단히 숫자정렬을 하면된다.
var ary:Array = [10 , 24 , 5 , 8];
ary.sort( Array.NUMERIC );
trace("min :" , ary[0]);
trace("max :" , ary[ary.length - 1]);
출력 : min = 5 , max = 24


Posted by 버터백통
AS3.0 Cookbook/배열2008. 7. 13. 18:27

배열을 만들 때는 가독성있게 값을 참조하기 위해 연관배열을 사용한다. 연관배열은 Object라는 클래스로 이름과 값을 같이 저장하는 배열을 말하는데 가령 자동차 회사에서 연식과 색상 제조회사에 대한 데이터를 아래와 같이 만들었다고 할 때 이 값들을 참조하기 위해서는 알수 없는 숫자들로만 참조해야 한다.
var car:Array = [];
car.push(["은색" , "2000년식" , "대우"]);
car.push(["흰색" , "2003년식" , "현대"]);
car.push(["빨강색" , "1998년식" , "현대"]);
car.push(["파랑색" , "20002년식" , "기아"]);

var len:int = car.length;
for (var i:int=0; i<len; i++) {
 trace(car[i][0] + "   " + car[i][1] + "    " + car[i][2]);
}

출력 :
은색   2000년식    대우
흰색   2003년식    현대
빨강색   1998년식    현대
파랑색   20002년식    기아


위처럼 누군가가 이 코드를 보면서 어떤 데이터가 있는 추측하기란 실행전까진 쉽지않다. 따라서 원소의 이름을 붙인 연관배열을 정수색인 배열에 포함하여 그 값을 유추하기 쉽도록 바구어 보자.
var car:Array = [];
car.push({color:"은색" , year:"2000년식" , maker:"대우"});
car.push({color:"흰색" , year:"2003년식" , maker:"현대"});
car.push({color:"빨강색" , year:"1998년식" , maker:"현대"});
car.push({color:"파랑색" , year:"20002년식" , maker:"기아"});

var len:int = car.length;
for (var i:int=0; i<len; i++) {
 trace(car[i].color + "   " + car[i].year + "    " + car[i].maker);
}
출력 :
은색   2000년식    대우
흰색   2003년식    현대
빨강색   1998년식    현대
파랑색   20002년식    기아

이처럼 연관배열을 사용하면 2차 3차원 그 이상의 배열일지라도 무섭지 않다!! 뭐 심하게 다차원이라면 싫지만요..

* 연관배열은 중괄호 {}로서 그 값을 설정한다.
var num:Object = { name:"홍길동" , ....}
중괄호( {} )안의 내용은 네임탭과 값 그리고 나열은 정수색인 배열처럼 컴머를 기준으로 나열된다.

Posted by 버터백통
Tip And Tech2008. 7. 13. 14:27

SharedObject는 사용자 컴퓨터 공유객체에 저장하는 공간을 만들어 쿠키처럼 호출하여 값을 참조할 수 있도록 한다. 공유객체에 참조자를 만들기 위해서는 반드시 getLocal()를 설정해야 한다. 그리고 swf에서 쿠키처럼 사용할 수 있는 공간 100kb밖에 안된다.

예) 오늘본 상품 등록..
생성시...아래의 메서드를 선언해야 한다.
getLocal : 컴퓨터에 저장
getRemote : 서버를 통해 공유(예: 두 pc가 같이 그림을 그릴수 있다...) 특정 서비스 서버가 있어야한다.



[Public 속성]
client : Object
콜백 메서드가 호출되는 객체를 나타냅니다.

data : Object
[read-only] 객체의 data 속성에 할당된 특성 모음입니다. 이러한 특성은 공유 및 저장이 가능합니다.

defaultObjectEncoding : uint
[static] SWF 파일에서 만들어진 모든 로컬 공유 객체에 대한 기본 객체 인코딩(AMF 버전)입니다.

fps : Number
[write-only] 공유 객체에 대한 클라이언트의 변경이 서버로 전송되는 초당 횟수를 지정합니다.

objectEncoding : uint
이 공유 객체의 객체 인코딩(AMF 버전)입니다.

size : uint
[read-only] 공유 객체의 현재 크기(바이트)입니다.

[Public 메서드]
clear():void
로컬 공유 객체의 경우, 모든 데이터를 제거하고 디스크에서 공유 객체를 삭제합니다.

close():void
원격 공유 객체와 서버 간의 연결을 종료합니다.

connect(myConnection:NetConnection, params:String = null):void
지정된 연결을 통해 서버의 원격 공유 객체에 연결합니다.

flush(minDiskSpace:int = 0):String
로컬 영구 공유 객체를 로컬 파일에 즉시 기록합니다.

getLocal(name:String, localPath:String = null, secure:Boolean = false):SharedObject
[static] 현재 클라이언트에만 사용 가능한 로컬 영구 공유 객체에 대한 참조를 반환합니다.

getRemote(name:String, remotePath:String = null, persistence:Object = false, secure:Boolean = false):SharedObject
[static] Flash Media Server와 같은 서버를 이용하여 여러 클라이언트 간에 공유할 수 있는 객체에 대한 참조를 반환합니다.

send(... arguments):void
메시지를 보낸 클라이언트를 포함하여 지정된 원격 공유 객체에 연결된 모든 클라이언트로 메시지를 브로드캐스트합니다.

setDirty(propertyName:String):void
공유 객체의 속성 값(data 속성으로 정의)이 변경되었음을 서버에 알립니다.

setProperty(propertyName:String, value:Object = null):void
공유 객체의 속성 값(data 속성으로 정의)을 업데이트하고 해당 속성의 값이 변경되었음을 서버에 알립니다.

asyncError
기본 비동기 코드에서 비동기적으로 예외가 발생할 때 전달됩니다.

netStatus
SharedObject 인스턴스가 상태 또는 오류 상황을 보고할 때 전달됩니다.

sync
서버에서 원격 공유 객체(SharedObject)를 업데이트하면 전달됩니다.

아래 코드는 간단히 SharedObject 를 사용하여 방문기록을 표현한 것이다.
private var so: SharedObject = SharedObject.getLocal( "www.xprime.co.kr");

public function SharedObjectTest()
{
   super();
   if( so.data.count == undefined ){
    so.data.count = 1;    
   }else {
    so.data.count ++;
   }
   
   if( so.data.date == undefined ){
    so.data.date = new Date();
   }

   trace( "당신은 "+  so.data.count + " 번 접속했습니다. " , so.data.date.toString()  );
   so.data.date = new Date();
 }


// 출력 : 당신은 3 번 접속했습니다.  Sun Jul 13 14:03:41 GMT+0900 2008

Posted by 버터백통
AS3.0 Cookbook/배열2008. 7. 6. 21:59
많은 데이터를 xml로 파싱하여 보내야하는데 실 데이터 보다는 부가설명이 더 많은 경우 특정 심벌을 사용하여 데이터 그룹을 만든다...
<user id="Flex" name="홍길동" addr="서울 강남구 청담1동" phone="010-555-5555" job="개발자"/> 라는 데이터가 있다...물론 위에 정의된 속성 정도는 많지 않기 때문에 경우에 따라 보기좋게 그냥 사용하여도 무방하지만 이러한 데이터 노드가 1000개..또는 노드는 적더라도 속성이 많아서 데이터 자체의 용량이 무거울 때 보통 특수 심벌을 정하여 데이터를 묶는다.
<user>"Flex|홍길동|서울 강남구 청담1동|010-555-5555|개발자"</user>
이처럼 가독성은 떨어지지만 불필요한 속성 이름들을 줄여주면 와이브로나 무선인터넷을 사용하는 생보사 직원들에게는 1초라도 빨리 데이터를 넘겨주어 화면에 출력하게 할 수 있다.
실제로 오래된 어떤 보험사의 경우 한번에 던져주는 데이터가 3메가 이상 던져주는 경우도 있었다..오래된 데이터 구조와 해를 거치면서 연관되고 묶여진 관련 데이터가 많아지고 현업에서는 손대기 싫다고 하더랍니다..그래서 우리 동료들이 무지 고생들 해서  통신 클래스를 새로 때려 만들어서 해결했다는 후담이 있다.

여튼 요는 불필요한 이름이라도 줄여 "데이터심벌데이터심벌데이터"과 같은 형태로 용량을 줄이고 이를 as3에서는 문자열을 쪼개서 데이타그리드를 만들어야 한다. 이때 걸쳐야하는 것이 배열이다...
가령 앞서 요약된데이터 ("Flex|홍길동|서울 강남구 청담1동|010-555-5555|개발자")가 들어오면 split("|")를 사용한다. 데이터의 문자열중에 "|"를 기준으로 좌우로 원소를 분해하여 배열에 포함시키거나 값으로 선언할 수 있다.
var user:Array = ( "Flex|홍길동|서울 강남구 청담1동|010-555-5555|개발자" ).split("|")
trace(user)    
// 출력 : Flex , 홍길동 , 서울 강남구 청담1동 , 010-555-5555 , 개발자

위의 코드는 심벌 "|"를 사용하여 데이터를 나누어 각 원소로 등록한 것이다.





Posted by 버터백통
Tip And Tech2008. 7. 6. 15:01
AS3에 또하나의 치명적인 버그가 있다. 많은 분들이 swf파일을 만들어 html에 포함시켰을 때 swf의 마우스 휠을 만들어 사용하면 브라우저창에도 같이 휠이 사용되어 버린다. 즉 swf에 휠스크롤이 있고 브라우저에도 휠스크롤이 있을 때 둘이 동시에 적용된다는 문제가 있다 현재 어도비에서는 아예 브라우저에 스크롤을 막아버렸다..이것은 내부적으로 이러한 문제를 인식하고 있음을 알 수 있으므로 곧 해결방안이 나올 듯 싶다....
현재로서는 이러한 문제가 없는 AS1이나 AS2의 스테이지를 AS3에 불러와 해결하는 방안 밖에는 없다.
this.onMouseWheel = function(){
 }
Mouse.addListener(this)

위와 같이 선언된 swf파일을 만들어 as3프로젝트의 스테이지로 불러와 붙인 다음 실행하면 swf에만 마우스 휠을 사용할 수 있다.

보다 세련되게 하고 싶으면 프로토타입을 만들어 사용하면 된다. 가령 확장자를 xprime등으로 붙인 다음 이를 읽어와 ByteArray를 사용하여 화면에 붙이면 된다. 단 불러올 때 Embed의 속성 중에 mimeType을 "application/octet-stream"으로 설정하여야 한다.
[Embed(source="./assets/MouseWheelEnable.xprime" , mimeType="application/octet-stream") ] private var MouseWheelClass:Class;

var wheel:ByteArray = new MouseWheelClass() as ByteArray;
var ldr:Loader = new Loader()
ldr.loadBytes( wheel );
addChild( ldr );

   

Posted by 버터백통
Tip And Tech2008. 7. 6. 14:48

AS3는 기본적으로 국제 표준인 UTF-8을 사용한 인코딩을 하고 있다. 하지만 경우에 따라서 시스템인코깅을 사용해야할 경우가 발생한다. 그럴때는 System.useCodePage를 설정한다.
* 국제 표준을 지키지 않고 현재 시스템의 인코딩을 사용하겠다.
System.useCodePage = true
* 국제표준 인코딩을 사용하겠다.(AS3 프로젝트 기본값)
System.useCodePage = false

그리고 프로젝트를 하다보면 여러단계의 서버를 걸치게 된다. 그때마다 도메인을 수정하기에 번거롭고 더욱 중요한것은 최종 테스트 서버에서 실서버에 오를때는 파일 수정없이 바로 올라가는 경우가 많다. 따라서 xml설정파일을 두어 경로 데이터를 수정하여 올리거나 내부적으로 URLManager에 자신의 도메인을 root.loaderInfo.url 통해얻어와 setter를 설정하여 사용하도록 한다.

Posted by 버터백통
Tip And Tech2008. 7. 6. 14:01
swf에서는 flv파일을 재생할 수 있는 Video객체가 존재한다.
flv파일은 스트리밍이 가능한 파일이다 이는 곧 파일의 일부인 패킷(packet)단위의 데이터만 들어와도 재생할 수 있는 것이다.

* 스트리밍(streaming)
스트리밍의 정의는 파일의 일부만 존재하여도 재생 활용 할수 있는 의미를 갖는다.
현재 swf는 반스트리밍 파일이다 이는 root의 프레임단위 스트리밍이기 때문에 프레임에 모션을 담은 무비클립이나 loader를 통한 애니메이션이 존재한다면 재생 중 이를 다 받고 다음프레임의 정보를 다운로드하게 된다.
그렇기 때문에 모션이나 영상 개발시 프레임구조 또한 중요한 차지를 하게 된다. 이를 제외하고 swf에 포함되는 flv만 놓고 보았을 때는 스트리밍을 지원한다. 이때 파일을 제공하는 서버가 FMS가 아니면 progressive방식으로 스트리밍을 한다. progressive방식은 패킷단위로 저장된 정보순으로 재생을 하며 이를 벗어나서는(스킵) 재생할 수 없다. 하지만 FMS에서 제공하는 flv파일 재생은 nonprogressive가 된다.
nonprogressive는 클라이언트에 저장된 패킷(데이타)이 없더라도 가고자 하는 장면(시간)으로 이동 재생할 수 있는 마치 내 컴퓨터에 파일이 존재하는 것 처럼 사용할 수 있다.

참고) 영상(VOD)이나 음원(AOD)처럼 일부 패킷만으로  스트리밍이 가능하여 재생할 수(사용할 수 )있지만 zip , 이미지파일 , hwp , doc등 전체 파일포맷이 다운되어 완성되어 보여져야 하는 파일들은 스트리밍의 개념이 없다. 단 http://www.bytearray.org/에서 제공하는 ASZip같은 경우에는 압축파일이 전송된 양만큼 활용할 수 있다.


아래 그림은 swf에서 flv를 받는 과정을 그려보았다
사용자 삽입 이미지
swf에는 Video라는 객체가 있다. 이 객체는 제공받은 flv파일을 재생하기 위한 viewer인데 제공받기 까지의 과정에 2개의 필수 객체가 필요하다. 우선 어느 서버(경로)로 접근할 때 사용할 길(대역 : 帶域 )인 NetConnection 필요하다. 그리고 이를 관리할 NetStream이 필요하다. 비디오객체에서 필요한 요청을 할 때는 NetStream를 통해서 요청을 하고 NetStream는 NetConnection을 통해 서버에 던진다. 요청받은 일을한 서버는 응답을 NetConnection를 통해 되돌려주고 가만히 앉아서 기다리던 NetStream은 응답이 오자 결과를 자신을 바라 보고 있는 Video객체에 전달하도록 되어있다.

* NetConnection 역할
 - 단순히 서버와의 길을 연결하는 통신선이다

* NetStream(흐름관리자) 역할 
- 자신이 관리할 NetConnection를 정하여 서버에 요청을 하고 응답이 오면 값을 전달하는 객체이다.
- ordering(순서) : 재생 순서(시간)를 지켜서 데이터를 Netconnection을 통해 보내거나 받는다.
- jitter(지터) : 패킷과 패킷사이에 거리(시간차), 거리를 맞추기 위해서 NetStream이 조절한다.

* 비디오 객체
- 흐름을 타고 넘어온 데이터가 최종적으로 화면에 출력하는 객체

위처럼 각 역할을 맡은 객체들이 서로의 역할을 수행하면서 비디오 파일을 가져올 때 해당 파일에 필요한 메타정보를 반드시 가져와야 한다. 가령 비디오파일 확장자를 가지고는 있지만 실제 파일이 이미지나 기타 파일 포맷인지를 재생하기 전에 확인하는 절차가 필요하기 때문이다. 따라서 비디오 객체를 포함하는 클래스에는 public으로 onMetaDataonCuePoint라는 함수를 반드시 만들어 놓아야 한다.

참고) 메타데이타(부가 정보)
- 이미지의 메타데이타는 크게 아래와 같다
  [ 부가정보(이름 , 파일용량 , 가로 , 세로 , 확장자 .. ) ] [ 핵심데이터(블럭) ] [ 핵심데이터(블럭) ]..

- 동영상의 메타데이타도 이미지와 비슷한 정보를 갖는다.
  [ 부가정보(이름 , 파일용량 , 가로 , 세로 , 전체 재생길이 , 코덱...) ] [ 핵심데이터(블럭) ] ....
단 flv만의 부가적 특징이 바로 cuePoint가 있다. 이는 영상 중간 중간에 변수(정보)를 삽입할 수 있다.
따라서 AS3에서는 반드시 onMetaDataonCuePoint를 체크하여야 한다. FMS서버일 때 이러한 cuePoint를 체크하여 서버의 파일의 위치를 찾아가 바로 바로 재생할 수 있도록 하기 위해서 이다.

Posted by 버터백통
2008. 7. 6. 11:17

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.