[ActionScript] object에 저장된 값 읽기

액션스크립트의 최상위 객체인 Object는 해쉬 테이블 자료구조입니다. 즉, 키와 값으로 구성된 리스트입니다. 키의 타입은 문자열이며 값의 타입은 다시 Object라고 이해하면 별 무리가 없을 것입니다. Object의 이러한 특성으로 인해 액션스크립트를 이용해 매우 유연한 코딩을 가능하게 해줌과 동시에 이러한 애매모호한 타입에 대해 별도의 문서와 주석이 없을 경우 유지보수에 상당한 비용이 발생하게 됩니다. 뭐 여튼… Object에 저장된 키와 값에 대한 리스트를 얻어오는 코드가 이 글의 주요 정리 내용입니다. 필요할때.. 맨날~ 까먹기에.. 정리해 봅니다.

for(var key:String in _conditionsCtrls)
{
    var wc:IWhereConditionable = _conditionsCtrls[key] as IWhereConditionable;

    ....

위의 코드에서 Object 타입의 _conditionsCtrls에 저장된 키 문자열을 key라는 변수에 할당하고 이렇게 얻은 키를 통해 _conditionsCtrls[key]와 같은 형식으로 Object 타입의 값을 얻어옵니다. Object 타입이니.. 형변환을 통해 원하는 타입으로 변환할 수 있습니다.

[ActionScript] Graphics에 이미지 표시하기

참으로… 어이없게도 플래시에서는 그래픽을 자유롭게 그려 그릴 수 있는 Graphics이라는 클래스를 제공함에도.. 이 클래스에는 이미지를 그릴 수 있는 명확한 매서드를 제공하고 있지 않습니다. 무슨 말씀인고 하니… 사각형이나 원을 그리기 위해서 Graphics에서는 drawRect와 drawCircle라는 매서드는 제공하면서 이미지를 그리기 위한 drawImage나 drawBitmap과 같은 매서드는 없다는 것이지요.. 그래도 그 가능성은 열어 놓았습니다. 아래가 그에 대한 코드입니다.

var x:Number = 10;
var y:Number = 10;

var matrix:Matrix = new Matrix(1, 0, 0, 1, x, y);
graphics.beginBitmapFill(img.bitmapData, matrix);
graphics.drawRect(x, y, img.bitmapData.width, img.bitmapData.height);
graphics.endFill()

위의 코드는 img라는 Bitmap 타입의 이미지 객체를 (10, 10) 위치에 표시하기 위한 코드입니다.

무슨 이유로 이미지를 그리기 위한 명확한 매서드(예를 들어 drawImage(img, x, y)와 같은 매서드)를 제공하고 있지 않은지.. 아시는 분은 꼭 알려주시면 감사하겠습니다..

[ActionScript] 서버로부터 이미지를 받아 BitmapData 타입으로 얻기

글 제목이.. 테크니컬합니다만.. Flex에서 서버에 위치한 이미지 파일을 다운로드 받아서.. 받은 이미지를 지지고 볶기 위해 BitmapData라는 타입으로 변환하고자 할때 사용하는 코드입니다.

이미지가 서버에 있으므로 URL로 경로를 지정할 수 있겠지요?  아래가 이미지에 대한 URL을 통해 다운로드 작업의 시동을 걸어 주는 코드입니다.

var ldr:Loader = new Loader();
var req:URLRequest = new URLRequest("http://www.gisdeveloper.co.kr/img/downskin.png");

ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onRequestComplete);
ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onRequestError);

ldr.load(req);

4번과 5번 코드는 다운로드가 성공적으로.. 때로는 문제가 생겨 실패했을시 발생하는 이벤트를 지정해주는 코드입니다. 성공적으로 받았을때 받은 데이터를 BitmapData 타입으로 변환하는 코드가 존재할텐데요.. 그렇다면 성공적으로 다운로드 되었을때 발생하는 이벤트에 대한 코드를 살펴면 다음과 같습니다.

private function onRequestComplete(event:Event):void
{
    var ldr:Loader = event.target.loader as Loader;
    var img:Bitmap = ldr.content as Bitmap;
    
    trace(img.bitmapData.width, img.bitmapData.height);
}

6번째 코드를 통해 다운로드 받은 이미지의 크기를 플래시 빌더의 디버깅 창에 표시해 보고 있습니다.

끝으로… 플래시는 모든 연산이 비동기화 지향적입니다. 플래시가 화면상에 화려하고 역동적인 그래픽 요소의 표현이라는 주요 목적을 갖고 있으니 당연한 것이긴 하지만…… 때론 이런 비동기적인 방식이 코드를 복잡하게 만들때가 있습니다.. 위의 경우에서도 이미지 하나를 받기 위해 비동기방식으로 이벤트를 지정해줘서 처리를 하고 있는데… 이를 동기적으로 처리할 수 있는 방법이 있다면 좋겠다는 생각이 듭니다만… 혹.. 아시는 분 계시나요?

[ActionScript] 서버로 Binary 데이터 전송

액션스크립트에서 바이너리 데이터를 서버로 전송하는 코드입니다. 물론… 서버 측에서 바이너리 데이터를 받아 들이는 서비스를 제공해야겠지요.. 바이너리 데이터 전송이므로.. 방식은 POST를 사용합니다.. 액션스크립트 코드는 다음과 같습니다..

protected function button1_clickHandler(event:MouseEvent):void
{
    var loader:URLLoader = new URLLoader();
    var request:URLRequest = new URLRequest("http://127.0.0.1:8080/Xr?edChkLog");

    var bytes:ByteArray = new ByteArray();
    bytes.writeDouble(3.14);
    bytes.writeInt(34321);
    bytes.position = 0;
   
    request.data = bytes;
    request.method = URLRequestMethod.POST;
    request.contentType = "application/octet-stream";

    loader.dataFormat = URLLoaderDataFormat.BINARY;
    loader.addEventListener(Event.COMPLETE, onCompleted);
    loader.addEventListener(IOErrorEvent.IO_ERROR, onError);

    loader.load(request);
}

바이너리 데이터는 ByteArray 타입에 저장되며.. 원하는 데이터를 write 매서드 군으로 저장시킵니다. 9번 코드와 15번 코드가 꼭 필요한지는 제거해서 확인해 보시기 바랍니다..

서버측은.. 저 같은 경우  자바의 서블릿을 사용했는데… POST 방식으로 요청을 받으므로 doPost 매서드를 오버라이드해서 데이터를 읽어오면 됩니다.. 바이너리 데이터를 쉽게 읽기 위해 DataInputStream을 사용했는데.. 이해를 돕고자.. 관련된 코드를 제시한다면 다음과 같습니다..

    ....

    ServletInputStream in = req.getInputStream();
    System.out.println("readable size: " + in.available());

    DataInputStream dis = new DataInputStream(in);
    System.out.println(dis.readDouble() + " , " + dis.readInt());

    ....

req는 서블릿의 요청에 대한 HttpServletRequest 객체입니다.. 화면상에 읽을 수 있는 바이너리의 바이트 수와 클라이언트가 보낸 실수값(3.14)와 정수값(34321)이 찍히면 정상입니다..

플래시의 액션스크립트를 이용해 서버측으로부터 바이너리 데이터를 읽을 수도.. 또.. 전송할 수 있도 있음으로 퍼포먼스를 향상 시킬 수 있겠습니다..