盡人事待天命

미디어협동조합 국민TV
출처 Angeleyes Club | 아이군
원문 http://blog.naver.com/angeleyes80/50003194498
[플래시 MX를 이용한 SW 개발] ① 기본적인 HTTP 통신
플래시는 지금까지 애니메이션, 멀티미디어 광고 등에 널리 쓰여 왔다. 많은 사람들이 플래시를 '웹 환경의 애니메이션 저작 도구' 정도로 인식하고 있지만, 그 응용분야나 향후 가능성은 훨씬 광범위하다. 특히, 기업용 애플리케이션 개발에 있어 리치 클라이언트의 훌륭한 대안이 되고 있다.
이승준 (마이크로소프트웨어 필자)
2004/08/13
플래시 MX가 이전의 버전에 비해 상당 기능이 추가돼 애플리케이션 개발 도구로 부상하고 있다. MX 제품군은 콜드퓨전(ColdFusion) MX, 리모팅(Remoting) MX 등 매크로미디어의 다양한 도구와 서버 제품의 연계성을 한층 더 발전시키고, 기업 환경의 애플리케이션 개발에 필요한 다양한 요구를 수용하고 있다(MX가 약자이거나 특별한 뜻이 있는 것은 아니다. 예전에 윈도우 CE에서 CE가 그랬듯이, 많은 사람들이 흔히 뭔가 심오한 뜻이 있을 거라 생각했지만, CE 역시 아무런 뜻 없이 지워진 이름이었다).

플래시와 엔터프라이즈 애플리케이션
90년대 중반 이후 소프트웨어 개발은 그 기반 자체가 웹으로 모두 바뀌었다. 특히, 기업 애플리케이션들이 웹으로 전환됐다. 널리 쓰일수록, 규모가 큰 서비스일수록 웹으로 전환이 급속하게 이뤄졌다. 이처럼 웹 기반으로 급격히 바뀐 가장 큰 이유는 무엇일까? 그것은 바로 ‘배포’의 문제이다. 기업 환경에서 애플리케이션 배포의 문제는 굉장한 골칫거리다. ‘웹 기반’ 즉 씬 클라이언트(thin client)는 추가적인 설치나 부가적인 조작 없이 브라우저 하나만으로 응용프로그램을 수행할 수 있다는 점 때문에 아주 널리 사용되게 됐다. 하지만, 머지않아 HTML의 한계는 사용자들의 다양한 요구를 수용하기 힘들게 됐다. 이런 시점에서 자바 애플릿은 큰 희망이 됐다.

즉, 자바 애플릿은 플랫폼 종속적이지 않고 HTML이 제공하지 못하는 다양한 기능을 보여줬다. 국내에 한정된 이야기일 수 있으나 오늘날에 와서 자바 애플릿보다 플래시의 도약이 훨씬 두드러지게 나타나고 있다. 물론 자바에 대한 마이크로소프트의 소극적인 지원도 이유가 되겠지만, 플래시가 자바 애플릿에 비해 상대적으로 생산성이 높고 훨씬 다양한 표현을 하는 컨텐츠를 쉽게 만들 수 있다는 데서 그 이유를 찾을 수 있다.

애플리케이션은 사용상의 편의뿐만 아니라 미려한 사용자 인터페이스가 요구되고 있다. 리치 클라이언트에 대한 요구는 언제나 있어 왔지만 배포의 문제와 제작상의 생산성 문제 그리고 클라이언트 기계의 속도, 호환성 등이 걸림돌이 되어 왔다. 플래시는 이러한 걸림돌들에 좋은 답을 제공한다.

플래시는 어떤 면에서 오히려 자바보다 플랫폼에 종속적이지 않다(자바가 특정 JVM의 특성을 타는 것을 널리 알려진 사실이다). 플래시는 4억 1천 4백만 개가 배포된 가장 폭 넓은 표준 클라이언트로 사실상의 표준(de facto standard) 클라이언트 환경이라고까지 할 수 있다(문서를 왜 PDF로 배포하는가와 같은 맥락이라고 할 수 있다). 모바일이나 포켓PC용 플래시 플레이어가 이미 있으며, 앞으로 더욱 다양한 플랫폼이 지원될 것이라는 사실은 자명하다.

플래시는 엔터프라이즈 애플리케이션에서 필요로 하는 보안과 상호운용성(interoperability), 대용량 처리 (scalability) 등에 좋은 솔루션이 될 수 있다. 플래시는 브라우저는 통해 SSL 통신을 지원하며, 자바 애플릿과 수준의 보안 정책을 제공한다. HTTP 통신뿐만 아니라 XML 웹 서비스, 리모팅 등 서버와 다양한 통합 방법을 제공하고 있다. 또 대용량 처리 면에서도 오히려 플래시가 더 좋은 방법이 될 수 있다. 현재 웹 애플리케이션은 몇 가지 일을 처리하기 위해 굉장히 많은 서버 트래픽을 일으킨다.

한 페이지를 보기 위해 최소한 10회 정도의 HTTP 연결이 필요하며, 대부분 2-3페이지를 거쳐서 하나의 작업이 이뤄진다. 플래시와 같은 리치 클라이언트는 오히려 이런 트래픽을 줄일 수 있게 한다. 즉, 사용자 입력 처리, 상호 작용, 입력 데이터 확인(validation)과 같은 웬만한 작업은 클라이언트에서 이뤄지고, 서버와는 필요한 데이터만 주고받으면 되기 때문에 서버에 훨씬 적은 부담을 주도록 만들어 질 수 있다.

이 글은 플래시가 디자인이나 애니메이션 도구로서가 아닌 기업 애플리케이션 제작을 위한 클라이언트 환경으로서 사용될 수 있는 가능성을 살펴보기 위한 목적으로 씌여졌다. 그래서 애니메이션이나 미디어를 다루는 방법 등은 논외로 한다. 우리는 이 글을 통해 플래시의 통신 기능, 서버사이드(ASP.NET)와 연결 방법들, XML과 XML 웹 서비스 이용, 플래시 보안 등을 살펴보려 한다.

난로연통 문제 : 플래시 웹 서비스의 의미
비즈니스 환경이 급속하게 변화하고 기술도 이에 따라 급격하게 변하고 있다. 클라이언트/서버, 웹 기반, 기업 애플리케이션 통합(EAI), 컴포넌트 기반 개발(CBD) 등 이런 변화 속에서 현재 가장 중요한 키워드 두 가지는 바로 ‘통합’과 ‘속도’이다. 최근에 와서는 XML 웹 서비스가 크게 부각되고 있다. XML 웹 서비스가 부각되게 된 데는 HTTP 기반의 XML 통신이라는 장점이 있기도 하지만 그 보다 중요한 이유는 바로 ‘난로연통(stovepipe)’ 문제를 해결하고, ‘서비스 중심의 아키텍처(SOA, Service Oriented Architecture)’를 가능하게 하기 때문이다.

정보시스템에 대한 수직적(버티컬) 통합으로 안정성을 확보하는 데 치중하던 과거의 방식으로는 더 이상 IT 산업 환경의 빠른 변화에 대응할 수 없게 됐다. 기업용 애플리케이션을 ‘통합’하고 더 ‘빠르게’ 구현하는 것이 가장 중요한 일이 됐다. 조직의 내부나 외부 변화에 효과적으로 대응하기 위해서는 시스템의 기능(모듈) 간에 신속한 조정이나 협력이 요구되나 현실적으로 이것이 어렵기 때문에 문제점들이 발생하는데, 이러한 문제점들은 종종 ‘난로연통’에 비유하곤 한다.

모듈들이 효과적이고 효율적으로 운영되기 위해서는 난로연통(기능별 부서)을 가로지르는 수직적 기능간의 상호작용(cross-functional activity)이 훨씬 중요하며, 여기에 대한 해결책으로 제시되고 있는 것이 SOA이다. 또, 이것을 가능하게 하는 기술이 바로 XML 웹 서비스다. 플래시의 미디어적인 측면에서 뿐만 아니라, 바로 이 웹 서비스 클라이언트의 기능을 충분히 제공한다는 점에서 큰 가능성은 찾아 볼 수 있다.

이제, 좀더 본격적으로 플래시가 제공하는 다양한 통신 기능들을 살펴보자. 이 글에는 플래시와 SWF를 구분해 쓴다. 플래시는 저작 환경과 기술을 지칭하고, SWF는 플래시 플레이어에서 수행되는 플래시 파일을 가리키는데 사용한다.

플래시와 한글
플래시는 내부적으로 유니코드를 사용하며 기본적으로 모든 데이터를 유니코드(UTF-8, Universal Character Set Transformation Format, 8 bit)로 다룬다. 경우에 따라 URL을 다루거나 외부와 통신을 할 때 UTF-8가 아닌 운영체제가 사용하는 인코딩을 그대로 써야 할 경우가 있다. 예를 들어, 웹 서버가 기본적으로 UTF-8을 인코딩을 사용하지 않고, KSC5601(EUC-KR)을 사용하는 경우이다. 이런 호환성을 위해 플래시 MX에 System.useCodepage이 추가됐다.

System.useCodepage는 입출력에 유니코드를 쓸 것인지(false) 아니면 플래시 플레이어가 동작하고 있는 운영체제의 기본 인코딩 언어(로케일)을 사용할 것인지(true)를 결정한다. 한글 윈도우에서는 기본적인 인코딩은 KSC5601(EUC-KR)이다. 만일, 일본어 윈도우라면 기본 인코딩은 SJIS가 된다. 즉, SWF가 수행되는 환경의 인코딩을 사용하게 된다. 운영체제의 인코딩을 그대로 사용하려면, 보통 무비 타임 라인의 첫 프레임에 다음과 같은 코드를 넣어 준다.

System.useCodepage = true;

SWF는 내부적으로 UTF-8만 다루며 이것을 바꾸는 방법은 없다. 또한 코드페이지를 지정하는 방법도 없다. 따라서 useCodepage가 true인 경우는 SWF가 수행되는 운영체제의 코드페이지를 따라가며, false인 경우는 유니코드(UTF-8)을 사용하게 된다. 플래시가 내부적으로 사용하는 UTF-8은 유니코드의 각 문자를 1~4개의 바이트로 인코딩한 형태인데 다음과 같은 액션 스크립트를 통해 쉽게 확인할 수 있다.

System.useCodePage= false; // 코드페이지 사용 안함(UTF-8)
trace(escape("abc가나다"));
System.useCodePage= true; // 코드페이지 사용(EUC-KR)
trace(escape("abc가나다"));

이 코드는 다음과 같이 출력된다. escape는 URL에 사용하기 위해 %가 붙은 형태로 인코딩하는 함수이다. 이 코드는 다음과 같이 출력된다.

abc%EA%B0%80%EB%82%98%EB%8B%A4
abc%B0%A1%B3%AA%B4%D9

UTF-8인 경우, 한글의 한 글자가 3개의 바이트로 인코딩되었음을 알 수 있다. useCodePage가 true인 경우는 한글 한 글자가 2개의 바이트가 된다.

플래시 MX 통신
플래시 MX는 다양한 통신 방법을 제공한다. 플래시에서의 통신 범위와 통신에 사용되는 함수들을 정리해보면 다음과 같다.

 <표 1> 플래시용 통신 범주와 함수  

통신 범주

사용되는 함수, 객체

플래시와 자바 스크립트 통신

getURL(), fscommand()

플래시와 웹 서버간 HTTP 통신

loadVariables(), loadVariablesNum()
 getURL()
loadVars 객체

플래시와 플래시 간

getURL(), fscommand() (SWFJavaScript SWF)
LocalConnection 객체    

플래시와 XML 웹 서비스, MX 리모팅

XML 객체
NetServices, NetConnection 객체


getURL()은 예전부터 사용되던 함수인데 주로 페이지를 이동하는데 사용됐지만 자바 스크립트를 호출하는데도 사용될 수 있다. loadVariables()는 외부로부터 데이터를 읽어내는 함수이다. getURL()과 마찬가지로 URL을 지정하고 여기 “이름=값” 쌍을 읽어내어 플래시 변수(variable)에 할당한다. 만일 URL에 파일명을 지정하면(“a.txt”), SWF이 다운로드 된 URL과 같은 위치에 있는 파일로부터 읽어 들인다. LoadVars.load()는 MX에 새로 추가된 기능이다. loadVariables()를 이용하는 것보다 간편하며 비동기로 동작하기 때문에 데이터를 읽어오는 동안 ‘로딩중입니다’를 표시하는 것 같이 다른 동작을 하는 것을 손쉽게 구현할 수 있다.

XML 객체 역시 LoadVars와 사용하는 방법이 거의 같다. 다른 점은 XML 문서를 가져와서 파싱을 한다는 점이다. 플래시 MX에서는 XML DOM을 다루는 메쏘드들이 제공된다. XML을 이용하면 잘 구조화된 데이터를 처리할 수 있다는 장점이 있으며, 훨씬 유연한 애플리케이션을 제작할 수 있다. 실제로 애니메이션 방법을 XML로 기술해 SWF 파일은 하나인데 상황에 따라 다른 애니메이션을 보여주는 방법도 사용할 수 있다.

플래시와 자바 스크립트간의 통신 : getURL()을 이용한 간단한 예제
자바 스크립트와 액션 스크립트, 두 언어 모두 ECMA-262(ECMAScript) 기반 스크립트 언어로 매우 비슷한 점이 많다(똑같은 것은 아니다). 액션 스크립트에서 브라우저에 있는 자바 스크립트를 호출하거나 혹은 거꾸로 브라우저의 자바 스크립트에서 플래시의 액션 스크립트를 호출하는 것이 가능하다.

getURL() 특정 URL로 이동하는 함수이지만 “javascript”를 이용하여 브라우저가 가지고 있는 자바 스크립트를 호출할 수 있다. 다음의 액션 스크립트는 간단한 예를 보여주고 있다.

var hello = "Hello, World";
getURL("javascript:alert(\""+hello+"\")");

간단한 예제를 만들어보자. 플래시 MX를 기동하고 컴포넌트에서 PushButton을 무비에 끌어다 놓는다. 버튼의 레이블을 ‘Hello, World’로 수정하고, 다음과 같이 버튼에 대해 다음과 같이 액션 스크립트를 입력한다(<화면 1>).

on(release) {
getURL("javascript:alert('Hello,World')");
}

<화면 1> getURL()을 이용하는 ‘Hello, World’ 만들기

혹은 SWF를 클릭하여 수행해 보자. 자바 스크립트의 alert 창이 나타나는 것을 확인해 볼 수 있다(<화면 2>). 원래 getURL()은 SWF가 포함된 페이지를 다른 URL로 이동하는 기능을 수행하는 것이 목적이지만, 프로토콜을 기술하는 부분(보통 “http://”)에 javascript 등을 써서 브라우저와 다양한 통신을 할 수 있다.

<화면 2> 예제 02-HelloWorld 수행

예를 들어, “mailto:” 등도 사용할 수 있다(“mailto:”를 사용하면 기본 메일프로그램이 뜨게 된다).

getURL(url [, window [, "variables"]])

다음 예는 SWF가 포함된 페이지를 닫는 기능을 수행한다. 결국 getURL()을 사용해 페이지에 포함된 자바 스크립트를 수행할 수 있고, 다양한 방법으로 자바 스크립트와 연결할 수 있다.

on (press) {
getURL ("javascript:window.self.close()");
}

getURL()을 사용하는 다른 예를 보자. 다음과 같이 HTML 페이지에 스크립트를 만든다. 이 페이지의 스크립트를 액션 스크립트에서 호출한다.

◆ HTML 페이지
<SCRIPT LANGUAGE="JavaScript">
var newWin;
function OpenNewWindow(url, name, features) {
   newWin = window.open( url, name, features );
}
</SCRIPT>

◆ 액션 스크립트 : 버튼 액션
on (release) {
getURL("javascript:OpenNewWindow('popup.html','팝업창','height=150,width=300')");
}

이 내용은 액션 스크립트의 getURL()을 이용하여 페이지 내의 자바 스크립트 함수 OpenNewWindow()를 호출하는 예를 보여준다.

<화면 3> 예제 03-openwin 수행 결과

SWF과 플래시 플레이어와 통신을 할 수 있는 함수로 fscommand()가 있다. 이 함수는 원래 SWF가 자신의 환경(플레이어)과 통신하기 위한 기능을 하지만, 스크립트를 호출하거나 외부 명령을 수행하는데도 사용할 수 있다. [File|Publish Settings] 메뉴를 선택하면, <화면 4>와 같은 화면이 나타나는데, HTML 탭에서 템플릿을 지정할 수 있다.

<화면 4> FSCommand 템플릿 생성

플래시가 FSCommand 템플릿과 함께 생성되도록 지정하면 FSCommand를 사용하는 페이지를 만들어 준다. 기본적인 원리는 페이지 내의 자바 스크립트를 호출하는 것과 같은데 표준적으로 제공되는 것이므로 자바 스크립트를 호출할 때는 getURL(), loadVariables()를 쓰기보다 FSCommand를 사용할 것을 추천한다. fscommand()는 다음과 같이 명령과 파라이미터를 지정해준다(파라미터는 옵션).

fscommand("command", "parameters")

“command”는 <표 2>와 같은 기본 명령들이 있다. 외부 프로그램을 수행할 수도 있다. 이들 기본 명령들은 보통 실행파일 형태로 제작된 플래시에서 사용하며, 웹 페이지에서 보여지는 SWF에서는 많이 사용하지 않는다.

<표 2> “commnad”의 기본 명령

 

"allowscale", true/false

 화면 크기에 따라갈 것인지 지정  

"showmenu", true/false

플래시 메뉴를 보일 것인지 지정  

"exec", "path\\a.exe"

외부 프로그램 수행

"quit"  

플레이어 종료  


fscommand를 사용하는 예를 살펴보자. 다음과 같은 액션 스크립트가 있다면, “close”를 인자로 넘겨 자바 스크립트를 호출한다.

fscommand ("close");

브라우저 스크립트에서 인자를 받아 수행된다. 브라우저의 fs_DoFSCommand() 스크립트가 호출된다. 다음에 나오는 소스 코드는 자동으로 생성된 FSCommand 템플릿(HTML 파일)의 스크립트를 수정한 것이다. 전달받은 command, args에 따라 적절한 작업을 하도록 자바 스크립트를 수정하면 된다.

function fs_DoFSCommand(command, args) {
var fsObj = InternetExplorer ? fs : document.fs;
//
// Place your code here...
//
if(command = "close") {
window.self.close();
}
}

자바 스크립트에서 플래시로 값을 전달
플래시에 특정한 값을 전달하려면 플래시 플레이어 <OBJECT>의 ID를 이용하고 SetVariable() 함수를 이용한다. 이 함수는 SWF의 변수에 지정된 값을 셋팅하는 함수로 플레이어가 제공한다.

<화면 5> JsToFlash 수행 결과

<화면 5>는 이 페이지를 수행한 결과이다. HTML 페이지에 입력된 값을 SWF로 전달해 입력된 문자열이 그대로 SWF에 표시되는 것을 확인할 수 있다.

movie.SetVariable("inputText", form1.inputVal.value) ;

SWF에 있는 텍스트박스의 변수명(vars)가 “inputText”이다. form1에 있는 값을 SWF가 가지고 있는 “inputText” 변수에 할당하는 것이다.

<HTML>
<HEAD>
<meta http-equiv=Content-Type content="text/html;  charset=">
<TITLE>JsToFlash</TITLE>
 
<SCRIPT LANGUAGE="JavaScript">
<!--
function SetFlashVariable() {
var movie = window.document.JsToFlash;
movie.SetVariable("inputText", form1.inputVal.value) ;
}
//-->
</SCRIPT>
 
</HEAD>
<BODY bgcolor="#999999">
<!-- URL's used in the movie-->
<!-- text used in the movie-->
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
WIDTH="300" HEIGHT="100" id="JsToFlash" ALIGN="">
<PARAM NAME=movie VALUE="JsToFlash.swf">
<EMBED invokeURLs=false src="JsToFlash.swf" WIDTH="300" HEIGHT="200"
NAME="JsToFlash" ALIGN=""
</EMBED invokeURLs=false>
</OBJECT>
<br/>
<form id="form1">
<input name="inputVal" type ="input" value="여기에
입력하세요"><br/>
<input type ="button" value="플래시에설정" onClick="SetFlashVariable
()">
</form>
 
</BODY>
</HTML>

플래시와 플래시간 통신
하나의 페이지에 두 개 이상의 플래시가 있고 이들 사이에 통신을 하려면 어떻게 할까? 플래시 MX 이전에는 SWF간에 통신을 하기 위해 앞서 살펴본 자바 스크립트를 중간에 이용해야 했다. 즉, SWF 자바 스크립트 SWF 이런 방법을 사용했다. 이 방법은 브라우저에 의존하는 면이 강해서 익스플로러나 넷스케이프에 따라 다르게 처리를 해줘야 하므로 매우 불편했다.

플래시 MX에서는 SWF간 통신을 지원하기 위해 LocalConnection라는 객체를 제공한다. 같은 브라우저 내에서는 간편하게 SWF간에 통신을 할 수 있다. 여러 개의 윈도우를 가진 플래시 컨텐츠를 비교적 간단하게 만들 수 있다. 예를 들어, 메뉴를 담고 있는 SWF과 내용을 보여주는 SWF를 따로 제작해 훨씬 유연한 컨텐츠를 제작할 수 있을 것이다. 간단히 사용법을 살펴보자. 먼저 명령을 수신하는 쪽은 다음과 같이 작성한다.

// LocalConnection 객체를 생성
lcObj = new LocalConnection();

// 객체에 onContentSelect 메쏘드를 정의
lcObj.onContentSelect = function(num) {
// num 값에 따라 처리
}
// lcObj를 오브젝트를 아이디로 "contents"를 지정
lcObj.connect("contents");

상대편, 즉 명령을 보내는 쪽은 다음과 같이 작성한다.

lcObj = new LocalConnection();

// 메뉴 선택시 "contents"로 전송하는 데이터 정의
_root.menu1.onRelease = function() {
lcObj.send("contents", "onContentSelect", 100);
}

_root.menu2.onRelease = function() {
lcObj.send("contents", "onContentSelect", 200);
}

이처럼 LocalConnection을 사용하면 자바 스크립트를 작성하지 않고도 훨씬 간편하게 SWF간에 데이터를 송수신 할 수 있다.

플래시 HTTP 통신
getURL()은 특정 URL을 호출하는 기능을 가지고 있다. 따라서 URL을 다음과 같이 지정한다면 특정 URL에 값을 전달하도록 할 수 있다. 예를 들어, SWF에서 입력받은 결과를 특정 페이지에 다음과 같이 전달할 수 있다.

getURL( 'http://localhost/memo.aspx?n="홍길동"')

getURL()보다 훨씬 다양하게 사용될 수 있는 것이 loadVariables() 함수이다. 이 함수는 URL에서 값들을 읽어 올 수 있다. URL은 파일일 수도 있고 http로 시작하는 페이지일 수도 있다. loadVariables()는 다음과 같은 형태로 사용한다.

loadVariables ("url" , level/"target"[, variables])
loadVariablesNum ("url" ,level [, variables])

만약에 loadVariables()가 “이름1=값1&이름2=값2&이름3&값3”과 같은 값을 수신했다면, SWF 내의 변수 중에서 “이름1”에 “값1”을 할당하게 된다. 여러 개의 값을 한꺼번에 지정할 때 각기 다른 이름을 줘야하므로 보통 변수명에 번호를 붙여서 사용한다.

◆ loadVariablesNum 샘플
on(release) {
loadVariablesNum("phonebook.txt", 0);
loadVariablesNum("data.txt", 0);
}

◆ phonebook.txt의 내용
name=홍길동&phone=013-443-2331

◆ data.txt의 내용
memo=안녕하세요? 길동님.. 메모를 남깁니다.

여기서는 phonebook.txt와 data.txt 파일에서 값들을 읽어서 변수에 할당하는 예이다. SWF에는 name, phone, memo를 변수 이름으로 가지는 객체가 각각 있다.

phonebook.txt, data.txt와 작성된 html, swf 파일을 같은 폴더에 웹 서버에 올려놓고 테스트를 해 보라. 수정해야 할 것은 전혀 없다. 즉, 로컬에서 수행되는 것과 마찬가지로 웹상에서도 똑같이 수행된다. 물론 다음과 같이 특정 URL을 지정할 수 도 있겠지만, 파일명만 지정하면 기본적으로 SWF가 다운로드된 URL과 같은 위치를 요청하게 된다.

loadVariablesNum("http://localhost/test/phonebook.txt", 0);

이제 ASP.NET 페이지에 데이터를 보내고 보낸 내용에 따라 다르게 반응하는 예제를 만들어 보자.

<화면 6> 예제 06-loadVariables2 수행 결과

<화면 6>과 같이 화면을 구성하고, 메모로 되어 있는 회색 영역의 변수 이름은(vars)는 “memo”로 되어 있다. GET 버튼에는 다음과 같은 액션 스크립트가 작성되어 있다. 이 내용은 localhost의 test 폴더에 memo.aspx를 호출하는 내용이다.

on(release) {
loadVariablesNum("http://localhost/test/memo.aspx?name=" + name, 0);
}

서버측의 페이지는 아주 간단한 ASPX 페이지로, “홍길동”이 인자로 전달되면, “memo=홍길동님 12시까지 오세요”란 문자열이 리턴되고 아닌 경우는 “memo= 메모가 없읍니다”가 리턴된다(<리스트 1>).

<리스트 1> memo aspx

여기서 한 가지 주의할 것이 있다. 앞서 이야기한대로 System.useCodepage = true로 하고 <리스트 1>의 memo.aspx 파일이 있는 곳에 web.config를 다음과 같이 수정한다. 요청(request) 인코딩과 응답(response) 인코딩을 다음과 같이 모두 “ecu-kr”로 맞춰준다. 이렇게 하는 것이 테스트하기도 좋고, 실제 대부분의 사이트들이 EUC-KR(KSC5601)을 사용하기 때문에 글자가 깨지는 문제를 일으키지 않는다.

◆ web.config 파일의 일부
<globalization
   requestEncoding="euc-kr"
   responseEncoding="euc-kr"
/>

loadVariables는 배경색과 같은 SWF의 설정 등을 읽어오는데도 사용할 수 있다. 가능한 데이터를 SWF 안에 두지 말고 파일이나 혹은 특정 URL(apsx 페이지)에서 생성된 데이터를 읽어 들여 처리하는 것이 훨씬 좋다. 내용이 변경되어도 SWF를 다시 제작하는 수고를 덜어 줄 것이기 때문이다. 훨씬 더 유연하고 동적인 SWF를 구성할 수 있다.

LoadVars 객체
LoadVars 객체는 앞서 이야기한 loadVariables()를 대신해 사용할 수 있으며, 훨씬 다양한 기능을 제공한다. 특히 다양한 데이터를 읽어 들어 처리할 때 매우 유용하다. loadVars()는 다음과 같이 객체를 생성하여 사용한다.

lv = new loadVars();

loadVars 객체는 다음과 같이 다양한 메쏘드와 속성을 제공한다(<표 3>).

 <표 3> loadVars 메쏘드와 속성  

메쏘드

load()

지정된 URL에서 변수를 가져온다

getBytesTotal()

load()/sendAndLoad()에서 로드한 바이트 수를 리턴

send()

변수를 지정된 URL로 전송        

sendAndLoad()

변수를 지정된 URL로 전송하고 응답을 수신

toString()

열거 가능한 변수를 포함하는 URL 문자열을 반환

속성

contentType

데이터의 MIME 타입

loaded

sendAndLoad()가 완료되었는지 여부

이벤트

onLoad

load(), sendAndLoad()가 완료되었을 때 발생

onData

onLoad와 비슷(raw 데이터 처리)


<리스트 2>는 액션 스크립트 예제이다. 액션 스크립트의 Array를 이용했고 onLoad를 이용해 load가 다 끝난 뒤에 데이터를 처리하도록 했다. 데이터가 로드되면 loaded가 함수가 수행된다.

<리스트 2> 주소록 액션 스크립트

<리스트 3>는 이전(prev) 버튼을 눌렀을 때 동작하는 액션 스크립트이다. <리스트 4>는 서버측 ASPX 페이지이며, 여기서 이 페이지에서 데이터를 보기 좋게 하기 위해 ‘&’ 문자를 두 번에 나눠 쓴 것을 눈여겨보자. ‘&’을 연속해서 사용해 개행 문자 사이를 이어 줄 수 있다.

<리스트 3> Prev 버튼에 대한 이벤트 핸들러

<리스트 4> addressbook.aspx

<화면 7>은 이 주소록의 수행되는 화면이다. 총 4개의 주소를 ASPX 페이지로부터 로드하여 이전 이후를 볼 수 있도록 되어 있다. 서버측이 무척 간단하게 되어 있지만 요청을 받았을 때 이 내용을 데이터베이스에서 읽어오도록 할 수도 있을 것이다. 결과적으로 플래스 MX가 HTTP 통신을 위해 다양한 방법들이 제공되지만 LoadVars 객체를 이용하는 것이 가장 유연하고 좋은 방법이다.

<화면 7> loadVars 예제 수행결과

플래시의 경쟁자들
SVG 포맷은 벡터그래픽을 위한 표준 XML 문서로 1998년 어도비, 썬마이크로시스템즈, 넷스케이프가 제안한 PGML(Precisson Graphics Markup Language)과 매크로미디어와 마이크로소프트가 제안한 VML(Vector Markup Language)을 기반으로 만들어졌다. SVG는 W3C의 표준 권고안으로 채택되어 어도비를 포함하여 여러 회사에서 지원하고 있다.

플래시의 SWF 파일 포맷은 공개되어 있지만 FLA 파일 포맷은 공개되어 있지 않다. 반면 SVG는 오픈 표준으로 순수하게 XML로만 제작이 가능하다는 장점 때문에 오픈 진영에서도 다양한 도구들이 많이 만들어 지고 있다. 반면에 플래시는 이미 광범위하게 사용되고 있어 SVG와 플래시가 향후 어떻게 발전할지 그 귀추가 주목된다.

사실상 플래시는 클라이언트 환경에서 자바 애플릿을 제치고 좀더 다양한 기능을 제공하고 있다(이 배경에는 마이크로소프트가 JVM을 더 이상 지원하지 않는 이유도 크게 작용했다). 플래시는 자바 애플릿과 달리 프로그래밍 도구가 아닌 디자인 도구에서 출발했다는 점이 풍부하고 다양한 컨텐츠를 가능하게 했고, 이 때문에 플래시가 더욱 많이 사용되게 됐다. 아직 CLR이 설치된 클라이언트가 그리 많지는 않지만 장기적으로 볼 때, 닷넷의 XML 웹 서비스, 리모팅 기술을 포함한 스마트 클라이언트 기술도 플래시의 경쟁 기술 중의 하나가 될 수 있다.

이제 플래시 MX는 개발 도구로서의 면모를 갖추기 시작했고, 기업 환경에 적용될 채비를 모두 갖추었다. 닷넷이나 웹 서비스 등의 분야들과 마찬가지로 플래시 또한 하나의 새로운 개발 영역이 되었으며 사용상의 편의와 풍부한 인터페이스를 기반으로 계속 확장될 것이다.

이번 글에서는 플래시 MX의 다양한 통신 방법과 기본적인 HTTP 통신에 대해 살펴봤다. 예제들을 실행해 FLA 파일을 살펴보면 충분히 소화할 수 있을 것이다. 플래시를 처음 접하는 독자라면 인터넷에 많은 플래시 강좌들이 있으니 이들을 먼저 접해보기 바란다. 다음에는 플래시에서 XML 문서를 다루는 방법들과 XML 웹 서비스 그리고 리모팅에 대한 주제를 다뤄 본다. @ 
 
Posted by 톰켓 Trackback 0 Comment 0

----------------------------------------------------------------------------
// .....       주석 기호 
/* ..... */    주석 기호 
----------------------------------------------------------------------------
\r        // 리턴 코드  (ASC 13)
\n        // 줄바꿈 코드 (ASC 10)
\r\n      // 줄바꿈 코드  (2줄)
\t        // Tab 코드 (ASC 9)
\b        // Backspce 코드 (ASC 8)
&         // text 파일 데이타 구분 코드
----------------------------------------------------------------------------
산술연산자  +, -, *, /, %                 //  %  나머지를 구한다
대입연산자  =, +=, -=, *=, /=, %=         //  i+=4 와  i=i+4 는 같다
증감연산자  ++, --                        //  i++  와   i=i+1 는 같다 
비교연산자  ==, !=, >, <, >=, <=          //  !=  '같지않다' 로 해석
비교연산자  ===                           //  숫자 와 문자 구분
a = 5;    b = "5";                        //  숫자 5 와 문자 "5"
(a == b)                                  //  숫자 5 와 문자 "5"  는 같다 (true)
(a === b)                                 //  숫자 5 와 문자 "5" 는 틀리다 (false)
논리연산자  &&, ||, !                     //  그리고(AND), 또는(OR), 아니면(NOT)
조건연산자  ?    ( a ) ? b : c ;          //  a 조건이 맞으면 b 틀리면 c 실행
x=5;  y=10;  z=(x<6) ? x: y;   trace (z); //  z 은 5 이다
문자연산자  eq  ne  not  or  add          //  eq(==) ne(!=) not(!) or(||) add(+ 문자열의 연결)
( )                                       //  연산의 순서를 정한다
[ ]                                       //  배열을 지정한다
" "                                       //  문자를 지정한다
a=1+2;  trace(a);                         //  연산 결과 출력.  결과는 3
aaa=1;  set("ccc", aaa );  trace(ccc);    //  변수에 값을 지정.  결과는 1
aaa=1;  set("ccc", "aaa");  trace(ccc);   //  변수에 값을 지정.  결과는 aaa
set("ooo", getProperty ("ppp", _x ));     //  ppp x 좌표를  ooo 에 지정.
----------------------------------------------------------------------------
for (a=1; a<=10; a++)  { trace("a="+a); };             //  for  반복문
for (i=1; i<=120;  i+=12) { continue; };               //  for step 반복문
while(true) {  if(a == 0) { break; }; };               //  while  반복문
do { if(a == 0) { break; }; };  while(true);           //  do 반복문
if((n == 0) || (n >= 5)  &&  (n <= 55)  !(n=15)) {     //  if 조건문
 gotoAndPlay(1);
} else if (n == 2) {
 gotoAndPlay(2);
} else {
 gotoAndPlay(3);
};
num_ch = 3;                                             //  switch 조건문
switch (num_ch) {                                               
      case 1:    trace ( " case 1 tested true " );  break;
      case 2:    trace ( " case 2 tested true " );  break;
      default:    trace ( " no case tested true " );
};
----------------------------------------------------------------------------
function sumnumber(a,b,c) {  return(aaa= a+b+c); };    // 함수
sumnumber(1,2,3);
trace(aaa);
----------------------------------------------------------------------------
Math.abs(-1)              //  절대값.   결과는 1
Math.sin(1)               //  sin 값.   결과는 0.841470984807897
Math.cos(1)               //  cos 값.   결과는 0.54030230586814
Math.tan(1)               //  tan 값.   결과는 1.5574077246549
Math.log(2)               //  log 값.   결과는 0.693147180559945
Math.exp(1)               //  지수 값.    결과는 2.71828182845905
Math.sqrt(9)              //  제곱근 값.    결과는 3
Math.pow(2 , 4)           //  거듭제곱 값.    결과는 16
Math.ceil(1.1)            //  가까운 정수로 올림 값.    결과는 2
Math.ceil(1.5)            //  가까운 정수로 올림 값.    결과는 2
Math.floor(1.2)           //  가까운 정수로 내림 값.    결과는 1
Math.floor(1.7)           //  가까운 정수로 내림 값.    결과는 1
Math.round(1.2)           //  가까운 정수로 반올림 값.    결과는 1
Math.round(1.5)           //  가까운 정수로 반올림 값.    결과는 2
Math.max(1 , 2)           //  두 정수 중 큰 정수값.    결과는 2
Math.min(1 , 2)           //  두 정수 중 작은 정수값.    결과는 1
int(1.12 );               //  수치를 정수화.   결과는 1    
int(1.82 );               //  수치를 정수화.   결과는 1    
parseInt("3.2");          //  문자열을 정수화.  결과는 3    
parseInt("3.7");          //  문자열을 정수화.  결과는 3    
parseInt("5abc");         //  문자열을 정수화.  결과는 5
parseInt("abc5");         //  문자열을 정수화.  결과는 NaN    
parseInt("3E8", 16);      //  16 진수로 변환.   결과는 1000
parseInt("777", 8);       //  8 진수로 변환.   결과는 511
parseInt("1010", 2);      //  2 진수로 변환.   결과는 10
parseFloat("2")           // 문자열을 부동점 숫자로 변환.  결과는 2
parseFloat("2.4")         // 문자열을 부동점 숫자로 변환.  결과는 2.4
parseFloat("2.6abc")      // 문자열을 부동점 숫자로 변환.  결과는 2.6
Number("11")              //  문자열을 숫자로 변환.   결과는 11
Number("12.34")           //  문자열을 숫자로 변환.   결과는 12.34
Number("12.34abc")        //  문자열을 숫자로 변환.   결과는 NaN
sss = 123;  uuu = sss.toString();      // 숫자를 문자로변환.  결과는 123
ord("abc");                            //  ASCII 값.   결과는 97
s = "abc";   sss = s.charCodeAt(0);    //  1번째 ASCII 값 .   결과는 97
s = "abc";   sss = s.charCodeAt(1);    //  2번째 ASCII 값.    결과는 98
chr(65);                               //  ASCII 코드를 문자화.  결과는 A
String.fromCharCode(64,65,66);         //  ASCII 코드를 문자화.  결과는 @AB
Math.random();                         // 난수 발생.  결과는 0 - 1 사이의 소숫점 포함한 값
random(5);                             // 난수 발생.  결과는 0,1,2,3,4 중 하나
----------------------------------------------------------------------------
// delete 변수 또는 객체 ;             // 변수를 삭제  (var 로 선언된 변수는 삭제할 수 없다)
account = 1;   trace (account) ;                      // 결과는 1 
account = 1;   delete account;    trace (account);    // 결과는 undefined
delete onEnterFrame;                                  // 반복 실행 중지
----------------------------------------------------------------------------
typeof( );            // String, Number, MovieClip, Object, Boolean, Function 여부를 지정
trace (typeof(1));    // 결과는 Number
trace (typeof("1"));  // 결과는 String
trace (typeof(aaa));  // aaa가 무비클립 이라면  결과는 MovieClip
----------------------------------------------------------------------------
isFinite( );            // 숫자가 유한수이면 true 무한수거나 음의 무한대이면 false
trace (isFinite(aaa));  // aaa 값이 NaN 이라면 결과는 false
----------------------------------------------------------------------------
Mouse.show();           // 마우스 보임
Mouse.hide();           // 마우스 감춤
myClip.onMouseDown = function () {trace (" depth 무시"); };     // 마우스 누를 때
myClip.onMouseUp = function () {trace ("depth 무시"); };        // 마우스 눌렀다 놓을 때
myClip.onMouseMove = function () { trace ("depth 무시"); };     // 마우스 이동할 때
myClip.onPress = function () { trace ("depth 적용"); };         // 마우스 누를 때
myClip.onRelease = function () { trace ("depth 적용 "); };      // 마우스 눌렀다 놓을 때
myClip.onReleaseOutside = function () { trace ("Outside"); };   // 마우스 나가서 놓을 때
myClip.onRollOver = function () { trace ("Over called"); };     // 마우스 오버 때
myClip.onRollOut = function () { trace ("Out called"); };       // 마우스 아웃 때
----------------------------------------------------------------------------
// 단추무비클립 클릭후 액션 스크립트를 넣는다
on (press){           }  // 마우스 버튼을 누를 때   };  x  }  o
on (release){         }  // 마우스 버튼을 눌렀다 뗄 때
on (releaseOutside){  }  // 마우스 버튼을 누르고 나가서 뗄 때
on (rollOver){        }  // 마우스 포인트가 위로 올라올 때
on (rollOut){         }  // 마우스 포인트가 밖으로 나갈 때
on (dragOver){        }  // 누른 채로 밖으로 나갔다가 다시 들어올 때
on (dragOut){         }  // 마우스버튼을 누르고 바깥으로 드래그할 때
on (keyPress){        }  // 지정한 키를 누를 때
----------------------------------------------------------------------------
// 무비클립 클릭후 액션 스크립트를 넣는다
onClipEvent (load) {            }  // 시작 될때  };  x  }  o  
onClipEvent (unload) {          }  // 제거 될때
onClipEvent (enterFrame) {      }  // 트리거 될때
onClipEvent (mouseMove) {       }  // 마우스가 이동할 때
onClipEvent (mouseDown) {       }  // 마우스 클릭 시
onClipEvent (mouseUp) {         }  // 마우스 클릭 후
onClipEvent (keyDown) {         }  // 키를 누를 때
onClipEvent (keyUp) {           }  // 키를 눌렀다 놓을 때
onClipEvent (data) {            }  // loadVariables 또는 loadMovie 액션에서 데이터가 수신될 때
----------------------------------------------------------------------------
TextField.onChanged = function () { trace ("onChanged called"); };
// 텍스트 필드의 내용이 변경될 때
TextField.onSetFocus = function () { trace ("onSetFocus called"); };
// 텍스트 필드의 내용 부분에 마우스가 클릭 될 때
TextField.onKillFocus = function () { trace ("onKillFocus called"); };
// 텍스트 필드의 내용 바깥 부분에 마우스가 클릭 될 때
TextField.onScroller = function () { trace ("onScroller called"); };
// 텍스트 필드의 내용이 스크롤 될 때
----------------------------------------------------------------------------
myMovieClip.onData = function () { trace ("onData called"); }; 
// 무비 클립이 loadVariables 또는 loadMovie 호출로부터 데이터를 받을 때
myMovieClip.onLoad =  function () { trace ("onLoad called"); }; 
// 무비 클립이 load 호출로부터 데이터를 받을 때
myMovieClip.onUnLoad =  function () { trace ("onUnLoad called"); }; 
// 무비 클립이 Unload 때
myMovieClip.stop()  
// 작업 중지
----------------------------------------------------------------------------
myDate = new Date();                               // 날짜 로드
myDate = new Date (년,월,일,시,분,초);             // 날짜 지정
yyyy = (myDate.getFullYear() + "-" + (myDate.getMonth() + 1) + "-" + myDate.getDate());
tttt = (myDate.getHours()+ " :" + myDate.getMinutes() + " :" +myDate.getSeconds());
----------------------------------------------------------------------------
_root.onEnterFrame = function() {   };             // 메인화면에서 프레임 반복
onEnterFrame = function() {   };                   // 심볼화면에서 프레임 반복
----------------------------------------------------------------------------
tmtm = getTimer();          
onEnterFrame = function() {
  if ( (getTimer()-tmtm) >= 500 ) { tmtm=getTimer(); trace (tmtm); };   // 0.5초후 반복실행
  if ( (getTimer()-tmtm) >= 1000 ) { tmtm=getTimer(); trace (tmtm); };  // 1초후 반복실행
  if ( (getTimer()-tmtm) >= 2000 ) { tmtm=getTimer(); trace (tmtm); };  // 2초후 반복실행
};
----------------------------------------------------------------------------
onEnterFrame = function() {                                
   nr += 1;  if (nr > 5 )  {  delete  onEnterFrame;  };           // 5번 반복실행후 중지
   trace (nr);
};
----------------------------------------------------------------------------
createTextField ("ins", 1, 100, 100, 50, 50)
ins.border = true;
function callback() {
   ins._x += 5;
   if ( ins._x > 400 ) { clearInterval( intervalID );  };      // 중지 (clearInterval)
}
var intervalID;
intervalID = setInterval( callback, 100 );             //  0.1초후 반복실행 (setInterval)
----------------------------------------------------------------------------
#include "script.as"         // script.as 파일 넣기 (액션 스크립트 txt 파일)
----------------------------------------------------------------------------
System.useCodepage = true;   // 한글 깨짐 방지
trace(System.capabilities.language)          // Flash Player가 지원하는 언어. 결과는 ko
trace(System.capabilities.hasVideoEncoder)   // 지원되는 비디오 인코더. 결과는 true, false.
trace(System.capabilities.hasAudioEncoder )  // 지원되는 오디오 인코더. 결과는 true, false.
trace(System.capabilities.hasAudio)          // 오디오 성능이 있는지 여부. 결과는 true, false.
trace(System.capabilities.hasMP3)            // MP3 디코더가 있는지 여부. 결과는 true, false.
----------------------------------------------------------------------------
escape("abc가나다");         // URL에 사용하기 위해 인코딩.
// System.useCodePage= true; 일때 결과는 abc%B0%A1%B3%AA%B4%D9
// System.useCodePage= false; 일때 결과는 abc%EA%B0%80%EB%82%98%EB%8B%A4
----------------------------------------------------------------------------
trace(targetPath(this));     // 대상 패스를 반환.  결과는 _level0.instance1 로 표시
trace(this.valueOf());       // 결과는 _level0 로 표시
----------------------------------------------------------------------------
trace(this.getBytesLoaded());  // 무비클립의 로드된 바이트 수를 알려준다.
trace(this.getBytesTotal());   // 무비클립의 전체용량 바이트 수를 알려준다.
----------------------------------------------------------------------------
getURL("C:/")                                          // 탐색기 열기
getURL("C:/Windows/NOTEPAD.EXE");   };                 // 메모장 열기
getURL("C:/Program Files/Accessories/WORDPAD.EXE");    // 워드패드 열기
getURL("C:/Program Files/Accessories/MSPAINT.EXE");    // 그림판 열기
getURL("C:/Windows/CALC.EXE");                         // 계산기 열기
getURL ("aaa.exe");                                    // aaa.exe 파일 열기 (message)
getURL ("aaa.txt", "_self");                           // aaa.txt 파일 열기
getURL ("movie.html", "_self");                        // movie.html 파일 열기
getURL ("http://www", "_blank");                       // http://www 를 새로운 창으로 열기
----------------------------------------------------------------------------
Stage.showMenu = "true";        // 스크린 메뉴 보임
Stage.showMenu = "false";       // 스크린 메뉴 감춤 
Stage.scaleMode = "noScale";    // 화면의 사이즈를 고정
Stage.align = "TL";             // 화면의 정렬을 T(위) L(왼쪽)
           //  "T" 위 가운데    "B" 아래 가운데    "L" 가운데 왼쪽    "R" 가운데 오른쪽
           //  "TL" 위쪽 왼쪽   "TR" 위쪽 오른쪽   "BL" 아래쪽 왼쪽   "BR" 아래쪽 오른쪽
Stage.height      // 픽셀로 표시된 스테이지의 높이
Stage.width       // 픽셀로 표시된 스테이지의 넓이
----------------------------------------------------------------------------
_root.createEmptyMovieClip("box",1);      // 스테이지 테두리 주기
with (_root.box) {  moveto(1, 1);   linestyle(10, 0x00cc00, 100);
    lineto(stage.width, 1);     lineto(stage.width, stage.height);
    lineto(1, stage.height);    lineto(1, 1);   };
----------------------------------------------------------------------------
fscommand("showmenu", true);      // 스크린 메뉴 보임
fscommand("showmenu", false);     // 스크린 메뉴 감춤
fscommand("allowscale", true);    // 스크린 크기에 따라 무비의 크기도 변함
fscommand("allowscale", false);   // 스크린 크기에 따라 무비의 크기도 안변함
fscommand("fullscreen", true);    // 풀 스크린 (esc키 누르면 해제)
fscommand("fullscreen", false);   // 풀 스크린을 원래의 크기로 만든다
fscommand("trapallkeys", true);   // 키보드 키 사용할 수 없음 (풀 스크린 일때 esc키 먹통)
fscommand("trapallkeys", false);  // 키보드 키 사용할 수 있음
fscommand("quit");                // 스크린 닫기
fscommand ("exec", "a.exe");      // a.exe 파일 실행 (no message)
   플래시 무비(exe) 가 위치하는 폴더안에 fscommand 라는 하위 폴더를 만들고
   fscommand 디렉토리에  a.exe 가 있을때 플래시 무비(exe)를 실행하면 a.exe파일 실행
----------------------------------------------------------------------------
// getURL 로 javascript 사용하기
var hello = "Hello, World";
getURL("javascript:alert(\" "+ hello + "  \")");   // 메세지 띄우기
getURL("javascript:window.self.close()");          // 윈도우창 닫기
getURL("javascript:window.external.AddFavorite('http://','가')" );    //즐겨찾기 추가
----------------------------------------------------------------------------
// fscommand 로 javascript 사용하기
1.  fscommand ("messagebox", "This is a Flash.");   // aaa.swf flash script
2.  파일메뉴 - 제작설정 - 포맷 (HTML체크) - HTML (템플릿: with FSCommand 체크)
3.  파일메뉴 - 제작 (파일명은 aaa.swf) -  aaa.html 파일이 디렉토리에 만들어 진다
4.  aaa.html 파일을 열고  function aaa_DoFSCommand(command, args) {  아래에
      if (command == "messagebox") {  alert(args);  };   을 적고 저장 한다
5.  aaa.html 실행 (실행후 제작설정 해제)
----------------------------------------------------------------------------
// fscommand 로 javascript 의 변수값 불러오기
1. fscommand ("search", TextFieldvar);     // aaa.swf flash script
2. if (command == "search") {              // aaa.html script
       EEEfind = "FFFFFFFF";
       window.document.aaa.SetVariable("TextFieldvar", EEEfind) ;
       return TextFieldvar;
    };
3. aaa.html 실행
----------------------------------------------------------------------------
_root.loadMovie("a.swf");            // swf 파일 불러오기
_root.bbb.loadMovie("a.swf")         // swf 를 메인에 있는 bbb무비클립인스턴스에 불러오기
_root.loadMovie("a.swf", 1);         // swf 를 레벨1로 불러오기 (2 는 1를  screen over)
_root.loadMovie("aaa.jpg");          // jpg 파일 불러오기
_root.bbb.loadMovie("aaa.jpg");      // jpg 파일을 메인에 있는 bbb무비클립인스턴스에 불러오기
unloadMovie (1);                     // 레벨 1에 로드된 무비를 언로드
unloadMovie ("a.swf");               // 현재 무비에 로드된 a.swf 무비를 언로드
_root.bbb.unloadMovie();             // 메인 타임라인의 bbb 무비클립에 로드된 무비를 언로드
this["bbb"].unloadMovie();           // 현재 타임라인의 bbb 무비클립에 로드된 무비를 언로드
sss.bbb.unloadMovie();               // sss 심볼 타임라인의 bbb 무비클립에 로드된 무비를 언로드
----------------------------------------------------------------------------
button.onPress = function() { _root.loadMovie("aaa.swf"); }     // aaa.swf 실행중 초기화 하기
----------------------------------------------------------------------------
_root["ball_"+counter]._x = 11;       //  메인 화면의 클립 좌표
this["ball_"+counter]._x = 11;        //  현재 화면의 클립 좌표
aaa["ball_"+counter]._x = 11;         //  aaa 심볼 화면의 클립 좌표
----------------------------------------------------------------------------
this.createEmptyMovieClip("aaa", 1);             //  무비클립 생성 (2 는 1를 screen over)
this.duplicateMovieClip (aaa, bbb, 1);           //  aaa 무비클립  bbb 로 복사
this.bbb.removeMovieClip();                      //  bbb 무비클립 삭제
myClip._visible = true;                          //  클립 보임
myClip._visible = false;                         //  클립 감춤
myClip.swapDepths(100);                          //  클립 깊이 100 으로 지정 (2 는 1를 screen over)
myClip.swapDepths(otherClip);                    //  클립 깊이 otherClip 과 바꿈
for (i=1; i<=360; i++)  {                        //  클립 복사
     duplicateMovieClip (ins1, "mc"+i, i);
     setProperty ("mc"+i, _x, random(300));
     setProperty ("mc"+i, _y, random(300));
     setProperty ("mc"+i, _alpha, random(300));
     setProperty ("mc"+i, _xscale, 150);
     setProperty ("mc"+i, _yscale, 150);
};  
for (i=1; i<=360; i++)  {                        //  클립 복사
     duplicateMovieClip (ins1, "mc"+i, i);
     this["mc" + i]._x = i;
     this["mc" + i]._y = i;
};  
for (i=1; i<=50; i++)  {                          // 클립 이동
      this["mc_"+i]._x += 10;
      this["mc_"+i]._y += 10;
}; 
for (i=1; i<=360; i++)  {                         // 클립 삭제
     this["mc" + i].removeMovieClip ();
}; 
----------------------------------------------------------------------------
setProperty ("mv", _x, 150);           // mv 무비클립 x좌표 속성 변경
myMovieX = getProperty( mv, _x);       // mv 무비클립 x좌표 속성 읽기
trace(myMovieX);
----------------------------------------------------------------------------
_alpha              알파값(%)
_currentframe       현재재생중인 프레임(#)
_droptarget         드래그 앤드드롭 할때 놓는 타깃위치(name)
_framesloaded       로드된 프레임수(#)
_height             높이(#)
_name               인스턴스(string)
_rotation           회전값(#)
_soundbuftime       사운드버퍼링 시간(기본값 5초:#)
_totalframes        총프레임수(#)
_url                다운로드한 URL(string)
_visible            보인다,안보인다 (true,false)
_width              가로길이(#)
_x                  x좌표(#)
_y                  y좌표(#)
_xmouse             마우스x좌표(#)
_ymouse             마우스y좌표(#)
_xscale             x배율(%)
_yscale             y배율(%)
----------------------------------------------------------------------------
_root.a.play;                    //  메인에 있는 a무비클립  프레임 재생
_root.a.stop;                    //  메인에 있는 a무비클립  프레임 중지
play();                          //  stop으로 정지된 현재타임라인의 프레임 재생
stop();                          //  현재타임라인의 프레임 중지
gotoAndPlay(1);                  //  현재 Scene의 1프레임 재생
gotoAndPlay("a");                //  현재 Scene의 Label명 a 재생
gotoAndPlay("Scene 2", "c");     //  Scene 2의 Label명 c 재생
a.gotoAndPlay(1);                //  a무비클립의 1프레임 재생
gotoAndStop(1);                  //  현재 Scene의 1프레임 중지
nextScene();                     //  다음 장면의 프레임 1로 보내고 중지
prevSecne();                     //  이전 장면의 프레임 1로 보내고 중지
nextFrame();                     //  다음 프레임으로 보내고 중지
prevFrame();                     //  이전 프레임으로 보내고 중지
toggleHighQuality ();            //  저해상도와 고해상도 간을  전환
updateAfterEvent();              //  화면을 갱신 (onClipEvent 핸들러 내에서만 사용)
                                  //  (onMouseDown,  onMouseUp,  onMouseMove)
----------------------------------------------------------------------------
tellTarget ("../a") { nextFrame(); } //  ../a 무비클립을 호출후 다음 프레임 재생
if (_framesloaded = 10) {  }         // 만약 무비의 10프레임이 로드되면
----------------------------------------------------------------------------
// with 문
for (i=0; i<1000; i++) {
    with (aaa[i]) {
       _x = Math.floor(Math.random() * 500);
       _y = random(500);
       _rotation = random(360);
   }
}
// tellTarget 문 (속도빠름)
for (i=0; i<1000; i++) {
    tellTarget (aaa[i]) {
       _x = Math.floor(Math.random() * 500);
       _y = random(500);
       _rotation = random(360);
    }
}
----------------------------------------------------------------------------
aaa = new Array();              // 배열 초기화   
aaa = new Array("1","2","3");   // 배열값 넣기
bbb = ["Sun","Mon","Tue"];      // 배열값 넣기
aaa[1] = "abc";                 // 배열값 변환  ( "2" 가 "abc" 로 변환)
aaa[0] = "Jan" ;  aaa[1] = "Feb" ;  aaa[2] = "Mar" ;         // 배열값 변환
aaa[3] = "Apr"                  // 배열 추가 (aaa 값은  "Jan,Feb,Mar,Apr" )
ccc = aaa.concat(bbb);          // 배열 합침 (ccc 값은  "Jan,Feb,Mar,Apr,Sun,Mon,Tue" )
ddd = ccc.join("/");            // ,를  /로 변환  (ddd 값은  "Jan/Feb/Mar/Apr/Sun/Mon/Tue" )
ddd = ccc.length;               // 배열값 갯수 (ddd 값은  7 )
ddd = ccc.slice(2,4);           // 배열값 읽기 (ddd 값은  "Mar,Apr" )
eee = ccc.push("z","zz");       // 배열추가후  배열값 갯수 (eee 값은  9 )
                                 //  (ccc 값은 "Jan,Feb,Mar,Apr,Sun,Mon,Tue,z,zz"   로 변함)
eee = ccc.pop();                // 마지막 배열 분리후 값  (eee 값은  "zz" )
                                 //  (ccc 값은  "Jan,Feb,Mar,Apr,Sun,Mon,Tue,z"   로 변함)
eee = ccc.shift();              // 첫번째 배열 분리후 값 (eee 값은  "Jan" )
                                 //  (ccc 값은  "Feb,Mar,Apr,Sun,Mon,Tue,z"   로 변함)
eee = ccc.reverse();            // 배열값 순서바꿈 (eee 값은  "z,Tue,Mon,Sun,Apr,Mar,Feb" )
                                 //  (ccc 값도  "z,Tue,Mon,Sun,Apr,Mar,Feb"   로 변함)
eee = ccc.splice(2,5,"x","xx","xxx");  // 배열값 읽기후  변환  (eee 값은  "Mon,Sun,Apr,Mar,Feb" )
                                        //  (ccc 값은  "z,Tue,x,xx,xxx"   로 변함)
eee = ccc.unshift("1","2");     // 첫번째 배열추가후  값  (eee 값은  "7" )
                                 //  (ccc 값은  "1,2,z,Tue,x,xx,xxx"   로 변함)
sss = new Array(1,2,3);         // 숫자 배열값 넣기
uuu = sss.toString();           // 문자로변환.  결과는 1,2,3
vvv = uuu.toLowerCase();        // 대문자를  소문자로 변환.  원래 값은 변경되지 않음     
vvv = uuu.toUpperCase();        // 소문자를  대문자로 변환.  원래 값은 변경되지 않음 
xxx = Number("111")             //  숫자로 변환.   결과는 111
xxx = Number("aaa")             //  숫자로 변환.   결과는 NaN
xxx = Number(true)              //  숫자로 변환.   결과는 1
xxx = Number(false)             //  숫자로 변환.   결과는 0
----------------------------------------------------------------------------
cliparray = new Array();                     // 무비클립을 배열로 저장하기
for (a=1; a<=3; a++)  {
     cliparray[a] =  _root["clip"+a];
     cliparray[a].x =  _root["clip"+a]._x;
     cliparray[a].y =  _root["clip"+a]._y;
     trace(cliparray[a].x);
     trace(cliparray[a].y);
}
----------------------------------------------------------------------------
myString = new String();                           // 문자 변수초기화   
myString = new String("가나다");                   // 문자 넣기
tet="가나다";   myString = new String(tet);        // tet  변수 넣기
text0=myString.charAt(0);                          // text0 값은 "가"  -  1개 읽기
text1=myString.charAt(1);                          // text1 값은 "나"  -  1개 읽기
text2=myString.charAt(2);                          // text2 값은 "다"  -  1개 읽기
text3=myString.concat("라마","바사","다");         // text3 값은 "가나다라마바사다"  -  추가
text4=text3.substr(2,4);                           // text4 값은 "다라마바"  -  여러개 읽기
text5=text3.substring(2,4);                        // text5 값은 "다라"  -  여러개 읽기
text6=text3.slice(2,4);                            // text6 값은 "다라"  -  여러개 읽기
text7=myString.charCodeAt(1);                      // text7 값은  45208  - 문자를 코드화
text8="a" + String.fromCharCode(64) + "m";         // text8 값은 "a@m"  - 코드를 문자화
text9= text3.indexOf("다");                        // text9 값은 2  -  문자위치
text10= text3.lastIndexOf("다");                   // text10 값은 7  -  마지막 문자위치
text11= text3.length;                              // text11 값은 8  -  문자길이
text12= text3.split("나");                         // text12 값은 "가,다라마바사다"  -  문자분리
text13= text6.concat(text3);                       // text13 값은 "다라가나다라마바사다"  -  문자합침
text14= text13.substr((text13.length-1),1);        // text14 값은 "다"  -  마지막 문자 읽기
sss = myDate.toString();  day = sss.substring(0,3);     // 문자로변환        
----------------------------------------------------------------------------
// aaa 문장을 bbb 배열로 저장하기                  // 문장을 배열로 저장하기
// 결과는 bbb[0]="a" bbb[1]="b" bbb[2]="c" bbb[3]="d" bbb[4]="e"
aaa = "a b c d e";
aaalen = aaa.length;
bbb = new Array();
for (a=0; a<=aaalen; a++)  { bbb[a] = "";  };
bbbno = 0;   bbbchr = "";
for (a=0; a<=aaalen; a++)  {
if ( aaa.charAt(a) == " " ) {  bbb[bbbno] = bbbchr;   bbbno += 1;   bbbchr = "";  
} else { bbbchr += aaa.charAt(a);   };
};
for (a=0; a<=bbbno; a++)  {  trace( "*" + bbb[a] + "*" )   }; 
----------------------------------------------------------------------------
for (a=1; a<=22; a++) {                                       // 텍스트 필드 글자속성
        this["k"+(a)].textColor=0xff0000;
        this["k"+(a)].border=true;
        this["k"+(a)].borderColor=0xff0000;
        this["k"+(a)].background=true;
        this["k"+(a)].backgroundColor=0xffffff;
};
----------------------------------------------------------------------------
TextField.removeTextField();                                   // 텍스트 필드 삭제
----------------------------------------------------------------------------
createTextField ("instanceName", depth, x, y, width, height)   // 텍스트 필드 생성
      instanceName 새 텍스트 필드의 인스턴스 이름
      depth 새 텍스트 필드의 깊이를 지정하는 양의 정수 (2 는 1를  screen over)
      x 새 텍스트 필드의 x 좌표를 지정하는 정수
      y 새 텍스트 필드의 y 좌표를 지정하는 정수
      width 새 텍스트 필드의 넓이를 지정하는 양의 정수
      height 새 텍스트 필드의 높이를 지정하는 양의 정수
instanceName.type = "dynamic";               // 텍스트 필드의 기본 속성  (dynamic 또는 input)
instanceName.autoSize = "false";             // (글자수에 맞게 테두리 크기 자동 조절 true false center right)
instanceName.border = false;                 // (테두리)  
instanceName.borderColor = 0xff0000;         // (테두리 색상)  
instanceName.background = false;             // (배경)
instanceName.backgroundColor=0xffffff;       // (배경 색상)
instanceName.textColor = 0xff0000;           // (글자 색상)
instanceName.multiline = false;              // (한줄  또는  여러줄)
instanceName.selectable = true;              // (텍스트 필드를 선택할 수 있는지 여부)
instanceName.maxChars = null;                // (사용자가 입력할 수 있는 최대 문자 수) (null 이면 무한대)
instanceName.length = 0;                     // (글자 수)
instanceName._name = "";                     // (인스턴스 이름)
instanceName.variable = "";                  // (변수 이름)
instanceName.html = false;                   // (html 태그 사용 여부)
instanceName.htmlText = "";                  // (html 태그)
instanceName.wordWrap = true;                // (자동 줄바꿈 )
instanceName._x = 0;                         // (x 좌표)
instanceName._y = 0;                         // (y 좌표)
instanceName._width  = 0;                    // (넓이)
instanceName._height = 0;                    // (높이)
instanceName._xscale = 100;                  // (넓이 조절 %)
instanceName._yscale = 100;                  // (높이 조절 %)
instanceName.restrict = "";                  // (입력할 수 있는 문자 세트)
instanceName.embedFonts = false;             // (장치 글꼴 사용 여부)
instanceName.password = false;               // (****표시)
instanceName._visible =  true;               // (보임/안보임.  false로 설정된 텍스트 필드는 사용할 수 없음)
instanceName.scroll = 0;                     // (현재 스크롤 수직 위치)
instanceName.hscroll = 0;                    // (현재 스크롤 수평 위치)
instanceName.maxscroll = 0;                  // (TextField.scroll의 최대값)
instanceName.maxhscroll = 0;                 // (TextField.hscroll의 최대값)
instanceName.text = "";                      // (글자)

myformat = new TextFormat();                 // 텍스트 필드의 기본 TextFormat 속성
myformat.align = "left";                     // (단락의 정렬 )
myformat.blockIndent  = 0;                   // (왼쪽 여백에서 블록 들여쓰기. 포인트 단위)
myformat.indent  = 0;                        // (왼쪽 여백에서 단락 들여쓰기. 각 단락의 첫 줄에만 적용)
myformat.bold = false;                       // (텍스트가 굵은체로 표시되는지 여부)
myformat.bullet = false;                     // (텍스트가 불릿 목록에 있는지 여부 * 표시)
myformat.color  = 0x000000;                  // (텍스트의 색상)
myformat.font = "Times New Roman";           // (텍스트의 글꼴)
myformat.italic = false;                     // (텍스트가 기울임체로 표시되는지 여부)
myformat.leading  = 0;                       // (줄 사이의 행간 세로 간격)
myformat.leftMargin  = 0;                    // (단락의 왼쪽 여백 포인트 단위)
myformat.rightMargin  = 0;                   // (단락의 오른쪽 여백 포인트 단위)
myformat.tabStops = [];                      // (사용자 정의 탭 중지를 지정 // (empty array))
myformat.target = "";                        // (브라우저에서 하이퍼링크가 표시되는 창)
myformat.size = 12;                          // (텍스트의 크기)
myformat.underline = false;                  // (텍스트에 밑줄이 그어졌는지 여부)
myformat.url = "";                           // (텍스트가 링크되는 URL)

instanceName.text = "this is my test field \r aaa" + "bbb";    // 텍스트에 내용 넣기
instanceName.setTextFormat(myformat);        //  텍스트 필드의 TextFormat  변경
----------------------------------------------------------------------------
instanceName.restrict = "A-Z 0-9";           // 대문자, 공백, 숫자만 입력할 수 있음
instanceName.restrict = "^a-z";              // 소문자를 제외한 모든 문자를 입력
instanceName.restrict = "A-Z^Q";             // 대문자 Q를 제외한 대문자만 입력
instanceName.restrict = "\\-"                // 마이너스 부호 (-) 만 입력
----------------------------------------------------------------------------
aa.html = true;                              // html 태그 사용 (b)
aa.htmlText = " this is bold text ";
----------------------------------------------------------------------------
aa.html = true;                              // html 태그 사용 (table)
aa.htmlText = "";
aa.htmlText += "

";
aa.htmlText += "
테이블의 텍스트1 테이블의 텍스트2
";
aa.htmlText += " 이동 하기 ";
----------------------------------------------------------------------------
function Func(arg){  trace ("You clicked me!  Argument was "+arg);   }; 
aa.html = true;                              // html 태그 사용 (asfunction)
aa.htmlText = " Click "; 
----------------------------------------------------------------------------
on (release) {TextField.hscroll += 1; }      // 텍스트를 수평으로 스크롤
on (release) {TextField.scroll += 1;  }      // 텍스트를 수직으로 스크롤
x = TextField.maxscroll;                     // 총 줄수를 표시
----------------------------------------------------------------------------
TextField.onSetFocus = function(){           // 텍스트 입력 (텍스트필드 속성이 입력일때)
    this.text=" input data ";                 // 마우스 클릭시 내용 자동 입력
};
----------------------------------------------------------------------------
// aaa 와 bbb 란 두개의 텍스트 필드를 만든후
aaa.text="1234567890"
Selection.setFocus("aaa");              // 텍스트 모든 문자 포커스. 문자 없으면 커서 깜박
Selection.setSelection(2,5);            // (시작점, 끝점).  결과는 "345" 포커스
bbb.text = Selection.getBeginInde

출처 : [직접 서술] 블로그 집필 - lozzon님의 블로그

Posted by 톰켓 Trackback 0 Comment 0

다 들 잘 아시는 거라고 생각 합니다.

하지만 질문이 들어와서...

제가 아는 범위 안에서 한 번 설명 해 볼께요.

 

enterFrame 의 이해

 

플래시 5시절에는

onEnterFrame 이라는 액션은 없었죠.

 

그 때 그시절에는

 

무비클립에다가

onClipEvent(enterFrame) {

  실행할 액션

}

 

요렇게 썼지요..

 

그럼 이것의 의미는 다 들 잘 아시다 시피..

 

그 무비클립이 존재 할 때

{    } 의 액션을 계속 실행하는 거에요..

1초에 fps 만큼...

20fps 면 1초 20번 .....12fps 면 1초에 12번..

 

 

예를 들어  mc 라는 무비클립이 있으면

 

보기1)

 

mc 라는 무비클립에

onClipEvent(enterFrame) {

    this._x +=3

}

 

이렇게 쓰면 그 무비클립이 존재하는 동안

그 무비클립의 위치가 자기 자신의 위치에서 x 축으로 3만큼씩 계속 증가하는거에요.

12fps면 1초에 12번 자기 자신의 위치에 x 축으로 3만큼씩 이동 하는 거구요

24fps 면 1초에 24번 자기 자신의 위치에 x 축으로 3만큼씩 이동 하는 거구요

즉 24fps 면 12fps보다 같은 시간에 2배 빠르게 이동하겠죠..

.

이게 콜백방식으로 표현 되면서

 

보기2)

 

mc.onEterFrame = function () {

    this._x +=3

}

 

이렇게 바꼈답니다..

 

 

참고..

 

콜백함수라는 것은 의미상으로는 어떤 특정한 이벤트가 발생하면 그에 반응하여 자동적으로 실행되도록 등록된 함수를 말해요..

 

감이 안 옵니다...

 

보기를 파헤쳐 보아용..

보기1) 과 2)는 똑같이 mc 라는 무비클립의 오른쪽으로 이동하게 해주는 일을 해요

다만 방식이 다를 뿐이에요..

 

보기1)의 방식은

이벤트 핸들러가 코드 블록을  {  } 으로 감싸서 직접 액션을 관리하는 거구요

 

보기2)의 방식은

mc.onEnterFrame 에 function () 객체를 참조하도록 해서 ( " =  " 이라는 연산자를 통해서)

onEnterFrame 이 호출 되었을 때

지정된 함수( " = " 다음에 오는 function () 이겠죠^^)를

자동적으로 실행하도록 하는 것이에요.

이때 지정된 함수를 콜백 함수라고 우리는 부르지요.

 

어는 책이라도 액션을 다루는 책이면 enterFrame에 대해서 자세히 설명 되어 있고,

레퍼런스에서도 자세히 설명 되어 있습니다.

더 자세한거는 찾아 보시면 됩니다....

전 이해만 돕기 위해^^

 

setInterval 의 이해

신나게 enterFrame을 가지고 놀다가 갑자기 이런 경우가 발생 했습니다.

 

무비의 속도는 24fps 로 고정 되어있습니다.

24fps 일 때

enterFrame을 돌리면 1초에 24번 실행하게 됩니다.

그런데 1초에 한 번만 계속 실행 되도록 하고 싶습니다.

그럼 어떻게 해야 할까요?

 

네..fps 를 1fps로 바꾸어 주면 됩니다.

그러면 enterFrame은 1fps에 의해서 1초에 한번씩 실행됩니다..

 

그러나...딴 거는 다 24fps 의 속도로 계속 실행해야 하고

단 1개는 1fps 의 속도로 계속 실행하게 할려면...

 

대략 난감 합니다...

이럴때 쓰는게 setInterval() 입니다.

 

setInterval()의 형식부터 알아야 겠죠.

 

setInterval(a,b,c,d)
a = 함수이름
b = 1/1000 초
c ~d =  함수 인자.
작동은 계속되나 화면상에 뿌려주는 거는 fps 영향을 받습니다.
따라서 함수안에 updateAfterEvent() 를 적용해야 합니다.


감이 안 오죠..

예제를 통해서 알아보죠..

 

 

function movemove() {
   mc._x += 3;
   updateAfterEvent();
}

setInterval(movemove, 1000);

movemove 라는 function () 에 내용을 쓰고

setInterval 로 movemove 라는 함수를 1초에 한번씩 호출 하는 겁니다.

그러면 1초에 한번씩 계속 실행 되는 겁니다.


참고)

setInterval의 가장 큰 장점은 정확하다는 겁니다.

enterFrame의 경우는 cpu의 영향을 받습니다

그래서 24fps 로 설정한 경우에도

cpu에 따라 1초에 24번 보다 적게 실행되는 경우가 허다 합니다.

하지만 setInterval 의 경우는 컴퓨터 안에 내장되어 있는 시간으로 하기 때문에

정확하게 실행을 시켜주게 됩니다.


1fps  -- 1000/1

2fps -- 1000/2

10fps -- 1000/10

24fps  -- 1000/24

30 fps -- 1000/30


감이 오죠?

자기가 원하는 fps되로 실행할려면 1000 / x fps 로 하면 됩니다.



enterFramesetInterval의 죽이기.....

사실  enterFrame과 setInterval 은 쓰는 것보다 다 쓰고나서

죽이는 게 더 중요합니다.


왜냐구요?


다 쓰고 나서 쓸데없이 계속 실행시키면 컴터가 점 점 느려지면서 뻗어지는게 느껴질껍니다.

심심하신분은 다음 코드를 한 번 실행 해 보시길 바랍니다.


스테이지에 아무꺼나 하나 그리고

그 무비클립의 이름을 mc라고 정합니다.

그리고 나서


num = 100;
for (var i = 0; i    _root.mc.duplicateMovieClip("mc"+i, i);
    ob = _root["mc"+i];
    ob._x = i*10;
    ob.onEnterFrame = function () {
       tax = random(1000)
        this._x += 0.2*(tax -this._x)
    }
}

 

 

이 소스를 그대로 복사해서 붙혀넣어서 한 번 실행 해보세요.

아마도 별 지장없이 잘 돌아 갈껍니다.

이제 다시 num 을 1000으로 바꿔 보세요..

컴터 뻗는게 점점 눈에 보일껍니다..

 

enterFrame과 setInterval 을 쓸때는 항상 두 이벤트를 언제 죽일까도 생각을 하시면서

쓰시길 바랍니다.


가장 쉬운 예)


enterFrame() 죽이는 방법


mc.onEterFrame = function () {

    this._x +=3

    if(this._x>400) {

     delete this.onEnterFrame;

    }

}

enterFrame을 죽일려면 어떠한 조건이 있어야 겠죠?

  if(this._x>400) {

    }

이 부분이 조건이 되겠습니다.

그 때 delete 를 써서 enterFrame을 죽이면 됩니다.

 

 

setInterval() 죽이는 방법

 

function movemove() {
   mc._x += 3;
   updateAfterEvent();

   if(this._x>400) {

   clearInterval(gogo)

   }

}

gogo = setInterval(movemove, 1000);


역시 조건은 같습니다.

clearInterval(gogo)

이 부분이 죽이는 부분입니다.

 

gogo 부분이 ID 값 입니다.

setInterval 은 보기 아랫부분처럼 ID값을 정해 주셔 실행하시면 됩니다.

 

이상 허접하게 설명 했습니다.

이러한 부분들은 action 에 관련된 책에 더욱더 자세히 설명이 나와 있습니다.

책을 참고 하시길 바랍니다.

Posted by 톰켓 Trackback 0 Comment 0