플래시에서 텍스트필드는 세가지로 나누죠.  static,Dynamic, input ...


이중에서 static 의 경우는 퍼블리싱할때 입력된 텍스트를 쉐이프로 변환되서 들어갑니다. 즉 폰트의 정보를 받아서 백터화 시킨다고 생각하면됩니다. 그렇기 때문에 한번 퍼블리싱된후에는 해당 폰트가 없는 피씨에서 swf를 열어 보더라도 폰트정보를 읽어와서 텍스트를 보여주는것이 아니기 때문에 정상적으로 내가 선택했던 폰트로 나옵니다. 물론 fla 소스에서는 없는 폰트로 나오겠지만요...


그리고 dynamic과 input 텍스트 필드의 경우는 액션스크립트 또는 직접입력에 의해서 변수값을 받아 뿌려지는 형태입니다.

이것은 static과는 달리 퍼블리싱할때 백터화 시키지 않고 폰트정보만 기억하고 있다가 swf가 실행될때 내 컴퓨터의 폰트박스를 검사해서 해당 폰트가 있으면 그 폰트정보를 받아와서 동적으로 화면에 보여주게 됩니다. 그렇기 때문에 사용되었던 폰트가 없는 다른 PC 에서는 정상적으로 나오지 않게 되며 시스템 기본 폰트로 대치되어 나옵니다.


즉 dynamic, input 텍스트 필드는 백터 성분을 가진 심볼의 형태가 아니기 때문에 _alpha속성, _rotation속성, mask레이어가 적용되지 않습니다.


단, 마스크의 경우는 마스크레이어를 이용했을때에는 작동하지 않지만, setMask() 메서드를 이용해서 액션을 통해서 주게 되면 작동합니다. 이것은 조금 일관성없는 부분이긴합니다. 매크로미디어에서 플래시를 만들때 놓친부분인듯합니다. 즉 마스크레이어의 경우는 플래시 초기 버전부터 있었던 기능이었고 setMask의 경우는 mx 버전부터 나온 기능입니다. 초기버전에서는 생각지도 못했다는것이죠.

나중에 나온 setMask에서는 그 기능까지도 가능하게 만든것이라 여겨집니다. 그리고 마스크레이어에도 이것을 적용시키는것에는 놓치거나 크게 중요하다고 생각하지 않은것 같습니다.


해결방법 :

 다이나믹과 인풋 텍스트필드에서 퍼블리싱 할때 폰트 정보 뿐만 아니라 그 정보를 이용해서 쉐이프로 백터화 시켜버리면 해결되겠죠.

 그것이 임베드 폰트(embed font)입니다. embed 라는 말은 포함시켜버린다는 말이죠. 즉 폰트의 아웃트라인 백터 정보까지 포함시켜버리기 때문에 임베드 폰트가 적용된 텍스트는 static 텍스트에서 했던거와 똑같이 작동합니다. 즉 알파,회전,마스크가 모두 적용됩니다.


임베드 폰트 시키는 방법은 두가지가 있습니다.

1. 속성창에서 Character 창을 열어 한글,영문,그밖의 언어에 대해 해당 언어를 모두 임베드시키거나 입력된 글자만 임베드시키는 방법.

2. 액션스크립트를 이용해서 textFiled 오브젝트를 생성하고 해당 텍스트필드 오브젝트를 embedFonts 속성값을 true 로 지정하는 방법.


>> 속성창을 통한 폰트 임베드

1번의 경우에서 해당 언어를 모두 임베드시키게 되면 swf 파일안에 폰트정보가 모두 들어가기 때문에 상당히 용량이 커지게 되는 단점이 있습니다. 입력된 글자만 임베드시키게 되면 용량은 줄어드는 대신 다이나믹이나 인풋텍스트필드의 의미를 잃게 됩니다.

다이나믹이나 인풋은 유동적으로 내용이 변경되기 위해서 만든것이기 때문이죠. 이것을 쓸바에야 그냥 static를 쓰는게 낫겠죠.

물론 유동적으로 바뀌는 내용이 한정되 몇단어라면 상관이 없겠지만요..



>> 액션을 통한 폰트 임베드

2번의 경우에도 해당 폰트를 임베드시키기 때문에 파일 사이즈가 커지게 되어 있습니다. 우선 준비되어야되는것이 라이브러리 오른쪽 상단에 있는 아이콘을 누르면 New Font 라는 것이 있습니다. 즉 폰트 심볼을 만들어야됩니다.

라이브러리에 폰트심볼을 만들고 Linkage 설정에서 ID 값을 주게 되면 swf 퍼블리싱 때 자동으로 임베드 됩니다.

아무것도 내용이 없어도 이렇게 임베드만 시켜도 HY견고딕의 경우 257KB 라는 용량이 됩니다.  (용량이 커지는것을 해결하기 위해서는 임베드폰트한 swf 를 따로 만들어서 런타임공유심볼로 불러오는 방법도 있습니다.)


임베드 시킨다음 액션으로 해당 텍스트픽드의 임베드를 지정하면 끝납니다.  자세한 액션 코드는 다음과 같습니다.

my_txt.text = "지그프리 임베드 폰트 테스트입니다.";

my_txt.embedFonts = true;


myformat = new TextFormat()

myformat.font = "지그폰트"

my_txt.setTextFormat(myformat)

먼저 my_txt 라는 인스턴스네임으로 다이나믹 텍스트 필드를 만들고 라이브러리에서 New Font 를 통해 폰트심볼을 만듭니다.

New Font 심볼을 라이브러리에서 두번클릭해서 속성에서 내가 임베드시킬 폰트를 선택합니다.(폰트이름(Name)은 크게 상관없습니다.)

해당 폰트심볼을 마우스 오른쪽 클릭 메뉴에서 Linkage 옵션창을 열어서 첫번째에(Export for ActionScript) 체크 합니다.

그리고 바로 위에 ID 입력란에 액션으로 불러올 이름을 지정합니다. 저는 위에서 "지그폰트"라고 입력했습니다.

그리고 나서 프레임에 위와 같은 액션을 입력하면 끝입니다.


스크립트에 대한 설명 :

  1 .my_text 라는 텍스트 필드 오브젝트에 text 속성을 이용해서 문자열을 입력합니다.

  2. my_text 라는 텍스트 필드 오브젝트를 임베드 폰트로 지정합니다.

  3~4. 폰트 포멧을 지정하기 위해서 TextFormat() 오브젝트를 생성하고 font 속성을 지정합니다.

  5. 설정해놓은 텍스트 포멧(myformat)을 준비해놓은 my_txt 텍스트 필드에 적용합니다.

Posted by 으니가저아
: