블로그 이미지
플래시 개발자랍니다... 하지만 여긴 플래시 전문 블로그가 아닌 그냥 개인 블로그랍니다
미나토

Recent Comment

calendar

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
  • 38,513total
  • 12today
  • 25yesterday
2009/10/14 10:02 Flash Platform



다음과 같은 코드로 속도 테스트를 해보자


var index:int = - 9999999;

var st:uint = getTimer();

var n:Number;
while(index < 0)
{
n = Number("12345");
index ++;
}

trace(getTimer() - st);

///////////////
1204


var index:int = - 9999999;

var st:uint = getTimer();

var n:Number;
while(index < 0)
{
n = parseFloat("12345");
index ++;
}

trace(getTimer() - st);

//////////////////////
2453


결과를 놓고 보면 Number 가 parseFloat 에 비해 두배 정도 빠른 속도를 보이기에 무조건 Number 타입을 쓰는 것이 좋아 보이지만 다음과 같은 차이가 있다


trace(Number(""))
////////////////
0;

trace(parseFloat(""))
///////////////
NaN;



이유는 Number 함수가(Number class 가 아니다) 다음과 같은 반환값을 가지기 때문이다.

Number

입력 유형/값예제반환값
undefined Number(undefined) NaN
null Number(null) 0
true Number(true) 1
false Number(false) 0
NaN Number(NaN) NaN
빈 문자열 Number("") 0
숫자로 변환되는 문자열 Number("5") 숫자(예: 5)
숫자로 변환되지 않는 문자열 Number("5a") NaN





요컨데 결론은.....




Number 함수로 Number 타입 변환을 하면 속도가 두배로 빨라지지만 상황에 맞게 쓰자...




크리에이티브 커먼즈 라이선스
Creative Commons License
posted by 미나토
2008/06/09 15:15 Flash Platform


실로 오랜만의 포스팅.... 먹고 살기 바쁘다 보니...

회사 녀석이 물어본 볼드체(또는 이탤릭체) 끝이 잘려버리는 현상을 설명해주기 위해 만든 테스트 코드...


var textFormat:TextFormat = new TextFormat("굴림", 12, 0, false, true);

var txt:TextField = new TextField();
addChild(txt);
txt.border = true;
txt.text = "DSfasfsaf";
txt.autoSize = TextFieldAutoSize.LEFT;
txt.setTextFormat(textFormat);
graphics.lineStyle(1, 0, .2)
graphics.drawRect(txt.x + (txt.width - txt.textWidth) / 2, txt.y + (txt.height - txt.textHeight) / 2, txt.textWidth, txt.textHeight)
trace(txt.height, txt.textHeight)


txt = new TextField();
addChild(txt);
txt.y = 20;
txt.text = "DSfasfsaf";

txt.setTextFormat(textFormat);
txt.autoSize = TextFieldAutoSize.LEFT;
txt.border = true;
trace(txt.width, txt.height)
txt.autoSize = TextFieldAutoSize.NONE;
trace(txt.width, txt.height)
txt.width += (txt.width - txt.textWidth) / 2;
txt.height += (txt.height - txt.textHeight) / 2;
graphics.lineStyle(1, 0, .2)
graphics.drawRect(txt.x + (txt.width - txt.textWidth) / 2, txt.y + (txt.height - txt.textHeight) / 2, txt.textWidth, txt.textHeight)

trace(txt.width, txt.height)


생각한 것과는 다른 결과가 나올 것이다


한가지 내가 잘못 알고 있었던 것은

txt.autoSize = TextFieldAutoSize.NONE

이러면 텍스트 필드의 width, height 가 0이 될 줄 알고 있었다는 것...

크리에이티브 커먼즈 라이선스
Creative Commons License
posted by 미나토
2008/04/04 16:20 Flash Platform


Timer class 의 생성자는

public function Timer(delay:Number, repeatCount:int = 0):void


이다

위의 레퍼런스가 문제가 없다면 delay 는 Number 타입은 모두 받아야 한다.... 하지만 특이한 수는 못받는 것 같다.

영원히 이벤트가 발생치 않게 하려면

Timer(Number.POSITIVE_INFINITY, time);


이렇게 하면 될 것이라 생각했지만

지정된 범위를 벗어났다는 에러 메세지가 떠버렸다...


분기 없이 코드를 작성하려고 저렇게 짜봤지만 안되니 별 수 없이 분기를 만들어 Timer 객체를 생성치 않도록 해버렸다는...



크리에이티브 커먼즈 라이선스
Creative Commons License
posted by 미나토
TAG as3, Delay, timer
2008/01/17 14:14 Flash Platform



이전글과 같이 회사 교육 자료로 만드는 중
카테고리를 따로 만들기는 좀 머하고...


////////////////////////////////


XML 을 이용한 작업 방법

AS 1.0 의 Flash Player 5 버전에서 XML 과 LoadVars 클래스가 생겨나기 이전에는 외부에서 문서를 가져와 작업하기는 어려웠습니다.
결국 플래시 내부에 데이터들을 집어넣고 돌려야 한다는 얘기인데 예를 들어 어느정도 규모가 있는 홈페이지의 메뉴같은 경우는 수정사항이 많은 편입니다

메뉴가 생겼다가 사라지고 그대로더라도 링크가 바뀌는 등의...


기존에는 이럴 때마다 플래시 파일을 고쳐야 하는 매우 큰 불편함이 있었다는 이야기입니다. 플래시 개발자가 아닌 관리자들은 직접 수정할 수도 없었고요.


xml을 가져와 사용할 수 있게 되면서 이 방식은 바뀌게 되었습니다.

2.0 의 코드를 보겠습니다


예를 들어 다음과 같은 메뉴 xml을 만들어 놓는다면

<menu>
    <main name="메인" link="/index.html" />
    <main name="회사소개" link="/about.html">
        <sub name="연혁" link="/about/history.html" />
        <sub name="오시는 길" link="/about/map.html" />
    </main>
    <main name="공지사항" link="/notice.html />
</menu>


import mx.utils.Delegate;
import mx.xpath.XPathAPI;

var menu_array:Array;

var xml:XML = new XML();
xml.ignoreWhite = true;
xml.onLoad = Delegate.create(this, xmlOnLoad);
function xmlOnLoad(success:Boolean):Void
{
    if(success)
    {
        menu_array = [];
        
        var tmp_array:Array = XPathAPI.selectNodeList(xml.firstChild, "/menu/main");
        var cnt:Number = tmp_array.length;
        for(var i:Number=0; i<cnt; i++)
        {
            var main_node:XMLNode = tmp_array[i];
            var main_array:Array = [];
                
            var name:String = dataNode.attributes.name;
            var link:String = dataNode.attributes.link;
            
            main_array.name = name;
            main_array.link = link;

            var stmp_array:Array = XPathAPI.selectNodeList(main_node.firstChild, "/sub");
            var subCnt:Number = stmp_array.length;
            for(var j:Number=0; j<subCnt; j++)
            {
                var sub_node:XMLNode = stmp_array[i];
                var sub_array:Array = [];
                    
                var name:String = sub_node.attributes.name;
                var link:String = sub_node.attributes.link;
                
                sub_array.name = name;
                sub_array.link = link;

                main_array.push(sub_array);
            }

            menu_array.push(main_array);
        }
    }
}
xml.load("data.xml");



뭐, 이런식으로 배열로 변환할 수 있었습니다.





이제 AS 3.0 으로 변환해보면

package
{
    import flash.display.Sprite;
    import flash.net.*;

    public class Main extends Sprite
    {
        public function Main()
        {
            var uloader:URLLoader = new URLLoader();    // 외부 문서를 불러오는데 사용하는 클래스
            uloader.addEventListener(Event.COMPLETE, complete);    // 문서가 다 불러와지면 complete 핸들러를 실행한다
            uloader.load(new URLRequest("data.xml"));    // 스트링이 아닌 URLRequest 객체로 던져서 불러와야 한다
        }

        protected var menu_array:Array    // 메뉴 배열
        protected function complete(e:Event):void
        {
            menu_array = [];
            var xml:XML = XML(e.target.data);    // 불러온 것은 텍스트의 형태이므로 XML로 만들어준다

            var cnt:uint = xml.menu.main.length();    // E4X 를 사용하여 배열로 변환
            for(var i:uint=0; i<cnt; i++)
            {
                var main_xml:XML = xml.menu.main[i];
                var main_array:Array = [];

                var name:String = main_xml.@name;
                var link:String = main_xml.@link;

                main_array.name = name;
                main_array.link = link;

                var subCnt:uint = main_xml.sub.length();
                for(var j:uint=0; j<subCnt; j++)
                {
                    var sub_xml:XML = main_xml.sub[j];
                    var sub_array:Array = [];

                    var name:String = sub_xml.@name;
                    var link:String = sub_xml.@link;

                    sub_array.name = name;
                    sub_array.link = link;

                    main_array.push(sub_array);
                }

                menu_array.push(main_array);
            }
        }
    }
}




크리에이티브 커먼즈 라이선스
Creative Commons License
posted by 미나토
TAG as3, XML
2008/01/17 11:07 Flash Platform



회사에서 교육을 위해 강의 자료를 만들고 있는 중... 졸립고 귀찮다. 어차피 회사 내 플래시 개발자는 나랑 부사수 뿐인데...


////////////////////////////////////////////




AS3.0 의 Document Class 를 이용한 작업

1. AS2.0 까지의 개발 방법


타임라인 애니메이션이 없는 어플리케이션을 플래시로 제작할 때 대부분의 개발자는 원프레임 개발을 한다. 플래시의 타임라인에 있는 1 프레임만을 사용한다고 해서 불려지는 이름이다.

타임라인을 이용한 개발은 메뉴나 에니메이션과 같이 모션이 들어가 있어서 프레임을 이용한 개발이 더 효율적일 때나 사용하게 된다.
이런 상황 이외에는 대부분 원프레임 개발을 한다.

그 이유는 타임라인이라는 것은 일반적인 랭귀지의 순차실행이 아닌 시간이라는 요소가 영향을 끼치기 때문이다. 그러다 보면 클라이언트 PC 에 따라 그 시간이라는 요소가 불규칙 적일 수 있고 어떠한 이벤트 발생을 예측하기가 어려워진다.
그리고 타임라인 이라는 요소는 ActionScript 란 언어(이하 AS) 만의 고유한 특징으로 다른 쪽 개발자가 이해하기가 어렵다.


그리고 플래시 라이트(모바일용 플래시) 보다야 덜하지만 플래시 어플리케이션의 규모가 커지면서 그 성능과 최적화가 중요요소로 자리잡게 되면서 메모리를 잡아먹을 필요없는 자원은 과감히 버려야 할 필요가 있게 되었다.


as2.0까지의 기존의 방식대로 타임라인에 메인 파일을 인클루드하여 사용하는 방법은 결과물이 MovieClip Class 로 생성된다. as 2.0의 플래시 플레이어 자체가 커다란 무비클립으로 이루어져있기 때문이다.
타임라인이라는 것은 MovieClip Class 에 들어있는 기능이고 지금까지의 개발은 사용하지도 않는 타임라인 관련 메소드와 속성을 어플리케이션에 담아왔다고 할 수 있다.


이제는 그것을 버려야 할 때가 왔다.





2. Document Class 를 사용하는 방법


일단 기우에서 먼저 말하자면 Document Class는 개인이 만들어낸 메인 파일이지 어떠한 내장 클래스가 아니다. 자바의 Main 파일을 생각하면 된다

Document Class 는 보통 Sprite Class 를 상속받아서 사용한다. Sprite Class 는 MovieClip Class 의 부모 클래스로서 타임라인이 빠진 무비클립이라고 생각하면 이해하기가 쉽다.
Sprite Class 는 다음과 같은 상속 관계를 가진다

MovieClip Class > Sprite Class > DisplayObjectContainer > InteractiveObject > DisplayObject

DisplayObject : 클라이언트가 눈으로 보게 되는 화면을 이루는 모든 종류의 객체
InteractiveObject : DisplayObject 중 마우스와 키보드이벤트에 반응하는 객체
DisplayObjectContainer : 자신 안에 다른 DisplayObject 를 담을 수 있는 객체 (무비클립 안에 다른 무비클립, 그래픽심볼, 텍스트 필드가 들어가 있듯이...)

어플리케이션은 일단 눈으로 보여야 하고 사용자의 입력장치에 반응해야 하며 안에 무언가는 담겨 있어야 하니 기본적으로 Sprite Class 를 사용하게 되는 것이다. 당연히 타임라인을 사용할 일이 생기면 MovieClip Class 를 상속받아서 만들면 된다


기본적으로 다음과 같이 시작하게 된다.


package    // 패키지 경로
{
    import flash.display.Sprite; // Sprite class 를 사용하기 위하여 클래스 임포트

    public class Main extends Sprite // Sprite class 를 상속받은 Main 클래스
    {
        public function Main() // Main 클래스의 생성자
        {
            trace("welcome to AS3.0"); // 아웃풋 창에 "welcome to AS3.0" 문자열 출력
        }
    }
}


이렇게 만들어놓고 Main.as 라는 파일명으로 저장하면 된다. 이걸 컴파일 해서 swf 파일로 만들어보자


flash 에서 File > New 클릭
팝업으로 뜨는 New Document 창에서 맨 위의 Flash File (ActionScript 3.0) 더블클릭 후 Main.fla 로 저장
새로 만들어진 문서의 아래쪽 Properties 탭에서 비어있는 Document Class 에 위에 저장해 놓은 파일명인 Main 라고 기입
Control > Test Movie 로 컴파일하여 Main.swf 파일 생성

이렇게 하면 아웃풋창이 뜨면서 "welcome to AS3.0" 를 확인하게 된다. 드디어 Main.swf 란 어플리케이션을 만들게 되었다.


p.s. package 의 경로를 설정하였다면 Properties 탭에도 똑같이 쓰면 된다.

예를 들어

package com.minarto.app
{
    import flash.display.Sprite;

    public class Main extends Sprite
    {
    }
}



이렇게 만들었다면 Properties 탭에 com.minarto.app.Main 이라고 쓰면 된다.



크리에이티브 커먼즈 라이선스
Creative Commons License
posted by 미나토
 <PREV 1 2 3 4 5 ... 7    NEXT>