scaleform.minarto.com

[강좌] 태그 클라우드 만들기 4 본문

ActionScript

[강좌] 태그 클라우드 만들기 4

미나토 2008. 1. 7. 09:07


네번째 시간에 들어와 또 한가지 강좌에 대한 부연 설명 & 변명

이 강좌는 모 카페에 글을 올려 등급을 올리기 위해(레벨놀이 하려는게 아니라 남의 글 좀 보려고) 시작한겁니다.
동기가 불순(?)하다보니 강좌는 날림일 것입니다. 자세한 설명은 없을 거고요... 지금까지 올린 코드들은 컴파일도 안해봤습니다. 블로그에 바로 키보드 두들겨서 쓰고선 바로 옮긴겁니다. 앞으로도 딱히 해볼 것 같지는 않습니다.
앞으로도 대충 써놓고 자세한 설명은 레퍼런스를 살펴보시라는 식으로 진행할 겁니다

그러니 어떤 에러가 여러분 앞에 닥쳐도 그것은 예정된 일일 뿐입니다.


사실 3.0을 별로 마음에 안들어 하는 사람입니다. 아직 버그가 너무 많아서 실무에 쓰기에는 적당치 않다고 생각합니다.
하지만 실무에는 실용적인 컨텐츠 말고도 테크닉이나 기술력을 보여줘야 하는 일도 있는 법이지요.

저도 3.0을 무작정 싫다는게 아니고 좀더 플레이어가 안정화 되야 한다고 생각할 뿐이고 아직은 덜 그렇다는 것이죠. 공부를 할 이유는 충분하다 생각합니다.



그럼 다시 한번 각설하고... 지난 번에 얘기했듯이 이 강좌는 2.0에서 3.0으로 넘어가기 위합입니다. 그러니 2.0으로 태그 클라우드를 먼저 한번 짜보겠습니다.
swf에 dataxml=data.xml 이라고 변수를 던져줘서 받을 경우를 보겠습니다.


var xml:XML = new XML();
xml.onLoad = Delegaete.create(this, onLoad);

var data_array:Array;
function onLoad(success:Boolean):Void
{
    if(success)
    {
       data_array = [];

        var tag_array:Array =  XPathAPI.selectNodeList(xml.firstChild,"/tag/data");
        var cnt:Number = tag_array.length;
        for(var i:Number=0; i<cnt; i++)
        {
           var data_node:XMLNode = tag_array[i];
      
            var label:String = data_node.attributes.label;
            var rank:Number = Number(data_node.attributes.rank);
            var imp:Number = Number(data_node.attributes.imp);
            var link:String = data_node.attributes.link;

            data_array.push({label:label, rank:rank, imp:imp, link:link});
        }
       start();
    }
}
function start():Void
{
    trace("start")
}

xml.load(dataxml);


뭐, 이런 식이 될겁니다.

그냥 XML 클래스의 속성을 이용하시는 분도 있고 xfactorstudio 의 xpath 패키지를 사용하시는 분도 있겠지만 저는 mx부터 제공된 XPathAPI 를 사용했었습니다. XML은 사용이 복잡하고 xfactorstudio 는 너무 무겁더라고요. 혹시 XPathAPI 클래스를 모르시는 분들은 언제나 그렇듯 레퍼런스 검색을...


이렇게 사용하던 xml 파싱이 3.0 에서부터는 e4x를 사용하기 시작합니다. 이또한 레퍼런스를... 중요한건 코드니까요...

그래서 다음과 같이 변환됩니다. 3번 강좌의 Document class 안에 넣으셔야 합니다. package 부터 쓰기가 귀찮아서...ㅡ.,ㅡ;;;

*1 protected var data_array:Array;
public function Main()
{
    *2 var file:String = LoaderInfo(root.loaderInfo).parameters.dataxml;
   *3 var loader:URLLoader = new URLLoader();
    loader.addEventListener(Event.COMPLETE, complete);
    loader.load(new URLRequest(file));

    *4 addEventListener("start", start);
}

protected function complete(e:Event):void
{
    data_array = [];

    *5 var xml:XML = e.currentTarget.data as XML;
    var cnt:uint = xml.tag.data.length();
    for(var i:uint=0; i<cnt; i++)
    {
       var data_xml:XML = xml.tag.data[i];
      
        var label:String = data_xml.attributes.label;
        var rank:uint = uint(data_xml.@rank);
        var imp:uint = uint(data_xml.@imp);
        var link:String = data_node.@link;

       data_array.push({label:label, rank:rank, imp:imp, link:link});
    }
    dispatchEvent(new Event("start"));
}

protected function start(e:Event):void
{
    trace(e);
}


대충 이런 식이 되지요.... 좀 길어졌으니 이후 설명은 다음 강좌로 넘기겠습니다.



p.s. 제가 다시 한번 돌아봐도 날림 강좌네요... 코드도 뒤죽박죽에 설명도 별로 없고 ㅋㅋㅋ...


*1 protected : 자식 클래스만 접근할 수 있는 메소드나 속성을 정의합니다
*2 : 3.0에서는 루트 변수로서 플레이어의 매개변수를 접근할 수 없습니다. LoaderInfo 클래스를 사용해야 합니다
*3 : 2.0과 3.0의 XML 클래스는 다릅니다. 더이상 XML 의 메소드로 문서를 호출할 수 없습니다. 3.0 에서는 URLLoader 클래스를 이용해 문서를 로드합니다. String 객체를 직접 로드할 수 없으며 URLRequest 객체로 변환해줘야 합니다
*4 : Sprite 클래스를 상속받았기 때문에 EventDispatcher 클래스를 상속받지 않고도 바로 이벤트 핸들러를 연결할 수 있습니다. Sprite 에 대해서는 추후 다시 설명하겠습니다
*5 : e4x 방식의 파싱은 딱히 머라 설명할게 없습니다. 그런 약속이기 때문에... 레퍼런스 한번 훌터보시고 외우시길...


p.s. 코드에 보면 패키지를 임포트하지 않았습니다.
    첫째, 다 쓰기 귀찮기 때문이고, 두째, 클래스를 하나씩 하나씩 레퍼런스 찾아가면서 공부하시라는 나름 깊은 뜻이 있답니다.