| |
|
|
|
|
|
| ActionScript를 통한 코드 작성이 무슨 퍼즐도 아니고.... 이리 저리 코드 조합해 나가는 재미가... 하나도 없군요... ㅡ_ㅡ; 위 코드 조합해 내느라 2시간 정도 걸렸습니다.. 나중에 또 다시 이런 시간 허비가 없도록 하기 위해 포스팅합니다..
|
김형준(Dip2K)
2012/03/03 12:23
2012/03/03 12:23
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/816 |
|
|
|
|
|
|
|
플래시 빌더가 4.0으로 업그레이드 되면서 컴포넌트의 스킨을 SparkSkin 클래스를 통해 만들게 됩니다. 이때 컴포넌트의 모양을 그리기 위해 FXG(Flash XML Graphic Format)를 사용합니다. 컴포넌트의 모양 뿐만 아니라 채움이나 선 모양과 색상 등을 포함해 텍스트, 이미지 표현까지 모든 그리기에 대한 방법입니다.
좀더 체계적이고 정리된 프로젝트 진행을 위해 기존에 알고 있는 다소 돌아가는 방법이 아닌 표준화된 방법을 이용해 컴포넌트의 스킨을 세련되게 입히고자 하는 생각에서 FXG에 관심을 가지고 살펴보던 중에.. 실제 컴포넌트에 스킨으로 입힐 이미지를 FXG를 통해 표현하는 코드를 정리해 봅니다.
FXG에서 비트맵 이미지를 표현하기 위한 방법은 2가지입니다. 첫째는 BitmapImage를 이용해 이미지를 그대로 그리는 방법과 BitmapFill를 이용해 대상이 되는 도형에 비트맵을 채워 넣는 방법입니다. 아래의 코드가 바로 위의 2가지 방법에 대한 예제 코드입니다.
아래의 화면은 위의 코드를 통한 실제 결과 화면입니다.
|
김형준(Dip2K)
2011/12/08 13:12
2011/12/08 13:12
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/773 |
|
|
|
|
|
|
|
이번 핑거아이즈의 속도 개선을 위한 전반적인 코드 리팩토링 시에 고려했던 최적화 항목입니다. 위의 항목중 2/3정도만 반영되었고.. 나머지는 반영하지 못했습니다. 코드 최적화 작업 시간을 따로 마련해 놓지 말고.. 코드 작성 시에 미리 미리 고려해 적용해 놓아야한다는 당연한 진리를 새삼 깨닫게 되었습니다.
- 가능하다면 Sprite 대신에 Shape 사용하기
- cacheAsBitmap 적절히 사용하기
- 라벨에 대해 TextField 보다는 FTE(Flash Text Engine) 사용하기
- 가능하다면 mouseChildren, mouseEnable을 false 지정하기
- Array 대신 Vector.<type> 사용하기
- 드로잉 API(drawPath, drawGraphicsData, drawTriangles) 사용하기
- object cache 전략 사용하기
- 폴리곤 내부 판정은 hitTestPoint보다 직접 구현해 사용하기
- 파생될 일이 없는 클래스는 final로 지정하기
- floor, ceil은 int 형변환으로 대체하기(floor(1.5) -> int(1.5), ceil(1.5) -> int(1.5)+1)
- abs보다는 직접 -1을 곱하는 방식으로 처리하기
- for 반복문 대신 for each 문 사용하기
여하튼... 위의 최적화 코드등을 통해 기존 속도 대비 10%정도 향상된듯합니다만... 체감하기는 어려운 향상인지라 다소 아쉬움이 많이 남습니다.
|
김형준(Dip2K)
2011/07/04 13:42
2011/07/04 13:42
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/726 |
|
|
|
|
|
|
|
| 이종간의 플랫폼을 떠나.. 서로 다른 언어간의 문자열 통신에도 어려움이 있습니다. 위의 그림은 플래시의 문자열을 자바로 던져 줄때 한글이 깨지지 않고 제대로 전달하기 위한 방법입니다.
|
김형준(Dip2K)
2011/02/09 18:11
2011/02/09 18:11
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/676 |
|
|
|
|
|
|
|
| 액션 스크립트는 문자열에 대한 Trim 함수를 제공하지 않습니다. 해서 제가 사용하고 있는 Trim 함수를 소개해 드립니다. 재귀호출 함수를 사용해서 그다지 속도는 나질 않지만.... 제가 사용함에 있어서 문제가 없기에 소개해 드립니다.
사용방법은 StringHelper.trim(" ABC ", " ")와 같으며 이에 대한 결과는 "ABC"가 됩니다. 참고로 이 함수는 제가 만든 것이 아니고 외국의 블로그에서 발췌해 사용한 것인데... 어느 블로그인지.. 시간이 많이 흘러 알수가 없네요..
|
김형준(Dip2K)
2011/02/09 15:24
2011/02/09 15:24
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/675 |
|
|
|
|
|
|
|
| 액션스크립트의 최상위 객체인 Object는 해쉬 테이블 자료구조입니다. 즉, 키와 값으로 구성된 리스트입니다. 키의 타입은 문자열이며 값의 타입은 다시 Object라고 이해하면 별 무리가 없을 것입니다. Object의 이러한 특성으로 인해 액션스크립트를 이용해 매우 유연한 코딩을 가능하게 해줌과 동시에 이러한 애매모호한 타입에 대해 별도의 문서와 주석이 없을 경우 유지보수에 상당한 비용이 발생하게 됩니다. 뭐 여튼... Object에 저장된 키와 값에 대한 리스트를 얻어오는 코드가 이 글의 주요 정리 내용입니다. 필요할때.. 맨날~ 까먹기에.. 정리해 봅니다.
위의 코드에서 Object 타입의 _conditionsCtrls에 저장된 키 문자열을 key라는 변수에 할당하고 이렇게 얻은 키를 통해 _conditionsCtrls[key]와 같은 형식으로 Object 타입의 값을 얻어옵니다. Object 타입이니.. 형변환을 통해 원하는 타입으로 변환할 수 있습니다.
|
김형준(Dip2K)
2011/01/25 01:46
2011/01/25 01:46
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/668 |
|
|
|
|
|
|
|
참으로... 어이없게도 플래시에서는 그래픽을 자유롭게 그려 그릴 수 있는 Graphics이라는 클래스를 제공함에도.. 이 클래스에는 이미지를 그릴 수 있는 명확한 매서드를 제공하고 있지 않습니다. 무슨 말씀인고 하니... 사각형이나 원을 그리기 위해서 Graphics에서는 drawRect와 drawCircle라는 매서드는 제공하면서 이미지를 그리기 위한 drawImage나 drawBitmap과 같은 매서드는 없다는 것이지요.. 그래도 그 가능성은 열어 놓았습니다. 아래가 그에 대한 코드입니다.
위의 코드는 img라는 Bitmap 타입의 이미지 객체를 (10, 10) 위치에 표시하기 위한 코드입니다.
무슨 이유로 이미지를 그리기 위한 명확한 매서드(예를 들어 drawImage(img, x, y)와 같은 매서드)를 제공하고 있지 않은지.. 아시는 분은 꼭 알려주시면 감사하겠습니다..
|
김형준(Dip2K)
2011/01/24 17:04
2011/01/24 17:04
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/667 |
|
|
|
|
|
|
|
| 글 제목이.. 테크니컬합니다만.. Flex에서 서버에 위치한 이미지 파일을 다운로드 받아서.. 받은 이미지를 지지고 볶기 위해 BitmapData라는 타입으로 변환하고자 할때 사용하는 코드입니다.
이미지가 서버에 있으므로 URL로 경로를 지정할 수 있겠지요? 아래가 이미지에 대한 URL을 통해 다운로드 작업의 시동을 걸어 주는 코드입니다.
4번과 5번 코드는 다운로드가 성공적으로.. 때로는 문제가 생겨 실패했을시 발생하는 이벤트를 지정해주는 코드입니다. 성공적으로 받았을때 받은 데이터를 BitmapData 타입으로 변환하는 코드가 존재할텐데요.. 그렇다면 성공적으로 다운로드 되었을때 발생하는 이벤트에 대한 코드를 살펴면 다음과 같습니다.
6번째 코드를 통해 다운로드 받은 이미지의 크기를 플래시 빌더의 디버깅 창에 표시해 보고 있습니다.
끝으로... 플래시는 모든 연산이 비동기화 지향적입니다. 플래시가 화면상에 화려하고 역동적인 그래픽 요소의 표현이라는 주요 목적을 갖고 있으니 당연한 것이긴 하지만...... 때론 이런 비동기적인 방식이 코드를 복잡하게 만들때가 있습니다.. 위의 경우에서도 이미지 하나를 받기 위해 비동기방식으로 이벤트를 지정해줘서 처리를 하고 있는데... 이를 동기적으로 처리할 수 있는 방법이 있다면 좋겠다는 생각이 듭니다만... 혹.. 아시는 분 계시나요?
|
김형준(Dip2K)
2011/01/24 16:38
2011/01/24 16:38
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/666 |
|
|
|
|
|
|
|
| 액션스크립트에서 바이너리 데이터를 서버로 전송하는 코드입니다. 물론... 서버 측에서 바이너리 데이터를 받아 들이는 서비스를 제공해야겠지요.. 바이너리 데이터 전송이므로.. 방식은 POST를 사용합니다.. 액션스크립트 코드는 다음과 같습니다..
바이너리 데이터는 ByteArray 타입에 저장되며.. 원하는 데이터를 write 매서드 군으로 저장시킵니다. 9번 코드와 15번 코드가 꼭 필요한지는 제거해서 확인해 보시기 바랍니다..
서버측은.. 저 같은 경우 자바의 서블릿을 사용했는데... POST 방식으로 요청을 받으므로 doPost 매서드를 오버라이드해서 데이터를 읽어오면 됩니다.. 바이너리 데이터를 쉽게 읽기 위해 DataInputStream을 사용했는데.. 이해를 돕고자.. 관련된 코드를 제시한다면 다음과 같습니다..
req는 서블릿의 요청에 대한 HttpServletRequest 객체입니다.. 화면상에 읽을 수 있는 바이너리의 바이트 수와 클라이언트가 보낸 실수값(3.14)와 정수값(34321)이 찍히면 정상입니다..
플래시의 액션스크립트를 이용해 서버측으로부터 바이너리 데이터를 읽을 수도.. 또.. 전송할 수 있도 있음으로 퍼포먼스를 향상 시킬 수 있겠습니다..
|
김형준(Dip2K)
2010/10/09 19:21
2010/10/09 19:21
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/636 |
|
|
|
|
|
|
|
| 추가해야할 이벤트는 많으면서 또 짐작하기 어렵고.. 시간이 없으니.. 일단 정리를 하여.. 추후 까막까막해져 혼란이 없으면 하는 바램에서 사용자 정의 이벤트를 추가하는 방법에 대해 정리를 해봅니다..
먼저 이벤트 처리 함수(이벤트 핸들러 함수)로 전달될 객체에 대한 클래스를 정의합니다.. 아래는 예입니다..
하나의 이벤트 클래스에서 총 5개 종류의 이벤트를 책임지고 있습니다.. 만약 클래스 하나가 단 하나의 이벤트만을 책임진다면 생성자에서 type 인자는 필요치 않고 super를 호출할때 첫번째 인자 를 바로 값으로 지정해 주면 됩니다.
다음으로 이벤트를 발생시켜 주는 코드입니다..
이벤트가 발생되는 적절한 위치에 위의 코드가 존재하면 되며.. 위의 코드는 XRMAP_MOUSE_DOWN_EVENT라는 한 종류의 이벤트를 발생시키는 코드입니다..
이제 마크업(MXML)쪽에서 이벤트를 인식하도록 하기 위한 메타 태그의 정의를 추가합니다..
여기까지가 사용자 정의 이벤트를 추가하기 위한 전부이고.. 다음은 이 사용하는 쪽의 코드입니다.. addEventListener를 사용해 이벤트를 추가해도 되고.. 아니면 마크업쪽에서 이벤트를 추가해도 됩니다..
마크업 쪽의 방법만을 살펴보면 다음과 같습니다.. 흔히 일반적인 컴포넌트에 대한 이벤트를 정의하는 것과 동일합니다..
|
김형준(Dip2K)
2010/09/27 18:29
2010/09/27 18:29
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/634 |
|
|
|
|
|
|
|
화면에 대한 전체 배경을 작은 이미지를 이용해 타일로 채우는 코드입니다.. 플래시의 동적 프로그래밍 언어의 특성이 유감없이 발휘되는.... 그래서 개인적으로는 다소 이해하기 어려웠던 내용입니다.. 뭐 여튼.. 코드를 살펴보기에 앞서 사용할 작은 이미지를 살펴보고.. 바로 코드를 살펴보도록 하겠습니다..
이제 첫번째 코드입니다.. 보시면.. 먼저 외부의 png 이미지 파일을 _bg_logo라는 클래스 타입으로 선언합니다.. 재밌는 액션스크립트 언어의 기능이라고 생각되는데요.. 데이터 자체를 클래스 타입으로 선언하고 재사용한다는 것.. 플래시의 태생이 멀티 미디어 저작툴이기 때문에 이런 개념을 도입한게 아닌가 싶습니다..
이렇게 선언된 클래스를 통해 바로 Bitmap 클래스 타입인 _bg_logo_bitmap 변수를 통해 생성시킵니다.. 와우! 이제 이렇게 만든 비트맵을 화면에 격자로 뿌려주는 코드는... 다음과 같습니다..
_width와 _height는 화면의 크기 정도라고 이해하시면 무리가 없습니다.. 제가 이 코드 꾸러미를 적용해서 얻은 결과 화면은 다음과 같습니다..
|
김형준(Dip2K)
2010/09/19 14:41
2010/09/19 14:41
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/633 |
|
|
|
|
|
|
|
배열의 탈을 쓴 액션스크립트의 Array에 원소를 추가하고 삭제하는 매서드가 바로 splice라는 녀석인데.. 이 놈의 성질을 보다 명확히 파악하고 작업을 진행해야겠기에.. 정리를 해봅니다.
배열의 탈을 썼다는 의미는.. 아무리 봐도 이 Array는 배열이라고 하기 어려운 놈이라고 생각되기 때문입니다. 이 부분에 대해서는 다음 기회에 더 논하기로 하고... 이 Array에 원소를 중간에 추가하거나 중간의 원소를 삭제하는 매서드가 바로 splice입니다.
이 Array의 splice를 이용해 이떤 기능을 개발하고 있는데... 뭔가 작동이 제대로 의도하는 바대로 되지 않습니다.. Array에 대한 기본이 부족한 탓이기에 이 Array의 splice에 대해 살펴봅니다. 먼저 Array 타입의 변수에 다음과 같은 원소들이 담겨져 있다고 해 보겠습니다.
즉, 총 6개의 원소로 구성되어져 있으며 첫번째 원소는 배열 인덱스 0부터입니다. 이 초기 상태에서 다음과 같은 매서드를 호출하면...
결과는 다음과 같습니다..
즉, 첫번째 자리에 a 값을 추가할 수 있습니다. 그리고 다시 초기 상태로 돌아가서... 다시 다음 코드를 호출하면..
결과는 다음과 같습니다.
99번째 인자는 너무 커서 존재하지 않는 인자임에도 불구하고 인자하게도.. 가장 마지막에 a 값을 추가해 줍니다.. 그리도 또 다시 초기 상태로 돌아가서.. 다음 코드를 호출하면..
결과는 다음과 같습니다.
2번째 인덱스 바로 앞에서 a 값이 추가됩니다..
이제.. 다시 초기 상태로 돌아가서 원소를 삭제하는 다음 코드를 실행해보면..
결과는 다음과 같습니다..
정확히 지정한 2번 인덱스를 제거합니다.. 인덱스가 옳바르지 않을 경우 어떠한 에러도 발생하지 않고 원소들을 변경시키지 않습니다..
이제 정리가 끝났으니... 다시 코딩단으로......
|
김형준(Dip2K)
2010/09/18 14:34
2010/09/18 14:34
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/632 |
|
|
|
|
|
|
|
| 플래시의 기능을 최대한 할용하고는 있지만... 플래시가 자동으로 처리해주는 것보다는... 퍼포먼스 향상을 목표로 부하를 최소화하기 위해.. 수동으로 처리해주는 기능들이 있습니다..
예를 들어서 Sprite 클래스가 가지고 있는 자식들 각각에 대해 클릭 이벤트를 받아 오기 위해.. 각 자식들에 대해 마우스 이벤트를 등록(addEventListener)를 하지 않고... 부모 Sprite에만 마우스 이벤트를 등록해 놓고.. 이 부모의 이벤트에서 자식들의 클릭 여부(hitTestPoint 매서드를 사용)를 가려내고자 함입니다..
이때... 클릭한 지점에 대한 좌표가 여러 모로 혼란스럽습니다... 플래시 자체가 DisplayObject라는 레이어로 첩첩히 쌓여져 있어서... 말입니다.. 여담이지만.. GIS의 지도 레이어 개념과 플래시의 DisplayObject의 대응은 마치 플래시를 맵엔진을 위해 만들어지 개발환경이 아닌가할 정도로... 뛰어납니다...
다시 본론으로 돌아와서... 부모 Sprite에서 받은 마우스 클릭 위치에 대해서 자식 Sprite의 hit 여부를 알아내기 위해서는 마우스 이벤트의 인자인 Event 클래스의 target를 제대로 이해하고 있어야 합니다.. target와 함께 currentTarget 속성이 존재하는데.. 간단히 정리하면 다음과 같습니다..
- target : 이벤트를 dispatch한 객체
- currentTarget : 이벤트 핸들러 함수가 등록된 객체
다음 코드는 진행중인 플래시 기반의 맵엔진의 코드중.. 이와 관련된 부분입니다..
보시면... 위의 mouseClick 매서드는 이벤트가 아닙니다.. 단지 mouseDown과 mouseUp 이벤트를 조합해서 클릭 여부에 대해 형성된 이벤트 성격의 매서드입니다.. 여튼.. 이벤트라고 생각하셔도 무방합니다..
이 mouseClick 매서드는 부모 Sprite의 소유입니다.. 즉, 달리 말해 부모 Sprite에 등록된 이벤트입니다. 이때 받은 e 매개변수에 localX과 localY 좌표는 클릭된 위치이고... 클릭된 위치는.. 부모 Sprite일수도 있고... 자식 Sprite일수도 있습니다.. 즉, 이 이벤트가 등록된 부모에 대한 좌표가 아니라는 점입니다..
문제는 Sprite의 hitTestPoint가 받는 x, y 좌표입니다.. 받는 x, y 좌표는 부모 Sprite의 좌표여야 하는데.. e를 통해 넘어온 좌표는 부모의 좌표일수도.. 자식의 좌표일 수도 있다는 점입니다.. 이를 부모의 좌표로 통일해줘야 하는데.. 그 방법이 바로 8번 코드의 target를 속성을 사용하는 것입니다.
플래시의 DisplayObject의 개념과 target 속성에 대한 기본적인 부분을 알면 매우 당연한 내용이겠지만.... 저처럼.. 플래시에 대한 개념이 얕은 사람은.. 매우 혼돈스러운 부분이 아닐까 싶습니다..
|
김형준(Dip2K)
2010/09/10 12:36
2010/09/10 12:36
|
|
| Track this back : http://www.gisdeveloper.co.kr/trackback/628 |
|
|
|
|
Total : 982094
Today : 116
Yesterday : 582 |
|
|
|