Archive for the 'Flash-AS2.0' Category

Page 2 of 3

Base64 Encoder/Decoder in flash

Base64 —>

2진 데이터를 아스키 텍스트로 변환하거나 그 반대로 변환하는 인코딩 방법. MIME에 의해 사용되는 방법으로, 4개의 7비트 아스키 문자로 표현되도록 데이터를 3바이트씩 4개의 6비트 단위로 나누어 표현한다. 메일에서 이미지, 오디오 파일을 보낼 때 이용하는 코딩으로 모든 플랫폼에서 안보이거나 깨지는 일이 생기지 않도록 공통으로 64개 아스키 코드를 이용하여 2진 데이터를 변환하기 위해 베이스64를 이용한다. 따라서 베이스64로 인코딩하면 크기가 33% 커진다.
다른 곳에서는 보안 모듈로 많이 사용되고 있지만 플래시에서는 코드자체를 다 디컴파일 할 수 있어

효용성에서 의문이 든다. 디컴파일러를 이용해 플래시 파일이 base64 를 이용해 암호화 했다는 것을 알았을때 엔코더를 이용해서 암호화된 스트링을 똑같이 첨부할수 있을 것이다.

플래시에서 암호화 모듈에 의해 암호화를 할수 있는 방법은 없는것일까?…………..

import com.dstrict.UB.util.system.security.Base64;

var source:String=“Base64 test”;

var encoded:String=Base64.Encode(source);

trace(“encoded—>”+encoded);

var decoded:String=Base64.Decode(encoded);

trace(“decoded—>”+decoded);

result

encoded—>QmFzZTY0IHRlc3Q=

decoded—>Base64 test

Download file

Animating with Fuse Tutorial

Thanks to 2Advanced, the site is now back up! Last night I uploaded a new tutorial called Animating with Fuse which shows how to install and use this amazing new animation system. This is part one of two and the next one will show how to use it to create some complex motion graphics. I can’t state this enough, Fuse rocks! Click on the image below to check it out.

1125931698


이래저래 볼것이 많은 사이트다.

외국사람들은 할일이 없는 걸까?…아님 따로 돈을 받고 제작하는 걸까?..

남들이 쓰기 좋게 잘도 만들어 놓는다.

어찌 보면 모션 패키지 같은 라이브러리로서 복잡한 모션을 간단히(?) 구현할수 있게 도와주는 클래스 모듬세트

하지만 너무 확장성 있게 적용하려고 코드 길이가 쓸데없이 너무 길어 리소스 낭비가 심할듯 싶다.

또한 코드 가독성 심하게 떨어진다. 좀더 직관적인 패키지 구성을 했을면 어떨까 하는 생각이 든다.

FileReference Class Tip

현재 flash8 에서 지원하는 파일 업로드 클래스인 FileReference 는 어쩌면 반쪽짜리 업로드 클래스이다. 왜냐하면 파일업로드 완료시 서버와의 어떤 변수 값도 받을 수 없기 때문이다.

물론 onComplete 가 업로드 완료시에 플래시 쪽에서 호출되지만 이는 단순히 업로드 완료만 알수 있는것이다.

특별히 안정적으로 업로드를 구성하지 않는다면 다시말해, 개인이 업로드를 관리하고 사용자가 많지 않을경우 물론 업로드가  완료되는 이벤트만 발생되어도 문제가 없다.

하지만 사용자가 많은 경우, 예를 들어 사용자가 사진을 업로드하는 사이트를 만들경우,

이런 경우에는 반드시 업로드하는 클라이언트 파일명을 바꾸어야 할 필요가 있다.

중복의 여지가 있기 때문이다. 만약 이런 파일 필터링을 거치지 않는다면 분명히 파일이름이 같게되어 이전 파일이 덮어써지는 현상이 발생할 것이다.

따라서 좀더 안정적인 파일 업로드 구현을 원한다면 파일 생성 일자나 일련의 첨자를 붙여 파일 이름을 변경하는 것은 필수이다.

이때 문제가 되는 것이 바로 위에 언급한 서버와 플래시간의 변수 교환문제이다.

FileReference class 에서의 upload()  method의 파라미터에는 서버파일의 데이타를 받을수 없다.

따라서 서버에서 파일 이름을 임의로 변경해 버리면 플래시에서 알 수 있는 방법이 없다.

물론 약간의 팁을 사용하면 가능하다.

다행이도 upload url에 매개변수를 첨부하여 서버에 전송할 수 있다.

바로 이런방법으로 서버에서 파일명을 저장하는 것이 아니라 플래시에서 정한 파일명을 서버로 보내 그걸 파일명으로 저장하면 위와 같은 문제를 해결할 수 있다.

<upLoad.as>

private function upload():Void

{

var success:Boolean;

noRep=new Date().getTime();

success = this._fileRef.upload(UploadExample.URL+“?noRep=”+noRep);

// url에 중복을 피하기 위한 현재 시간 정보를 첨부한다.

}

private function onComplete(fileRef:FileReference):Void

{

trace(file Name—>”+noRep+”_”+fileRef.name);

//업로드 완료시 서버에 저장완료된 파일명을 알수 있다.

}
<upload.php>

<?php

//path to storage

$storage = ‘uploadedFiles’;

$upFile=”$storage/”.$noRep.’_’.$_FILES['Filedata']['name'];

//if the file is moved successfully

if ( move_uploaded_file( $_FILES['Filedata']['tmp_name'] , $upFile ) ) {

echo( ’1 ‘ . $_FILES['Filedata']['name']);

//file failed to move

}else{

echo( ’0′);

}

?>

AS3.0 에서 업로드 데이타 필드명을 따로 플래시에서 지정할 수 있게 바뀌었지만 서버에서의 변수 문제는 제공해 주질않았다.

Easing motion in Frame

프레임 모션에 easing 값을 넣어서 적용하는 방법…
프레임의 길이가 적어도 200 frame 이상이 되여야만 어느정도 부드러운 효과를 기대할수 있다.
일반적인 트윈같은 경우 action 으로 하는 경우가 훨씬 자연스럽지만 프레임 모션을 사용해야할경우
이 방법을 사용하면 action 같은 frame 모션이 가능하다.

import mx.transitions.Tween;
import mx.transitions.easing.*;
 
mc._frame = mc._currentframe;
 
var myTween:Tween = new Tween(mc, "_frame", Strong.easeOut, mc._currentframe, 300, 1, true);
 
myTween.onMotionChanged = function() {
mc.gotoAndStop(Math.round(mc._frame));
};
myTween.onMotionFinished = function() {
this.yoyo();
};

프레임 속성을 동적으로 할당해서 Tween class 를 사용하여 easing function 를 적용하여 구현.

ZenDoc 1.0 Released

ZenDoc 1.0 has been released.

ZenDoc is a free, open source ActionScript documentation utility for converting AS 2 class files commented with JavaDoc style comments into HTML documentation.

JavaDoc 형식으로 작성한 AS2.0 파일을 Html 형식의 문서로 전환해 준다.

로컬에서 작동하는 Application이 아니라 웹서버(PHP)에서 실행되는 형식이다.

개인적으로 작성한 클래스 파일을 이런형식으로 만들어 보는건 큰 의미는 없겠지만 제작한 클래스를 배포하거나 공동작업에 필요한 클래스를 공유할때 다른사용자에게 유용할듯 싶다.

주석을 JavaDoc형식으로 작성하긴 하지만 빠쁠땐 그냥 넘어가는 경우도 있는데 나중을 위해 좀더 부지런해져야 할 것같다.

ExternalInterface bug (Firefox)

Just a quick warning to people using ExternalInterface. When you are calling Javascript functions that open new windows your Flash movie will lose all mouse interaction (no rollovers etc) and the button you pressed to open the popup will stick on its “over” state. This is only in Firefox, (and possibly only when the popup contains a Flash movie, tbc).

flash8 에 새로운 External API. 인 ExternalInterface…..

실무에 적용하여 사용한적은 없는것 같다. 그다지 쓰이지 않아서 그런진 몰라도…

Firefox에서 새로운 팝업창에서의 플래시 무비가 전혀 마우스 반응을 하지 못하는 버그가 있다.

팝업창을 사용하지 않는것이 좋겠지만 어쩔수 없이 사용해야할 경우, 그리고 꼭 firefox에서도 지원해야할경우

이때는 간단히 getURL 로 javascript 호출하면 된다.

Actionscript initialization

flash에서 어느정도 actionscript 를 다룰줄 아는 사람이라면 output 창을 통해 출력되는 에러메시지나 오류를 해석해서 문제를 해결할 수 있다. 하지만 정말정말 코딩 자체에 사소한 실수가 없다는 생각이 들때,…..

왜 생각한대로 작동안하는걸까?…이건 분명 프로그램 버그일거야….

라는 생각이 들때가 있다…..하지만 컴퓨터는 거짓말을 하지 않는다. 분명 어떤 문제로 인해 생각한대로 작동하지 않을뿐이다.
이런 문제의 상당부분은 바로 플래시의 초기화 문제이다.(많은 경우가 이런 상황에 부딪힐수 있다는 의미) 즉 무비클립을 attach 하거나 컴포넌트(component) 를 사용했을경우…..특히 자주 발생하는 듯 싶다.

무비클립의 초기화 과정은 타임라인 이후에 일어난다. 따라서 제아무리 처리속도가 빠르다 하더라도 덩치가 큰 프로그램일경우 초기화하는  과정에 어느정도  딜레이가 발생하게 된다.

특히 웹에서 실행할경우 로딩을 고려하지 않고 제작할 경우 문제가 심각해진다. 또한 클래스로 제작할경우 즉 좀 복잡한 로직에 의해 구현되는 어플리케이션이나 사이트일 경우 연결한 무비클립이나 컴포넌트와 같은 프레임 상에 클래스를 사용하여 코딩을 했을 경우 초기화 타임으로 인한 오류가 발생할수 있다는 것이다.

플래시에서 제공하는 컴포넌트는 특히 덩치가 더 커서 상대적으로 프레임에 나타났을때 인식하는 속도가 느리다.(사람이 체감하지 못하겠지만 컴퓨터처리속도는 아마도…)

따라서 컴포넌트를 사용할경우 그것에 해당하는 클래스의 처리순서를 똑 어느정도 딜레이를 주어 처리한다면 초기화 문제를 해결할수 있을 것이다. 1frame 정도 후에 처리한다면 초기화하고도 충분한(?) 시간…..^^

/*----------------------------------------------------------------------------------
  @description 프레임 딜레이 함수
  @param scope : Object, 실행할 함수의 스코프
  @param callback : Function, 콜백함수
  @param delayFrame : Number, 딜레이프레임
*---------------------------------------------------------------------------------/
 
  public static function frameDelay():Void{
    var obj = arguments.shift();
    var func = arguments.shift();
    var delayFrame=arguments.shift();
 
   var p:Array=arguments;
   var mc:MovieClip=_root.createEmptyMovieClip("frameDelay",_root.getNextHighestDepth());
 
   mc.onEnterFrame=function(){
    trace(delayFrame);
    delayFrame--;
    if(delayFrame&lt;1){
 
     delete  this.onEnterFrame;
     func.apply(obj,p);
        this.removeMovieClip();
     }
   }
 
  }

XML Parsing Error

아래와  같은 xml 파일을 플래시로 불러들여 파싱할경우 주의할 점이 있다.

<?xml version="1.0"  ?>
<node>
<item label="menu1" src="null">
  <subMenu label="Play Movie" src="file1.swf"  eng="no"  loadingPos="506,345"></subMenu>
  <subMenu label="Play2" src="file2.swf"  eng="no" loadingPos="506,345"></subMenu>
</item > 
 
<item label="THEME STORY" src="file3.swf"  loadingPos="506,345"> </item ><item  label="SPECIAL FEATURE" src="null">
      <subMenu label="gallery" src="file4.swf"  eng="yes"  loadingPos="506,345"></subMenu>
  <subMenu label="about" src="file5.swf"  eng="yes" loadingPos="506,345"></subMenu>
   </item >
</node>

보통 xml 을 사용할 경우 외부데이타 종류를 임의로 정해줄 수 있어 xml 속성(attributes)을 이용하여 구성한다. 무심코 나중에 추가되는 xml 속성값의 순서와 플래시에서 파싱하는 순서가 일치하지 않을경우 제대로 파싱되어 데이타를 처리할 수 없다.

var subObj={label:dataArr2[j].attributes.label, src: dataArr2[j].attributes.src ,eng:dataArr2[i].attributes.eng , loadingPos: dataArr2[i].attributes.loadingPos};

위와 같은 형식으로 파싱할 경우 꼭 파싱할 순서를 xml 노드 속성 순서와 정확히 일치시킨다.

Singleton pattern 에서 유의사항

Singleton pattern 으로 객체를 생성했을경우 플래시에서 뜻하지 않은 상황이 발생한다.

플래시에서 Export 한 후 Download simulate 를 하면 알수 없는 이유로 프로그램이 진행이 되질 않는다. 이것은 프로그램의 오류가 아니라 Singleton pattern 에서 인스턴스 참조값을 저장하기 위해 사용한 전역변수가 문제다.

다시말해, 플래시에서 simulate 를 하기 위해서는 Export 한 상태에서 한번 더 Ctrl+ Enter 을 눌러야된다. 이 상황에서 플래시는 메모리에서  전역변수를 소거하지 않고 그대로 남아있는 상태가 된다.

Singleton pattern 에서는 반드시 인스턴스는 단 한번 밖에 생성되지 않는다.

따라서 한번 Export 해서 생성된 인스턴스로 인해 simulate 할경우 원하지 않은 상황이 발생한다.

private static var sInstance:FramePulse = null;
public static function getInstance () : FramePulse {
    if (sInstance == null) {
      sInstance = new FramePulse();
    }
    return sInstance;
}

–> Download 테스트 시 메모리가 소거 되지 않아 전역속성인 sInstance 로 인해 인스턴스를 생성할 수 없다.

Event Programming

플래시 자체가 이벤트 기반의 프로그램이다 보니 발생하는 이벤트 중심으로 코딩하는 방법이 로직상이나 가독성 측면에서 좋은 코딩 방법이라는 생각이 든다.

하지만 이벤트 별로 패턴을 나누다 보니 코드길이가 자연스레 길어지고 이벤트 리스너(addEventListener) 를 연결하는 시간과 인스턴스를 초기화하는 시간과의 차이로 인해 적지않은 문제점이 발생한다.

var myLoader:XmlLoader=new XmlLoader(this,UrlSet.xmlUrl+"navigation.xml",100,100);
 
myLoader.setXmlAttribute(["label","src","loadingPos"]);
myLoader.addEventListener(XmlLoaderEvent.ON_START,this);
 
function onStart(evt:XmlLoaderEvent){
      myLoader.removeEventListener(XmlLoaderEvent.ON_START); 
   //파싱완료후 실행함수
 
}

간혹가다 인스턴스(myLoader ) 초기화보다 인스턴스 메소드가 먼저 실행되는 이상한 일이 발생할 경우가 있다.