scaleform.minarto.com

라이브러리를 통한 런타임 공유시 ApplicationDomain 내의 클래스 충돌 0 본문

Core

라이브러리를 통한 런타임 공유시 ApplicationDomain 내의 클래스 충돌 0

미나토 2012. 5. 13. 10:31

앞선 Autodesk Gameware User Summit 2012 글에서도 잠시 언급했지만 이 문제로 생각보다 많은 분들이 어려움을 겪고 있다는 것을 알았습니다.


그런데 스케디모 내에서 진행하는 스터디에서도 몇몇 친구들을 가르치다 보니 이게 단지 몇명만의 문제가 아니더군요...

귀차니즘을 물리치고 아무래도 포스팅을 해야겠다는 생각을 했습니다.


사실 왜 이런 문제가 발생할 지에 대해서 좀 유추해보면 이렇습니다.


1. C++ 개발자들은 뭐 당연히 Actionscript 라는 스크립트 언어에 익숙치 않아서일거고요...


2. 플래시 개발자들은 당연히 알아야 할 듯 하지만서도... 사실 웹쪽에서의 플래시 어플리케이션 개발에는 라이브러리를 통한 런타임 공유를 하지 않습니다.

다른 방법들을 쓰거든요... 하지만 스케일폼 작법에는 이 방법이 맞기에 이 방법을 쓰고는 있지만 잘 모르는 것이지요...

그리고 사실 ApplicationDomain 이 뭔지 모르는 개발자가 많습니다...


3. 스케일폼에서 제공하는 샘플이 실무와 잘 맞지 않습니다. 샘플처럼 실무에서는 버튼이나 모든 공유 컴포넌트를 몇가지 형태로만 만들어서 Component_Library.swf 이 파일 하나로 사용하질 않죠...

보통 파일의 효율적인 관리를 위해 여러개의 swf로 나누니까요...


그리고 그 해법이라고 몇몇 알려져 있는 방법들도 잘못되어 있습니다. 아니 잘못됐다기 보다는 노가다들로 해결하고 있다고 봐야죠...

현재 몇몇 알려진 그 방법이란게...


1. 모두 컴파일 하세요...  라뇨... 뭐 해결은 당연히 됩니다만, 그 노가다를 어떻게 합니까...

물론 이런 방법(http://www.action-scripter.com/blog/1278)도 있긴 합니다만 어쨌든 노가다입니다.

게다가 플래시가 워낙 안정적(?)이어야 말이죠... 여러개 fla 만 열어놓으면 툭하면 다운되기 일수라...


2. 메인클래스에 모든 클래스를 임포트해서 컴파일 하세요...

이것도 방법이라면 방법이지만... 이것도 문제가 있습니다.

모든 코드를 임포트하는 것도 노가다이고, 메인(시작점) 클래스와 타코드들이 격리가 되지 않아 코드가 무거워지고 드러워지는건 둘째치고선... 메인클래스에도 혹시 공유 라이브러리를 쓸 경우에는 적용이 안되는 경우가 있습니다.



일부 해결은 된다지만 다 노가다성입니다. 웬지 코드로서도 쿨~ 하지가 않고요...



제가 지금부터 말씀드릴 방법은 임포트를 하되 임포트를 하지 않는 방법입니다.



예를 들어 버튼을 확장했다고 치겠습니다.


그럼 이런 식이 되겠죠...


package  {

import scaleform.clik.controls.Button;

import flash.events.*;

public class ButtonX extends Button {

override protected function configUI():void{

super.configUI();

this.addEventListener(MouseEvent.CLICK, onClick);

}

protected function onClick($e:Event):void{

alpha = 0.3;

}

}

}


뭐 이정도라고 하죠. 클릭하면 알파값이 작아지도록 확장했습니다.

(as3 기준으로 설명하지만 as2도 전혀 다르지 않습니다. as2 가 언어의 유연성으로는 as3보다도 강력하기 때문에 그대로 응용하시면 됩니다)


이걸 다른 fla 에 런타임 공유를 하면요... 해당 메인 클래스는 다음과 같을 겁니다


package  {

import flash.display.Sprite;

import flash.events.*;

public class test extends Sprite {

public var b:ButtonX;

public function test():void {

trace(b)

}

}

}


뭐 이정도가 되는 것이죠... 아마도 대개 이렇게들 짜실 겁니다.


바로 여기서부터가 잘못되었습니다.



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