본문 바로가기

Actionscript3.0

AS1.0, 2.0 으로 작성된 SWF 를 AS3.0 SWF 에서 로드할시 발생하는 문제점 해결

Actionscript 작업을 할때는, 언어 버젼의 호환성 문제가 종종 일어 나게 됩니다. 예를 들어 AS1.0, 2.0 으로 만들어진 파일을 AS3.0 으로 만들어진 SWF 에서 로드 한다거나, 할때 스크립트 호환 에러가 발생 합니다. 

 로드된 SWF(AS1.0,2.0) 의 이벤트가 적용안된다거나, 레이아웃이 깨진다거나 하는 문제들은 AS2.0 으로 이미 만든 무비 파일을 다시 AS3.0으로 컨버팅 해야만 하거나 아니면 따로 팝업 처리를 해 줘야만 이러한 버그가 없어지게 됩니다. 당연히 AS1.0 과 2.0 을 AVM1에서 운용되고, AS3.0 에서는 AVM2 를 사용하니 이러한 스크립트 호환 에러가 발생하는 것은 당연한 일이지만, 현실은 아직 Actionscript 하위 버젼과 (1.0,2.0) 과 상위 버젼(3.0) 이 공존 하고 있기 때문에 여간 불편할 일이 아닐수 없습니다.   

 이러한 문제를 조금이나마 해결해줄 ForcibleLoader를 소개 합니다. ForcibleLoader 는 Loader 를 사용하여 SWF 를 로드 할시 ForcibleLoader 라는 클래스로 Loader 를 감쌓아 주므로서 AVM 버젼 호환 문제를 없애를 방법입니다. 사용 방법은 다음과 같습니다.   

private function init():void{
	var loader:Loader = new Loader(); 
	loader.contentLoaderInfo.addEventListener(Event.COMPLETE, swfComplete);
	var fLoader:ForcibleLoader = new ForcibleLoader(loader);
	
	fLoader.load(new URLRequest(swfURL));
	fxStage.addChild(loader); 
	pptContainer.addChild(fxStage);

}

private function swfComplete(event:Event):void{
	libMC =  event.currentTarget.content as MovieClip;
	for(var i:int = 1;i


ForcibleLoader 로 기존의 Loader 를 감쌓서 ForcibleLoader 로 SWF를 로드 하는 방식 입니다. COMPLETE 에 대한 이벤트 핸들러인 swfComplete 에서는 event.currentTarget.content 로 로드된 SWF 객체를 받아 그 자체를 MovieClip 으로 인식하여 사용 할 수 있습니다. ForcibleLoader 의 소스를 보면 아래 코드와 같이 URLStream 객체를 이용하여 해당 SWF 를 로드 하고 COMPLETE 핸들러에서 파라미터로 넘겨준 Loader 객체를 이용한 것을 볼 수 있습니다.

public function ForcibleLoader(loader:Loader)
		{
			this.loader = loader;
			
			_stream = new URLStream();
			_stream.addEventListener(Event.COMPLETE, completeHandler);
			_stream.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			_stream.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
		}
private function completeHandler(event:Event):void
		{
			var inputBytes:ByteArray = new ByteArray();
			_stream.readBytes(inputBytes);
			_stream.close();
			inputBytes.endian = Endian.LITTLE_ENDIAN;
			
			if (isCompressed(inputBytes)) {
				uncompress(inputBytes);
			}
			
			var version:uint = uint(inputBytes[3]);
			
			if (version < 9) {
				updateVersion(inputBytes, 9);
			}
			if (version > 7) {
				flagSWF9Bit(inputBytes);
			}
			else {
				insertFileAttributesTag(inputBytes);
			}
			
			loader.loadBytes(inputBytes);
		}

많은 테스트를 거쳐서 입증을 해야 하겠지만, 현재로서는 아주 유용하게 쓰일 클래스 같습니다.  

ForcibleLoader.as


'Actionscript3.0' 카테고리의 다른 글

Actionscript3.0 강좌 모음  (0) 2008.12.15
플래시 개발자를 위한 플렉스 사용법  (2) 2008.12.11
[AS3.0] Array 간단한 팁  (0) 2008.12.11