Archive for the 'Flash' Category

SWFObject add-on: MouseWheel on Mac

관련사이트
http://blog.pixelbreaker.com/flash/swfmacmousewheel/
mac os 상에서의 Flash Player 는 마우스 휠을 감지하지 못한다. 따라서 이 문제를 해결하려면 플래시 내부에서 마우스 휠반응을 체크하는 것이 아니라 자바스크립트로 마우스 휠을 감지하여 플래시로 알려줘야 된다.

SWFMacMouseWheel 라는 자바스크립트 파일을 사용하여 플래시의 내부 함수를 호출한다.
그리고 플래시에서는 ExternalInterface를 사용하여 자바스립트에서 호출하는 함수를 받아서 마우스 휠 반응을 처리한다.

<actionscript code>

import flash.external.ExternalInterface;
import com.pixelbreaker.event.EventBroadcaster;
/**
* @author Gabriel Bucknall
*
* Class that supports using the mouseWheel on Mac OS, requires javascript class
* swfmacmousewheel.js
*/
class com.pixelbreaker.ui.MouseWheel
{
private static var isMac:Boolean;
private static var macBroadcaster:EventBroadcaster;
 
private static function main():Void
{
isMac = System.capabilities.os.toLowerCase().indexOf( "mac" ) != -1;
if( isMac )
{
macBroadcaster = new EventBroadcaster();
ExternalInterface.addCallback( "externalMouseEvent", MouseWheel, MouseWheel.externalMouseEvent );
}
}
/**
* Add a listener for using the mouseWheel
* obj param must have an "onMouseWheel" method to be called.
*/
public static function addListener( obj:Object )
{
if( !isMac ) MouseWheel.main();
if( isMac )
{
macBroadcaster.addListener( obj );
}else{
Mouse.addListener( obj );
}
}
 
/**
* Remove a listener
*/
public static function removeListener( obj:Object ):Void
{
if( isMac )
{
macBroadcaster.removeListener( obj );
}else{
Mouse.removeListener( obj );
}
}
 
private static function externalMouseEvent( delta:Number ):Void
{
macBroadcaster.broadcastMessage( "onMouseWheel", delta );
}
}

<frame code>

MouseWheel.addListener(this);

타임라인 상에 MouseWheel Class 를 사용하여 리스너를 생성한다.

<html code>

<script type="text/javascript"><!--mce:0--></script>

SWFObject 를 사용하여 swf 파일을 임베드하였다. 마지막 줄 코드만 삽입하면 html
상에서 플래시로 마우스 휠반응을 감지하여 값을 보낼수 있다.

SWFObject: SWF embed script

SWFObject is a small Javascript file used for embedding Macromedia Flash content. The script can detect the Flash plug-in in all major web browsers (on Mac and PC) and is designed to make embedding Flash movies as easy as possible. It is also very search engine friendly, degrades gracefully, can be used in valid HTML and XHTML 1.0 documents*, and is forward compatible, so it should work for years to come.

SWFObject는 swf 임베드 자바스크립트 소스이다.

2006년도 초에 이올라스와의 소송이후 MS에서 IE설계를 바꿔 embed,object 태그의 직접사용을 막아 놓았기 때문에 swf 파일을 html 에 임베드할때 반드시 외부 자바스크립트 파일로 해야지만 플래시 활성화 클릭이 뜨지 않고 보여지게 되었다. 그 이후로 여러 다른 사람들이 만들어 놓은 swf 임베드 javascript 파일 소스를 사용하여 쓰곤했는데 플래시로 변수를 넘겨줄때는 여러모로 불편한 문제가 있었다. 종종 해외사이트에서 사용된 SWFObject 가 오픈 소스였다니….그때는 무심코 넘겼는데 자세히 보니 여러가지로 유용한 점이 많이 있는 것 같다.
또한 브라우저 종류에 상관없이 모든 플랫폼에 적용되어 범용성 측면에서도 도움이 될 듯 싶다.

<SCRIPT type=text/javascript>
var so = new SWFObject(“movie.swf”, “mymovie”, “200″, “100%”, “7″, “#336699″);
so.addParam(“quality”, “low”);
so.addParam(“wmode”, “transparent”);
so.write(“flashcontent”);
</SCRIPT>

사용법은 어렵지 않다. SWFObject 객체를 생성해서 파라미터만 넘겨주면 된다. 플래시파일 버전 체크도가능하다. 위에서 보이는 7 이라는 숫자 파라미터가 체크할 Flash Player 버전이다. 여기까지 기존의 임베드 스크립트와 별반 다르지 않다.

<SCRIPT type=text/javascript>
var so = new SWFObject(“movie.swf”, “mymovie”, “200″, “100″, “7″, “#336699″);
so.addVariable(“variable1″, “value1″);
so.addVariable(“variable2″, “value2″);
so.addVariable(“variable3″, “value3″);
so.write(“flashcontent”);
</SCRIPT>

위에서와 같이 플래시 파일안으로 쉽게 변수를 넘겨 줄 수 있다. 자바스크립트에 익숙하지 않는 사람에게는 변수 처리하는 과정이 여간 까다로운게 아니다. 브라우저 플랫폼에 따라서 결과 값이 다를수도 있고…. 또한 url 로 붙여서 들어온 변수도 처리해 줄수도 있다. 예를 들어

http://www.example.com/page.html?variable1=value1&variable2=value2 다음과 같은 주소로 변수가 붙어서 들어왔을 경우

<SCRIPT type=text/javascript>
var so = new SWFObject(“movie.swf”, “mymovie”, “200″, “100″, “7″, “#336699″);
so.addVariable(“variable1″, getQueryParamValue(“variable1″));
so.addVariable(“variable2″, getQueryParamValue(“variable2″));
so.write(“flashcontent”);
</SCRIPT>

위와 같이 getQueryParamValue 함수를 이용하면 쉽게 플래시 안으로 넘겨줄 수 있다.

관련 사이트
http://blog.deconcept.com/swfobject/

FDT 1.5 is released

FDT1.5 eclipse 상용 플러그인인 FDT 가 새로운 버전을 릴리즈 했다.

아직 AS3.0 은 지원하지 않아 좀 아쉽지만 나름대로 유용한 기능을 많이 첨가한것 같다.

- Eclipse 3.2 support

- MAC help update improved

- Better UTF-8 Support

- New: Project- and workspace wide reference search

- New: Mark occurrence in the editor area

- New: ass kick´in external Flashplayer with real helpful features and ANT support (windows only for the first step)

- New: classpath editor (imports projectclasspaths to the Flash IDE)

- And of course bugfixes and small other improved things

보기에는 크게 달라진 부분은 없지만 그래도 가장 맘에 드는 업데이트 부분은 class 와 interface 를 실제로 눈으로 구분할수 있게 아이콘으로 바뀌었다는 점이다. interface 는 파일명을 대문자 ‘I’  로 시작하게 정하지만 그래도 한눈에 알아볼수 없어 불편했었는데 이번에 새롭게 업데이트 되었다.

또한  reference 를 일괄적으로 찾아주어 연결된 부분을 알기 쉽게 하였다.

개인적인 생각으로 플래시 개발툴중에 FDT 만큼 강력한 기능을 제공하는 툴은 없는것 같다.

좀 리소스 측면에서 잡아먹기는 하지만 그정도는 무시할 수준이다.

플래시 개발자라면 체계적인 개발과 효율적인 소스관리에 측면에서 사용해 볼것을 강력히 추천한다.

Advanced progressive download

대부분의 flash video 를 사용할경우 progressive download 방식을 활용하여 용량 큰 무비를 사용할 수 있게 한다.
하지만 이 방식은 단순히 영상을 플레이하는데 목적이 있을때만 적용가능한 일이다.
다시말해 비디오자체를 트랜지션(transition) 무비로 사용할 경우 적절하지 못한 방법이다.
영상을 트랜지션 무비로 사용하려면 로딩타임이 존재하면 안된다.
flv 파일을 사용하여 progressive download 로 트랜지션 무비를 구현할경우 초기화 타임이 생기게 되어
약간의 딜레이가 생긴다.(이는 사운드 파일을 포함했을경우 더 큰 영향을 준다.)

테스트해 본 결과 레퍼런스에는 권장하지 않는 방법이긴 하지만 swf 파일안에 video 파일을 임베드하는 방법이 위의 문제를 가장 잘 해결할수 있는것 같다. 이 방법에는 사운드 싱크에 문제가 있긴 하지만 오디오 파일이 존재하지 않을경우 가장 딜레이 없이 영상을 플레이 할 수 있는 방법이다.

하지만 사운드가 포함될 경우에는 문제가 있다.
사운드 싱크의 해결을 위해 stream 으로 설정할 경우 로딩없는 플레이가 적용되지 않는다.
반드시 20%정도 로딩이 완료되어야지만 그때서 재생이 되는 현상이 발생한다.

사운드 싱크가 그리 큰 문제가 되지 않는다면 사운드 sync 를 stream 이 아닌 event 로 설정해야 원하는 로딩없는 플레이를 할 수 있다. 물론 사운드의 압축한 상태는 충분히 작은 상태로 만들어야 한다.

따라서 로딩없는 transition movie 를 구성하기 위해서는 사운드가 없는 비디오파일을 재생할 경우 가장 잘 적용되고 사운드가 포함될 경우에는 사운드 파일의 sync 를 event 로 설정해서 최대한 압축한후 사용해야한다.

URL Encoding

escape 함수
escape(expression:String) : String
매개 변수를 문자열로 변환하거나 영숫자가 아닌 모든 문자를 % 16진수 시퀀스로 바꾸는
URL 인코딩 형식으로 인코딩합니다. URL 인코딩 문자열에서 사용되면 퍼센트 부호(%)는
이스케이프 문자를 시작하는 데 사용되고 이는 모듈러스 연산자(%)와 동일하지 않습니다.

URL인코딩은 웹에서 흔히 볼수 있는 것으로
“kimkijeung%20vkimone”를  “kimkijeung%vkimone” 이런식으로 인코딩을 하는 것을 말한다.


외부 데이터와 연동을 시킬 때는 꼭 사용해야 에러를 막을 수 있다. 반대로 바꿔 주는 함수로는 unescape 가 있다.


예) a=escape(“김기정”);
    trace(a);


/* 이 구문을  실행하면 output 창에


%EA%B9%80%EA%B8%B0%EC%A0%95


과 같이 나온다. */


다른 나라 사람의 언어 환경을 고려하지 않는다면 별 해당사항이 없겠다.
하지만 각 나라마다 고유의 언어 셋이 있어 나라 별로 컴퓨터에서 사용하는 언어가 다르다.
플래시에서 그냥 static field 를 사용하여 작성한다면 그냥 적은 그대로 보이겠지만
외부 데이타를 가져 와서 보여 줘야 한다면 반드시 주의할 점이 있다.

플래시에서의 정보는 유니코드(utf-8) 로 입출력된다. 플래시가 기본적으로 외부 텍스트를 해석할테
System.useCodePage 값을 true 로 설정하지 않느다면 말이다.

useCodePage  는 Flash Player가 외부 텍스트 파일을 해석할 때 유니코드를 사용할 것인지 현재 운영 체제의 기존 코드 페이지를 사용할 것인지 여부를 지정하는 부울 값이다
간혹가다 유니코드로 인코딩 되지 않은 외부데이타를 불러올때 플래시에서 깨져서 보이는 경우가 있다. 이럴때 useCodePage 값을 true 로 설정하면 현재 운영체제에 맞는 코드 페이지를 사용하여 텍스트가  재대로 보이게 된다.

하지만, System.useCodepage를 true로 설정하는 경우, 현재 운영 체제의 기존 코드 페이지에 외부 텍스트 파일에 사용된 문자가 포함되어 있어야만  텍스트를 표시할 수 있습니다. 예를 들어, 중국
어 문자가 포함된 외부 텍스트 파일을 로드하는 경우, CP1252 코드 페이지에는 중국어 문자
가 들어 있지 않기 때문에 이 페이지를 사용하는 시스템에서 이 문자들이 표시되지 않는다.

모든 운영 체제 사용자가 SWF 파일에 사용된 외부 텍스트 파일을 볼 수 있게 보장하려면 모
든 외부 텍스트 파일을 유니코드로 인코딩하고 System.useCodepage를 기본값인 false로 설
정해야 한다.

하지만 이걸로 모든 문자가 표시되는 것이 아니다. 플래시에서 데이타를 저장하고 그걸 다시 불러올때 이런 방식으로 해도 데이타는 원하는 값을 표시할수 없다.
반드시 특수문자나 다른 나라 언어를 저장할때는 텍스트 정보를 URL 인코딩 방식으로 변환하여 보내야 한다.

여기서 escape, 와 unescape 를 사용하면 된다.
그리고 반드시 URL 인코딩을 사용하려면  System.useCodepage 는 기본값인 false 로 놓아두어야 한다. 그렇지 않으면 각 나라의 운영체제의 코드 체계의 문자들의 바뀌어져 인코딩 되어 다른 결과가 보여질 것이다.