블로그 이미지
플래시 개발자랍니다... 하지만 여긴 플래시 전문 블로그가 아닌 그냥 개인 블로그랍니다
미나토

Recent Comment

calendar

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
  • 38,392total
  • 4today
  • 19yesterday
2008/11/06 14:13 Flash Platform


지지난 주에 정식으로 Flash Player 10 이 업데이트 되었고 Flash CS4 트라이얼 버전도 풀리기 시작했는데... 짬을 내서 사용하다보니 알려진 것 이외의 몇가지 변경점이 발견되었다.




1. 프로젝트 파일 (*.flp) 하위 호환이 안된다.

 좀 어이가 없는 일 중에 하나인데 의도적인 것인지 버그인지 아직은 알 수가 없다. CS3 에서 프로젝트 파일 생성 후 저장하고 CS4 에서 열어보면 포맷이 안맞다는 에러메세지만 뜰 뿐이다.

물론 fla 를 새로 만들어야 하는 것보다야 별 일 아닐 수 있겠지만 하위호환 불가라는 엄청난 변경점은 완성도에 의문이 가게 만드는 일임에 틀림없다




2. 임베디드 폰트의 폰트명이 바뀌었습니다.

제가 제목을 잘 붙인건지 모르겠네요. 다음의 코드를 보시죠

윤고딕 330을 라이브러리에 임베디드 한 후...


var f:Array = Font.enumerateFonts(false);
for(var i:uint=0; i<f.length; i++)
{
    trace(f[i].fontName);
}


을 찍어 보시면 CS3 에서는 "-윤고딕330" 이라고 나오고 CS4 에서는 "YDIYGO330" 이라고 나옵니다

CS3 처럼

TextField.defaultTextFormat = new TextFormat("-윤고딕330", 12, 0);


이라고 코드를 작성하신다면 화면에는 아무 텍스트도 안나오게 될 것입니다



3. TextField 의 크기 구하는 방식이 변경되었습니다

CS3 에서 다음의 코드를 실행하면 노란색과 같이 나옵니다.

var txt:TextField = new TextField();
txt.defaultTextFormat = new TextFormat("-윤고딕330", 20 );
txt.text = "ABCD";
txt.embedFonts = true;
txt.autoSize = TextFieldAutoSize.LEFT
addChild( txt );
trace("[ Test_1 ] Height : " + txt.textHeight + "  Width : " + txt.textWidth );
trace("[ Test_1 ] Height : " + txt.height + "  Width : " + txt.width );


[ Test_1 ] Height : 22.650000000000002  Width : 53.150000000000006
[ Test_1 ] Height : 26.650000000000002  Width : 57.150000000000006



CS4 에서 다음의 코드를 실행하면 노란색과 같이 나옵니다.

var txt:TextField = new TextField();
txt.defaultTextFormat = new TextFormat("YDIYGO330", 20 );
txt.text = "ABCD";
txt.embedFonts = true;
txt.autoSize = TextFieldAutoSize.LEFT
addChild( txt );
trace("[ Test_1 ] Height : " + txt.textHeight + "  Width : " + txt.textWidth );
trace("[ Test_1 ] Height : " + txt.height + "  Width : " + txt.width );


[ Test_1 ] Height : 22.65  Width : 53.15
[ Test_1 ] Height : 26.65  Width : 57.15


이 변경사항이 정확히 소숫점 두째자리에서 반올림을 하는 것인지 아니면 다른 방식인지는 정확히 알 수 없습니다만 보시듯 변경된 것은 확실합니다

별 거 아닌 것처럼 보일 지 모르지만 올림, 내림, 반올림 또는 정수형으로 형변환을 해버리면 정수값이 달라져 버리는 경우가 있기 때문에 화면이 레이아웃이 틀어져 버리는 경우가 생길 수도 있습니다.




4. FileReference 의 보안사항이 변경되었습니다.

자세한건 지돌스타님의 블로그 (http://blog.jidolstar.com/397)에서 확인하시고요.

일반적인 외부 스크립으로 인한 파일레퍼런스 조작이 불가능하게 되었습니다. 강제로 dispatchEvent(new MouseEvent(MouseEvent.CILCK)); 로도 테스트해봤는데 안되었습니다.


예를 들어, 저희 차트 솔루션에는 이미지 저장 기능이 안되기 시작했습니다. 플래시 내의 버튼을 클릭해서 저장을 하는데도 말이죠.

이유인 즉슨 9버전에서는 로컬로 이미지 저장이 안되기 때문에 서버에 저장을 하고 다운로드를 하는 식으로 개발을 합니다(대부분 그렇게들 하시죠). 그런데 그게 문제입니다.

다운로드를 클릭한건 마우스로 한것이지만 다운로드는 서버에 저장된 이후에 시작되는 것인데 그 이벤트는 URLLoader 에서 발생하는 이벤트이기 때문입니다. 위의 보안변경 업데이트로 인해 막히게 되었죠.

결국 player 10 버전의 FileReference.save 메소드를 사용하거나 파일 다운로드 창을 띄우기 위해서는 jsp 단에서 띄워야 하게 되었죠.






뭐, 일단 크게 눈에 띄거나 치명적인 것인 위와 같습니다. 이 문제들이 어도비가 의도한 것이라면(보안업데이트처럼) 다른 해결책을 찾아야 하고 버그라면 수정을 기다려야 할 것 같습니다



p.s. euc-kr 문서의 데이터 오염 문제는 10 버전에서도 여전한 걸로 확인되었습니다
크리에이티브 커먼즈 라이선스
Creative Commons License
posted by 미나토
2008/01/18 13:40 Flash Platform


http://developer.yahoo.com/flash/


구글이 하는건 야후도 다 하는군...


플래시 쪽은 더 잘되있는 거 같다



크리에이티브 커먼즈 라이선스
Creative Commons License
posted by 미나토
2007/05/28 14:23 Flash Platform

as 3.0에서는 buttonMode 속성을 true 라고 해줘야 손가락 모양이 나타난다.


그런데 true 라고 해줘도 안나타나는 경우가 있다. 그 경우는 다음과 같다...

var sp:Sprite = new Sprite();
var tf:TextField = new TextField();
tf.text = "미나토입니다";
tf.autoSize = TextFieldAutoSize.LEFT;
sp.addChild(tf);
addChild(sp);

sp.buttonMode = true;

sp.addEventListener(MouseEvent.ROLL_OVER, over);
function over(event:Event):void
{
 trace(event);
}



이것은 hitArea 의 영역을 설정해주지 않았기 때문으로 보여진다. hitArea 의 리턴값은 Sprite 인데 TextField 는 Sprite 를 상속받지 않기 때문일 것으로 보인다...

그래서 다음과 같이 코드를 추가하게 되면...

var sp:Sprite = new Sprite();
var tf:TextField = new TextField();
tf.text = "미나토입니다";
tf.autoSize = TextFieldAutoSize.LEFT;
tf.selectable = false;
var hit_sp:Sprite = new Sprite(); // hitArea 의 리턴값이 DisplayObject나 Rectangle 클래스가 아닐까 했지만 Sprite 이다... 그리고 addChild 를 해줘야만 적용된다.
hit_sp.graphics.beginFill(0xFFFFFF, 0);
hit_sp.graphics.drawRect(0, 0, tf.width, tf.height);

sp.addChild(tf);
sp.addChild(hit_sp);
sp.hitArea = hit_sp;

sp.buttonMode = true;
addChild(sp);

sp.addEventListener(MouseEvent.ROLL_OVER, over);
function over(event:Event):void
{
 trace(event);
}



그런데 tf가 hitArea 의 뎁스(as 3.0에서는 인덱스이지만...) 보다 위에 있다면 buttonMode 가 활성화 되지 않는다.

결과적으로 TextField 가 hitArea 위에 존재한다면 tf의 영역을 제외한 만큼만 buttonMode 가 활성화 된다는 것이다.


같은 DisplayObject 이지만 buttonMode 같은 몇가지 속성 적용에는 다르다는 것을 기억해야 한다.

크리에이티브 커먼즈 라이선스
Creative Commons License
posted by 미나토
2007/05/17 13:26 Flash Platform
trace(int(2.6)) // 2
trace(uint(2.6)) // 2

num >= 0 일 때,
int(num) = Math.floor(Number(num)) 과 같은 결과를 가진다. 간혹 Math.round 로 착각하는 실수를 하지 말자...


num < 0 일 때,
uint(num) = 4294967295 가 나오니 주의할 것.


trace(uint(undefined)) // 0
trace(uint(null)) // 0
trace(uint(true)) // 1
trace(uint(false)) // 0
trace(uint(NaN)) // 0
trace(uint("")) // 0

null 또는 Boolean 값이 들어왔을 때의 결과는 위와 같다. NaN이라고 나올거라 생각하는 실수 또한 주의 할 것...(int 도 마찬가지이다)


하나 더,

드로잉 수치에 int, uint 를 쓰면 오류는 안생기나 버그가 생길 가능성이 크다... 내림값이라 소숫점을 다 버려버리기 때문에 픽셀이 안맞을 수 있기 때문이다.
크리에이티브 커먼즈 라이선스
Creative Commons License
posted by 미나토
2007/05/17 10:57 Flash Platform
어제 고민에 빠졌던 LoaderInfo 문제를 해결하였다. 코드의 문제가 아닌 html 상의 문제로 cs3에서 제너레이트하는 html과 충돌이 있었던 것 같다.


html

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
        codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0"
        width="550"
        height="400"
        align="middle"
        id="test">
    <param name="allowScriptAccess" value="sameDomain" />
    <param name="movie" value="test.swf?num=1" />
    <param name="quality" value="high" />
    <param name="bgcolor" value="#ffffff" />
    <embed src="test.swf?num=1"
           width="550"
           height="400"
           autostart="false"
           quality="high"
           bgcolor="#ffffff"
           name="test"
           align="middle"
           allowScriptAccess="sameDomain"
           type="application/x-shockwave-flash"
           pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>



as3.0

var tf:TextField = new TextField();
tf.autoSize = TextFieldAutoSize.LEFT;
addChild(tf);

try
{
 var properties:String;
 var value:String;
 var parameters:Object = LoaderInfo(this.root.loaderInfo).parameters;
 for (properties in parameters)
 {
  value = String(parameters[properties]);
  tf.appendText(properties + " = " + value + "\n");
 }
}
catch (error:Error)
{
 tf.appendText(error);
}


 여기까지는 여기저기 검색해보면 나오게 되는 방식으로 값을 뿌려본 것이다.

그런데 한가지 더 발견한 것이 있다.


익스플로러(7)에서 테스트를 하면 예상했던 대로 num = 1 이라고 나오지만,
파이어폭스(2)와 오페라(9)에서는 (경로)test.swf?num = 1 이라고 나오게 된다.

요컨데 플래시에서 변수명으로 접근하려면 그걸 해결하려면 swf?변수명=값 으로 넣지 말고 FlashVars 를 이용해야 한다


html

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
        codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0"
        width="550"
        height="400"
        align="middle"
        id="test">
    <param name="allowScriptAccess" value="sameDomain" />
    <param name="movie" value="test.swf" />
    <param name="quality" value="high" />
 <param name="FlashVars" value="kkk=1" />
    <param name="bgcolor" value="#ffffff" />
    <embed src="test.swf"
           width="550"
           height="400"
           autostart="false"
           quality="high"
           bgcolor="#ffffff"
           FlashVars="kkk=1"
           name="test"
           align="middle"
           allowScriptAccess="sameDomain"
           type="application/x-shockwave-flash"
           pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>


첫번째 방식이나 두번째 방식이나 위의 코드에서 뿌려주는 것은 같다.
 
하지만 첫번째 방식으로는 변수명으로 접근을 할 수가 없고 두번째 방식으로는 접근할 수가 있다. 그러므로 브라우저 호환성을 위해서는 두번째 방식을 써야한다.
크리에이티브 커먼즈 라이선스
Creative Commons License
posted by 미나토