세이박스

플래시 - loadMovie 최적화 - #1

디자인

두가지 방식.. 모두 가능하다..
이를테면..
##경우1##
loadMovie("sub.swf",_root);

##경우2##
_root.loadMovie("sub.swf");
경우1과 경우2 같은 결과가 나온다.

위의 예제는 문제가 있다.
(다 알고 있는 부분이겠지만....)
_root.loadMovie("sub.swf");
이렇게 쓸 경우에.. sub.swf가... _root에 로딩 되는게 아니라
_root가 sub로... 바뀐다..
때문에... _root에 있던.. 기존 오브젝트들은 사라지게 된다.

그래서..
_root.createEmptyMovieClip("mm",1);
mm.loadMovie("sub.swf");
이렇게 써줘야... 기존 _root는 그대로 있고..
sub.swf만..Depth.. 1로 불러 들이게 된다.

자.. 여기까지가 기본이다..

실무로..볼때... 왠지 불안하다.. 왜냐면..loadMovie가.. 제대로 불러들
였는지 불안하고..
그리고..불러들인 녀석에 바로 어떤 액션을...적용할 경우
이 녀석이.. 들어온건지.. 들어오지 않았는지 확인할 길이 없다.
몇가지를... 더 생각해보자!!

##경우1##
_root.createEmptyMovieClip("mm", 1);
mm.loadMovie("sub.swf");
mm.onEnterFrame = function() {
this._x = i++;
};

##경우2##
_root.createEmptyMovieClip("mm", 1);
mm.createEmptyMovieClip("ss", 1);
mm.ss.loadMovie("sub.swf");
mm.onEnterFrame = function() {
this._x = i++;
};

경우1은 mm이라는 빈무비클립을 만들어 mm에 직접 sub.swf를 로딩
했고
경우2는 mm을 만들고 그 속에 ss를 만들어 ss에 sub.swf를 로딩시켰
다..
경우1은 mm의 onEnterFrame이 작동하지 않는다.
경우2는 잘 작동한다.

왜 그럴까??
..
결국.. loadMovie의.. 로딩은 엄밀히 말하면... 대체시켜 버리는 것이
다.
_root.createEmptyMovieClip("mm", 1);
mm.loadMovie("sub.swf");
mm.onEnterFrame = function() {
this._x = i++;
trace(i);
};
순서는 이렇다.
output에 1이 나온다..
예측하건데..
sub.swf가.. 완전히 불러오는 시점에서..mm이 완전... 바뀐다.
때문에.. i값이.. 약간(대부분1만) 보이게 된다.
그리고 그 이후에는 보이지 않는다.
로딩이 아니고... 바뀌어 버리기 때문이다.

자..그렇다면... 어떤... 녀석을 불러들일때.. 그 녀석의.. 용량을 체크
하고 싶다면.. 어떻게 할까??

##경우1##
_root.createEmptyMovieClip("mm", 1);
mm.loadMovie("sub.swf");
mm.onEnterFrame = function() {
a.text = this.getBytesLoaded() +"/"+this.getBytesTotal();
};

##경우2##
_root.createEmptyMovieClip("mm", 1);
mm.createEmptyMovieClip("ss", 1);
mm.ss.loadMovie("sub.swf");
mm.onEnterFrame = function() {
a.text = this.ss.getBytesLoaded()
+"/"+this.ss.getBytesTotal();
};

경우 1은 a에 값이 들어오지 않는다.
경우2는 잘 나타난다.


더 많은 말들을.. 할수 있겠지만..
한 가지만.. 더 해보자!!

예를들어 sub.swf를 불러들여서...
다..로딩된.. 순간에.. 화면의 어색함 없이..
너비 100
높이 100
알파값 50
x위치 50
y위치 50으로 위치 시켜보자!!

_root.createEmptyMovieClip("mm", 1);
mm._visible = false;
mm.createEmptyMovieClip("ss", 1);
mm.ss.loadMovie("sub.swf");
mm.onEnterFrame = function() {
a.text = this.ss.getBytesLoaded()+"/"+this.ss.getBytesTotal();
if (this.ss.getBytesTotal()>10 && this.ss.getBytesLoaded()
== this.ss.getBytesTotal()) {
with (this.ss) {
_width = 100;
_height = 100;
_alpha = 50;
_x = 50;
_y = 50;
}
this._visible =true;
delete this.onEnterFrame;
}
};
위와 같이..하면된다.
_root.createEmptyMovieClip("mm", 1);
mm._visible = false;
이 부분이..팁이다..
빈무비를 만들고...
바로... 감추는 것...
그리고..onEnterFrame으로..체크한다.

조건.. 즉,if (this.ss.getBytesTotal()>10 &&
this.ss.getBytesLoaded() == this.ss.getBytesTotal()) 이것이..성립
되었을때..

비로소..ss를.. 위치 시키고..
this._visible = true;
할거...다하고 나서... 제일 나중에.. 자신의..모습을.. 드러내는 것이
다.


소스다운로드

더 많은 부분이..있다..
사실... 실무적으로는..끝이 없는것 같다..
상황이라는건... 항상.. 바뀌니까..
그런.. 생각이 든다..

플래시로.. 웹상의..ACDsee같은 것을... 만들때나..
loadSound할때... 그리고..
기타.. 여러가지.. 상황들은...
개발기획, 설계 그리고.. 액션 등... 많은 부분 변화 시킨다..

결국... 중요한건.. 메서드를 알고(이해하고) 있는 부분 50%와..
알고 있는 메서드를 창의적으로... 연결하고..설계하는 부분.. 50% 라
는 생각이 든다.


다음번에는....
loadMovie 최적화 -#2
- _root변수 부분의 중복문제
- 네트워크환경이.. 좋지 않은 곳에서의 로딩
- 위의 내용을 prototype으로 만드는 방법.
- 기타..
그리고..
loadMovieNum 최적화에 대해서.. 알아보겠다..



P.S. - 1
loadMovie로.. 불러들인 녀석을.. onPress와.. onRelease로..
startDrag()
stopDrag() 하고 싶은 경우에도.. 마찬가지이다..
결국 계층을 2개로,,가져가야..
체크할수 있고.... 이벤트를 줄수 있고... 그리고 안전하다..
jpg를 불러들일때도.. 마찬가지이다..


P.S. - 2
C++이나..Java 같은 언어의 경우 객체와 메서드의 종류는...
액션스크립트와 비교할 수 없이 많다..
비교하는것이.. 어리석은 것일지 모르겠다..
하지만..
액션스크립트의 메서드와 프로퍼티를 단편적으로 보고..
별거 아니군.. 하고 치부해버리기에는..
너무나.. 많은 부분이.. 숨어있다..
사실...loadMovie(Num)는.. 구조화의 핵심이다..
핵심인 만큼... 안전성이.. 보장되어야 한다...
교육컨텐츠를 만들때나..
온라인 쇼핑을 만들때
혹은.... 아바타시스템을 만들때..
그 때마다... 상황을 고려한.. 코딩과 설계를 해야한다.
단순히...
MovieClip.loadMovie(불러들일swf(jpg)파일);
이라는 것을.. 말하며...
난... loadMovie에 대해서.. 다 알고.. 더 이상... 알아야 할게.. 없다
고.. 생각하는건... 잘못된 부분이다..

깊게 보면 볼수록... 액션스크립트코딩을 깊게 보는게..아니라..
인터넷 환경과... 프로그래밍 기법.... 개발기획... 구조화..XML,..등..
기본지식에 대한... 이해에 접근하게 된다.
결국.. "프로그램이라는 것은.. 한 길로.. 통하게 된다"라는 생각이 들
게 된다.

질문한 분중에
일주일동안.. 이 문제로.. 고생하고 있다고 말하는 분이 있었다..
우습게도.. 난.. 2년넘게... 고민했고...
지금도.. 고민하고 있다..
앞으로도.. 계속.. 고민해야할것 같다..

위의 설명한.. 내용들은.. loadMovie를 다루는 여러가지 방법중... 일
부에.. 속한다..
(심지어 로컬인지 웹환경인지, OS의 종류가 어떤것인지, 인터넷옵션
에 대한 고려, 그리고 파일존재여부... 기타... )

그렇다고... 난해하다고 말하는건.. 아니다..
다만....
더 깊은.. 부분이.. 있다는 것을 말하려는 것이다...




------------------------------------------------------
참고 하세요 - 예전에.. 제가 loadMovie관련 답변한..부분입니다.
----------------------------- ------------------------
loadMovieNum 은 전역함수로만.. 존재합니다.
그리고..loadMovie는 MovieClip 객체의..메서드로.. 존재합니다.
이 부분에.. 대해서.... 아셔야 합니다.
플래시4때까지는.. 거의 모든.. 액션들이..전역함수로.. 되어있었고..
플래시5에서는 상당수... 객체에 대한.. 메서드로.. 존재하고..
플래시MX에 와서는... 거의 대부분을... 객체로... 프로그래밍 가능합
니다
예를들어..
gotoAndStop 이라는 액션도... 두가지가.. 존재합니다.
전역함수와... 객체에 대한 메서드로요..
전역함수가 존재하는것은... 기존 버젼을 수용하기 위해서입니다.
예를들어
gotoAndStop(3);
이렇게 쓰면.. 전역함수이고..
aa.gotoAndStop(3);
여기서는 aa라는 무비클립객체의... 메서드로.. 존재하는겁니다.
즉... 위와.. 아래의 gotoAndStop는 전혀 다른 녀석입니다.
레퍼런스에 봐도... 두개가.. 다 나와 있습니다..
왜?? 그런 걸까요?? 서로.. 다른 녀석이기 때문입니다..
이것 외에도... getURL 이라든가.. 이런.. 부분은 많습니다.


loadMovieNum은 전역함수이고..
때문에...aa.loadMovieNum 이라고 쓸수 없습니다...