크로스도메인 정책과 플래시의 bitmapData 문제

Programming/ActionScript 2.0 2007.04.30 02:01
요즘 집에서 flickr api를 이용하여 이미지 갤러리를 만들고 있는데 한 가지 문제로 인하여 구현 하고자 하는 기능을 진행하지 못하는 상황이 발생했다.

문제는 로컬에서 load한 이미지(http://경로를 포함한 flickr의 이미지)를 bitmapData로 변환하면 제대로 작동하지만 이것은 개인 계정이나 flickr와 도메인 정책이 다른 웹에 올려놓고 이미지를 load한 후 그 load한 무비클립을 bitmapData로 변환 후 draw하게 되면 작동하지 않는다.

그 동안은 한 계정, 또는 플래시 라이브러리에 있는 이미지를 사용했기 때문에 이러한 문제를 확인하지 못하였으나 flickr를 이용하여 만들다 보니 서로 다른 도메인 계정에서 load한 이미지는 bitmapData로 만들 수 없다는 결론이다.

상식적으로는 도메인이 다르더라도 일단 무비클립에 이미지를 load한 상황이라면 화면에 보이는 무비클립을 비트맵데이터로 전환할 수 있을 것이라는 생각을 했었는데…

신고
    

설정

트랙백

댓글

AS3 API 계층구조도

Programming/ActionScript 2.0 2007.02.21 10:57
AS3 API 계층구조 자료



 = new EXE(new SWF(new JPG(PDF))); 입니다.

신고
AS3
    

설정

트랙백

댓글

사용한 모든 인터벌 삭제하기

Programming/ActionScript 2.0 2007.02.21 10:57
class IntervalGroup{


        private var _intervalAry:Array;
        private static var _instance:IntervalGroup;


        private function IntervalGroup(){
                _intervalAry = new Array();
        }


        public static function getInstance():IntervalGroup{
                if(_instance == null){
                        _instance = new IntervalGroup();
                }
                return _instance;
        }


        public function set interval(num:Number):Void{
                _intervalAry.push(num);
        }


        public function clear():Void{
                for(var i=0;i<_intervalAry.length;i++){
                        clearInterval(_intervalAry[i]);
                }
        }
}
신고
    

설정

트랙백

댓글

프레임 모션에 easing 적용하기

Programming/ActionScript 2.0 2007.02.21 10:56
보통 프레임간 이동할 시에는 사용할 클래스를 따로 제작을 하여 사용을 합니다. 저도 GotoPlay.as dynamic class를 만들어서 필요할때마다 사용을 하곤 합니다. 오늘 Tween 클래스를 가지고 놀다가 Tween클래스를 사용하여 프레임 모션에 에싱을 줄수 없을까 생각해 봤습니다. _currentframe 속성의 경우는 read-only 속성이기 때문에 값을 넣을 수가 없어서 Tween 클래스에서 무비클립의 속성으로 사용하여 에싱을 줄 수는 없습니다. 그래서 무비클립에 하나의 변수를 만들어 그것을 통해서 제어를 하도록 해봤습니다.









import mx.transitions.Tween;
import mx.transitions.easing.*;

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

mc라는 무비클립이 있고 그 안에 무비클립을 235 프레임까지 모션을 적용합니다. 엑션을 통한 모션처럼 자연스러운 모션을 적용하기 위해서는 프레임을 많이 필요로 합니다.(프레임간 이동 간격을 통해 esaing이 적용되기 때문)

프레임에 png 동영상 컷들을 넣고 스크롤바를 통해서 원하는 지점으로 이동할 때 프레임에 easing을 넣으면 괜찮을 것 같네요...^^

신고
    

설정

트랙백

댓글

오버라이딩 인스턴스 메소드의 멤버 접근

Programming/ActionScript 2.0 2007.02.21 10:55
[오버라이딩 인스턴스 메소드의 멤버 접근]
====================
멤버 접근:
서브클래스의 인스턴스 메소드

예제 :
class A{
        public function over():Void{
        }
}

class B extends A{
        public function methOfB():Void{
        }
        public function over():Void{
                methOfB(); //B.methOfB()를 실행한다.
        }
}

설명 :
서브클래스에 정의된 메소드는 어느 하나가 오버라이딩 메소드라도 서로 접근할 수 있다. 따라서 오버라이딩 메소드

B.over()는 B.methOfB()를 정상적으로 실행한다. [표]상속받은 메소드에서 서브클래스의 인스턴스 메소드를 실행할

때 오류가 발생한 것과 비교해본다.
====================
멤버 접근:
상속받은 인스턴스 메소드(슈퍼클래스에 정의됨)

예제 :
class A{
        public function over():Void{
        }
        public function otherMethOfA():Void{
        }
}

class B extends A{
        public function over():Void{
                //otherMethOfA()를 실행함
                otherMethOfA();
        }
}

설명 :
[표]에서, 서브클래스(B)의 모든 메소드는, 심지어 오버라이딩 메소드라 하더라도, 슈퍼클래스(A)의 메소드에 접근할

수 있다.
====================
멤버 접근:
오버라이드된 인스턴스 메소드(슈퍼클래스와 서브클래스에 모두 정의됨)

예제 :
class A{
        public function over():Void{
        }
        public function over2():Void{
        }
}

class B extends A{
        public function over():Void{
                //B.over()를 실행. A.over2()가 아니다.
                over2();
        }
        public function over2():Void{
        }
}

설명 :
모든 상황에 있어서, 컴파일러는 불분명한 참조에 대해, 슈퍼클래스를 찾지 않고 서브클래스 안에서 참조를 모두 결

정한다. 예제에서 오버라이딩한 over() 메소드는 over2()를 실행하는데, 이 메소드가 서브클래스에 동일하게 존재하

기 때문에 B.over2()를 실행한다.
====================
멤버 접근:
서브클래스의 인스턴스 속성

예제 :
class A{
        public function over():Void{
        }

        class B extends A{
                public var propOfB:Number = 1;
                public function over():Void{
                        trace(propOfB); // 출력 : 1
                }
        }

        설명 :
        서브클래스에 정의된 메소드는 동일한 서브클래스의 속성에 접근 할 수 있다. 따라서 오버라이딩 메소드 B.over()는

        propOfB에 접근하는 것이 가능하다. [표]과 비교해 보면 상속받은 메소드에서 서브클래스의 인스턴스 속성에 접근하

        는 것은 오류가 발생한다.
        ====================
        멤버 접근:
        상속받은 인스턴스 속성(슈퍼클래스에 정의됨)

        예제 :
        class A{
                public var propOfA:Number = 2;
                public function over():Void{
                }
        }

        class B extends A{
                public function over():Void{
                        trace(propOfA); // 출력 : 2
                }
        }

        설명 :
        서브클래스에 정의된 메소드는, 오버라이딩한 메소드라 하더라도 슈퍼클래스의 속성에 접근할 수 있다. 따라서 오버

        라이딩 메소드 B.over()는 propOfA에 접근하는 것이 가능하다.
        ====================
        멤버 접근:
        오버라이딩된 인스턴스 속성(슈퍼클래스와 서브클래스 모두 정의됨)

        예제 :
        class A{
                public var overriddenProp:Number = 3;
                public function over():Void{
                }
        }

        class B extends A{
                public var overriddenProp:Number = 4;
                public function over():Void{
                        trace(overriddenProp); // 출력 : 4
                }
        }

        설명 :
        서브클래스의 메소드는 서브클래스의 오버라이드된 속성의 값을 출력한다(3이 아닌 4). 왜냐하면 bInstance는

        overriddenProp에 단 하나의 값만을 저장하며, 오버라이딩 메소드는 슈퍼클래스의 오버라이드된 값을 참조하지 않는

        다.
        ====================
        멤버 접근:
        서브클래스의 클래스 메소드 불분명한 참조

        예제 :
        class A{
                public function over():Void{
                }
        }

        class B extends A{
                public static function classMethOfB():Void{
                }
                ublic function over():Void{
                        classMethOfB(); // B.classMethOfB()를 실행함
                }
        }

        설명 :
        컴파일 과정에서 클래스 케소드에 대한 불분명한 참조는 현재 클래스에 따라 결정된다(classMethOfB()는 해당 메소드

        가 존재하는 곳이 B이므로, B.classMethOfB()로 결정된다) [표]과 비교하면 상속받은 메소드(슈퍼클래스에 정의된)에

        서 static메소드에 대한 불분명한 참조는 오류가 발생했다.
        ====================
        멤버 접근:
        서브클래스의 클래스 메소드 불분명한 참조

        예제 :
        class A{
                public function over():Void{
                }
        }

        class B extends A{
                public static function classMethOfB():Void{
                }
                public function over():Void{
                        B.classMethOfB(); /// 정상적으로 실행됨.
                }
        }

        설명 :
        B.classMethOfB()는 분명한 참조이므로, 컴파일러는 클래스 B에서 해당 클래스 메소드를 찾게 된다.(이것은 오버라이

        딩 메소드라 하더라도 모든 상황에서 통용되는 사실이다.)
        ====================
        멤버 접근:
        상속받은 클래스 메소드(슈퍼클래스에 정의됨)

        예제 :
        class A{
                public static function classMethOfA():Void{
                }
                public function over():Void{
                }
        }

        class B extends A{
                public function over():Void{
                        classMethOfA(); // A.classMethOfA()를 실행함
                }
        }

        설명 :
        컴파일 과정에서 클래스 메소드에 대한 불분명한 참조는 현재 클래스에 따라 결정된다. 따라서 classMethOfA()는

        B.classMethOfA()로 결정된다. 비록 서브클래스 B에 classMethOfA()를 정의하지 않았지만 서브클래스에서 상속받은

        클래스 메소드를 사용할 수 있기 때문에 참조하는 것이 가능하다. 따라서 이 예에서는 B.classMethOfA()와

        A.classMethOfA()가 동일한 작업을 수행한다.
        ====================
        멤버 접근:
        오버라이드된 클래스 메소드(슈퍼클래스와 서브클래스에 모두 정의됨)

        예제 :
        class A{
                public static function overriddenClassMeth():Void{
                }
                public function over():Void{
                        //A.overriddenClassMeth()를 실행함
                        overriddenClassMeth();
                }
        }

        class B extends A{
                public static function overriddenClassMeth():Void{
                }
                public function over():Void{
                        //B.overriddenClassMeth()를 실행함
                        overriddenClassMeth();
                }
        }

        // 사용법
        var aInstance:A = new A();
        var bInstance:B = new B();
        // A의 overriddenClassMeth()를 실행함
        aInstance.over();
        // B의 overriddenClassMeth()를 실행함
        bInstance.over();

        설명 :
        컴파일 과정에서 클래스 메소드에 대한 불분명한 참조는 현재 클래스에 따라 결정된다. 따라서 B의 over()에서

        overriddenClassMeth()는 B.overriddenClassMeth()로 결정된다. A의 메소드를 실행하려면 명확히

        A.overriddenClassMeth()를 사용하면 된다. 불분명한 참조를 사용하면, 메소드를 호출하고 있는 클래스에 존재하는

        것을 사용한다고 생각하면 된다.
        ====================
        A 클래스 메소드와 마찬가지로 클래스 속성에 대해서도 동일한 접근 규칙을 사용한다.



        출처 : 콜린 무크의 Flash ActionScript 2.0에서 발췌

신고
    

설정

트랙백

댓글

상속받은 인스턴스 메소드에서 멤버의 접근

Programming/ActionScript 2.0 2007.02.21 10:55

[상속받은 인스턴스 메소드에서 멤버의 접근]
====================
멤버 접근:
서브클래스의 인스턴스 메소드

예제 :
class A{
        public function methOfA():Void{
                methOfB(); //Error!
        }
}

class B extends A{
        public function methOfB():Void{
        }
}

설명 :
컴파일타임 오류 발생. 슈퍼클래스의 메소드는 서브클래스에 정의된 메소드를 참조할 수 없다. 그리고 클래스 A는 methOfB()를 정의하지 않았기 때문에 참조하지 못한다.
====================
멤버 접근 :
상속받은 인스턴스 메소드(슈퍼클래스에 정의됨)

예제 :
class A{
        public function methOfA():Void{
                //Executes otherMethOfA()
                otherMethOfA();
        }
        public function otherMethOfA():Void{
        }
}

class B extends A{
}

// 사용법
var bInstance:B = new B();
bInstance.methOfA();
//정상적으로 실행된다.

설명 :
어떤 클래스의 메소드가 동일한 클래스의 다른 메소드를 호출하는 것은 가능하다. 서브클래스의 인스턴스를 통해 사용하더라도 호출할 수 있다.

====================
멤버 접근 :
오버라이드된 인스턴스 메소드(슈퍼클래스와 서브클래스에 모두 정의됨)

예제 :
class A{
        public function methOfA():Void{
                // 클래스 B의 인스턴스에서 실행하면 B의 overriddenMeth()가 호출된다. 클래스 A의 인스턴스에서 실행하면 A의 overriddenMeth()가 호출된다.
                overriddenMeth();
        }
        public function overriddenMeth():Void{
        }
}

class B extends A{
        public function overriddenMeth():Void{
        }
}
//사용법
var aInstance:A = new A();
var bInstance:B = new B();
// A의 overriddenMeth()가 싱행된다.
aInstance.methOfA();
// B의 overriddenMeth()가 실행된다.
bInstance.methOfA();

설명 :
오버라이드된 메소드는 클래스의 인스턴스에 따라서 사용하는 대상이 달라진다.

====================
멤버 접근 :
서브클래스의 인스턴스 속성

예제 :
class A{
        public function methOfA():Void{
                trace(propOfB); // 오류발생!
        }
}

class B extends A{
        public var propOfB:Number = 1;
}

설명 :
컴파일타임 에러 발생. 슈퍼클래스의 메소드는 서브클래스에 정의된 속성을 참조할 수 없다. 클래스 A에는 propOfB가 없으므로 사용할 수 없다.
====================
멤버 접근 :
상속받은 인스턴스 속성(슈퍼클래스에 정의됨)

예제 :
class A{
        public var propOfA:Number = 2;
        public function methOfA():Void{
                trace(propOfA); //출력: 2
        }
}

class B extends A{
}

설명 :
methOfA()와 같은 슈퍼클래스의 메소드는 슈퍼클래스의 속성(propOfA와 같은)에 접근할 수 있다.
====================
멤버 접근 :
오버라이드된 인스턴스 속성(슈퍼클래스와 서브클래스에 모두 정의됨)

예제 :
class A{
        public var overriddenProp:Number = 3;
        public function methOfA():Void{
                trace(overriddenProp);
        }
}

class B extends A{
        public var overriddenProp:Number = 4;
}

// 사용법
var aInstance:A = new A();
var bInstance:B = new B();
aInstance.methOfA(); // 출력 : 3
bInstance.methOfA(); // 출력 : 4

설명 :
비록 클래스 A에서 속성을 접근하지만 B인스턴스에서 methOfA()를 실행하면, 서브클래스에서 오버라이드된 속성의 값(3이 아닌 4)을 사용한다. 왜냐하면 bInstance는 overriddenProp에 단 한 개의 값만을 저장할 수 있기 때문이다.(자바에서는 methOfA()를 실행하면 항상 3을 출력한다.)

====================
멤버 접근 :
서브클래스의 클래스메소드, 불분명한 참조

예제 :
class A{
        public function methOfA():Void{
                classMethOfB(); // 오류발생!
        }
}

class B extends A{
        public static function classMethOfB():Void{
        }
}

설명 :
컴파일타임 에러 발생. classMethOfB()는 클래스 A에 정의하지 않았고, 슈퍼클래스는 불분명한 참조를 통해 서브클래스에 존재하는 클래스 메소드를 참조할 수 없다
====================
멤버 접근 :
서브클래스의 클래스메소드 분명한 참조

예제 :
class A{
        public function methOfA():Void{
                B.classMethOfB(); // 정상적으로 실행된다.
        }
}

class B extends A{
        public static function classMethOfB():Void{
        }
}

설명 :
B.classMethOfB()는 분명한 참조로서, 컴파일러는 클래스 B에 해당 클래스 메소드가 존재하는 것을 파악할 수 있다(A의 서브클래스 B가 아니라 할지라도, 모든 클래스에서 이와 같이 사용할 수 있다).

====================
멤버 접근 :
상속받은 클래스 메소드(슈퍼클래스에 정의됨)

예제 :
class A{
        public static function classMethOfA():Void{
        }
        public function methOfA():Void{
                //A.classMethOfA()를 실행
                classMethOfA();
        }
}

class B extends A{
}

// 사용법
var bInstance:B = new B();
bInstance.methOfA();
//A.classMethOfA()를 실행

설명 :
컴파일 과정에서 클래스 메소드의 불분명한 참조는 현재 클래스가 어떤 것인가에 따라 결정된다. 따라서 classMethOfA()는 A.classMethOfA()를 참조한다. 서브클래스 B의 인스턴스에서 A.classMethOfA()를 실행하면 정상적으로 동작한다.
====================
멤버 접근 :
오버라이드된 클래스 메소드(슈퍼클래스와 서브클래스에서 모두 정의됨)

예제 :
class A{
        public static function overriddenClassMeth():Void{
        }
        public function methOfA():Void{
                //A.overriddenClassMeth()를 실행
                overriddenClassMeth();
        }
}

class B extends A{
}

//사용법
var bInstance:B = new B();
//A.overriddenClassMeth()를 실행
bInstaince.methOfA();

설명 :
컴파일 과정에서 클래스 메소드의 불분명한 참조는 현재 클래스가 어떤 것인가에 따라 결정된다. 클래스 A에서 overriddenClassMeth()는 A.overriddenClassMeth()로 변경된다. 클래스 A는클래스 B에 존재하는 B.overriddenClassMeth()를 실행할 수 있다.
====================
* 클래스 메소드와 마찬가지로 클래스 속성에 대해서도 동일한 접근 규칙을 사용함.


출처 : 콜린무크의 Flash ActionScript 2.0에서 발췌

신고
    

설정

트랙백

댓글

동적으로 로드한 이미지 Allow smoothing 컨트롤 하기...

Programming/ActionScript 2.0 2007.02.21 10:54

Dcaland.com을 만들면서 사용한 메소드를 하나 올릴까 합니다. 플래시 8 버전에서는 이미지를 외부로 부터 로드를 할 경우에 default로 Allow smoothing(매끄럽게)이 false 값을 가지게 되는데 Allow smoothing이 false일 경우에는 에니메이션(좌표,로테이션등) 할때 이미지가 지글거리는 문제가 있죠. 라이브러리에 등록된 이미지는 속성에서 수동으로 채킹을 해서 사용하면 된다지만 외부에서 동적으로 불러온 이미지를 움직일 때는 문제가 있죠. 아래 메소드는 그 문제를 해결해 주는 메소드입니다. http://www.kaourantin.net/ 에 기술된 내용을 간단하게 수정해서 사용하고 있습니다.







import flash.display.*;

private function loadImg (target : MovieClip, url : String) : Void
{
        var bmc : MovieClip = target.createEmptyMovieClip ("bmc", target.getNextHighestDepth ());
        var listener : Object = new Object ();
        listener.tmc = target;
        listener.onLoadInit = function (mc : MovieClip)
        {
                mc._visible = false;
                var bitmap : BitmapData = new BitmapData (mc._width, mc._height, true);
                this.tmc.attachBitmap (bitmap, this.tmc.getNextHighestDepth () , "auto", true);
                bitmap.draw (mc);
        };
        var loader : MovieClipLoader = new MovieClipLoader ();
        loader.addListener (listener);
        loader.loadClip (url, bmc);
}


BitmapData 를 사용하기 위해서 import flash.display.*; 임포트 시켜서 사용하세요
입맛에 맞게 수정해서 사용하세요 어떻게 보면 약간의 꼼수가 있는거 같지만 8.5 나오기 전까지는 작지만 유용한 메소드가 될듯 싶습니다.

신고
    

설정

트랙백

댓글