scaleform.minarto.com

Object.watch 를 이용한 DataBinding 0 본문

Communication

Object.watch 를 이용한 DataBinding 0

미나토 2012. 3. 23. 19:52



scaleform4 에서는 CLIK 에 있는 DataBinding 을 통해서 클라와 데이터를 바인딩합니다.
(뭐, 다른 커뮤니케이션 방법도 있지만요... 가장 간단한 방법을 말한겁니다)


플래시(플렉스) 내부 에서는 데이터 바인딩을 위해 set/get 함수를 많이 사용합니다.


function set level($v:Number):void{

handler($v);

}

뭐, 이런 식 말이죠...


하지만 as2를 위한 한가지 방식이 더 있습니다. 바로 Object.watch 를 이용한 방법입니다. (as3에서는 지원하지 않습니다. 쓸 필요도 없고요)

as2나 js를 좀 해보신 분들은 이미 아시고 있을테니 뭐 제 설명은 필요치 않겠죠...


모르는 분들은

http://help.adobe.com/ko_KR/FlashPlatform/reference/actionscript/2/00001438.html#1358707

자세한 설명은 이걸 보시면 되고요...


암튼 이걸 활용하면 as3용 CLIK 의 DataBinding 을 사용하듯이 클라이언트와 굉장히 편하게 바인딩을 할 수 있습니다.


예를 들어 이런거죠... 다음의 코드를 보시면...


var player = {};

_root.player = player;

player.level = 0;

player.watch("level", f);

function f($p:String, $o, $n):Void{

trace($n);

}

player.level = 1;


플레이어의 레벨을 클라이언트와 UI가 동기화하기 위한 코드입니다


실행해보시면 level 에 1이 들어간 순간 f라는 함수가 실행되어 새로 들어온 값인 1을 출력하게 됩니다.


이게 동작하는 것을 확인했다면 모든 플레이어 데이터를 _root.player 객체에 키값으로 넣어놓고선 클라가 직접 해당 키값만 Direct Access 로 바꿔버리면 해당 함수가 실행되게 되는 겁니다.


뭔가 굉장히 편해보이지 않습니까??? 아닌가???....ㅡ.,ㅡ;;;

클라이언트가 특정 UI를 찾고선 해당하는 메소드에 인자를 던져서 실행할 필요가 없는거죠...



예를 들어 플레이어의 레벨이나 이름, 또는 돈 같은 데이터들은 한곳의 UI에만 사용되어지는게 아닙니다. 적어도 한 4-5 군데는 되죠...

플레이어정보창, 인벤토리, 창고, 상점, 편지, 스킬상점, 경매장 등등에 돈 데이터가 변해야 한다면


_root.경로.경로.플레이어정보창.setMoney

_root.경로.경로.인벤토리.setMoney

_root.경로.경로.창고.setMoney

_root.경로.경로.상점.setMoney

_root.경로.경로.편지.setMoney

_root.경로.경로.스킬상점.setMoney

_root.경로.경로.경매장.setMoney


이런 식으로 클라이언트가 Direct Access 를 해야할 겁니다. (현재 저희는 이렇게 해요)

클라가 모든 UI의 패스를 알아야 하고, 모든 UI 의 돈 데이터를 저장할 api를 알고 있어야 하죠... 각 UI의 onLoad 도 기다려야 합니다


그런데 그럴 필요가 없다는 거죠.


_root.player.gold 의 값만 Direct Access 로 바꿔주면 끝난다는 겁니다.




하지만 여기까지는 이미 as2가 익숙하신 개발자분들이나 js를 쓰던 분들은 아는 내용이기도 합니다.

그리고 굳이 레퍼런스에 나와있는 내용을 제가 설명할 필요도 없고요...





이 watch 에는 문제가 있습니다. 하나의 속성값에 하나의 핸들러 함수만 연결할 수 있는 것이지요...

그래서 이 녀석을 사용하려면 좀 손을 볼 필요가 있습니다.



http://scaleform.minarto.com/342 로 이어집니다