var theContent:String = "I hate when content has words like, ‘damn’ in it. And let's have some more damn, damn, damn" trace(replace(theContent, "damn", "darn"));
function replace(org:String, fnd:String, rpl:String):String { return org.split(fnd).join(rpl); }
액션스크립트 3.0의 기본 tween클래스에는 많은 버그들이 있다..사용하기에도 불편하고 그리하여 지구인들은 몇가지 멋진 기능이 있는 외부 tween들을 몇가지 만들어서 배포, 판매를 하고 있는데, 그 여러가지 종류중에서 효율성이 최상은 아니지만 가장 사용하기 간단하고 처음 접하기에 편한 구글 트위너에 대해서 한번 알아보자. 일단 그전에 간략하게 소개정도 하자면 Tweener 라는 이름의 이녀석은 여러가지 개발자들(layman's terms)이 구글프로젝트 지원정책하에서 움직이기 땜시롱 일명 구글트위너 라고도 한다. 상용으로는 트윈맥스란 녀석도 있는데 이녀석은 꾀나 효율이 좋은편이란다 그래도 일단 돈내야 하니깐(물론 기능이 제한된 무료버전도 있다) 패스하고. 간단한 구현정도는 구글트윈을 이용해서 손쉽게 활용해보자 기본적으로 as3.0 기본으로 설명을 해보자 (사이트가면 2.0버전도 있으나 저자가 3.0 신봉자라서 3.0으로만 하겠다)
1.장 설치
홈페이지에서 다운을 받자.오른쪽 중간 쯤 보면 액션스크립트 버전별로 다운로드 할수 있다. 우리는 3.0으로 할꺼니깐
프로젝트를 하나 만들어보자. 이름은 "tweener"라고 이쁘게 지어보자. 프로젝트안에 fla파일과 as파일또한 손쉽게 "tweener"이라고 지어보자. 자그럼 본격적으로 설치을 해보자 (지금까지는 ...?!!!) 자 설치는 초간단하다 아까받은 파일을 압축을 푼다. 어디에? 프로젝트 폴더에 !!! 이걸로 설치는 끝이다. 어려운가? 어렵다고 생각하면 지금 당장 접시물에 코을 넣어야 할것이다. (압축을 풀면 caurina란 폴더가 있다 이폴더을 통째로 프로젝트폴더에 넣을것.)
2.장 사용
그림1처럼 tweener이란 프로젝트에 tweener.as파일과 tweener.fla파일이 있다. 일단 처음에는 간단히 fla파일에서 빨간색 box을 만들어 F8로 라이브러리에 등록한후(심볼이름은 mc_box) 액션으로 제어하기 위해 Linkage으로 스크립트와 이어준다.(클래스이름은 자동으로 심볼이름과 동일하게 지정된다)
그림1
다음으로 그림2처럼 tweener.as파일에 본격적으로 코딩을 시작해보자.
그림2
코드를 분석해보면 tweener이란 클래스는 Display의 Sprite를 상속받은 클래스 이기 때문에 그래픽 심볼들을 붙여서 표현할수가 있다.
그렇다 Document Class 정의가 해답이다. fla파일과 as파일 2개는 독립된 파일이다 예전처럼 fla파일에 f9을 눌러서 중구난방식으로 스크립트을 작성했던 시절엔 fla안에 스크립트와 온갖 심볼들이 다 포함되어 있었기 때문에 as파일을 클래스화 한다거나 클래스를 나눠서 협업을 한다는 등의 생각은 꿈도 꾸지 못하였다 하지만 이렇게 스크립트파일을 따로 만들어서 fla과 as파일을 이어줌으로 써 개발함에 있어서 좀더 유연해 졌다. 자 이제 그림3처럼 Document Class 부분에 우리가 작성한 as파일의 이름을 쓰자.
그리고 다시 컴파일 해보자. 어떠한가? 빨간 box는 일단 보이니 안심이다. 하지만 box가 이동되는 트윈모션은 안보이고 그냥 단순히 이동된 후의 모습만 보일 뿐이다. 이러면 단순하게 box.x=100, box.y=100 한것과 무슨 차이가 있겠는가? 하면서 의아해 하는것이 정상이다. 이런한 결과의 원인은 꾀 간단하다.
플래쉬는 fps단위로 작동된다 무슨말인가. frame per sec 즉 초당 프레임수에 따라서 영상의 움직임을 표현한다.
"엥 그거야 당연하지 그림3에도 FPS는 32잖아?" 라고 생각하는가 ? 그렇다 맞다. 하지만 Tweener에는 별도의 time이란 속성값이 있다. (물론 fps의 영향도 받는다) 이 time이란 파라미터는 트위을 당하는 디스플레이 객체가 매초마다 얼마나 오래 변화될 것인가 하는 변화량을 적는것이다. time:99 라면 1초당 99번 변화되는것이다. 그럼 어떨것 같은가? 같은거리를 1초동안 99번 움직여서 가는것과 1번 움직여서 가는것. 그렇다 1번 움직이는것이 더 빠를것이다. 통상적으로 time값은 1~ 1.2 정도로 2이상을 넘어가는 경우는 드물다. 또한 delay란 속성값이 있는데 이는 시작을 지연시키는 속성값이다. 그외 속성들은 레퍼런스를 참고 하기 바란다.
아래 그림4는 우리가 이번장에서 알아본 트위너의 최종형태이다. (그림2에서 time만 추가되었다)
추가로 transition속성값에 따라서 움직임(가속,마찰)이 달라지는데 그 종류들은 아래 사이트에서 참고하여 한번씩 바꿔보길 권한다 (나름 재미있다)
/* Add John to your `contact` list */ var myContacts:HashMap = new HashMap(); myContacts.put("John", new HashMap());
/* Get John, and add a `contacts` list */ var contact:HashMap = myContacts.get("John"); contact.put("contacts", new HashMap());
/* Add Johns contacts to the list */ var theContacts:HashMap = contact.get("contacts"); theContacts.put(0, "Mary"); theContacts.put(1, "Alex"); theContacts.put(2, "Julie");
/* Is Alex a contact of John? */ var isContact = myContacts.get("John").get("contacts").containsValue("Alex"); if(isContact)trace("Alex is contact of John"); elsetrace("Alex is Not a contact of John");
/* Is Mark a contact of John? */ var isContact = myContacts.get("John").get("contacts").containsValue("Mark"); if(isContact)trace("Mark is contact of John"); elsetrace("Mark is Not a contact of John");
public class ViewManager { private var main:Main; private var sptMain:Sprite; private var sptImageContainer:Sprite; private var sptFieldContainer:Sprite; private var loader:Loader; private var URI_IMAGE:String = "http://www.flash8coders.com/images/img3.jpg";
public function ViewManager(main:Main) { this.main = main; }
public function start():void { buildViews(); }
private function buildViews():void { var btn:Button = main.getChildByName("btn") as Button; btn.addEventListener(MouseEvent.CLICK, clickHandler);
sptMain = new Sprite(); main.addChild(sptMain); sptImageContainer = new Sprite(); sptMain.addChild(sptImageContainer); sptFieldContainer = new Sprite(); sptMain.addChild(sptFieldContainer);
loader = new Loader(); sptImageContainer.addChild(loader);
private function clickHandler(event:MouseEvent):void { // 초기화 loader.unload(); loader.x = 0; if (sptFieldContainer.numChildren != 0) { sptFieldContainer.removeChildAt(0); }
// 배치실행 시작 excuteLinearProcess(); } private function excuteLinearProcess():void { var batch:BatchCode = BatchCode.getInstance(); batch.clearBatch(); // 안해도 되는데 걍 클리어해줬음, 시작할때가 아니라 마지막에 해도 괜찮을 듯 batch.onExcuteListener = function () { batch.next(); };
batch.addBatch(this, this.loadImage, [URI_IMAGE]); // 1. 이미지를 로드하고, 이미지 로드가 완료되면 batch.addBatch(this, this.resizeOriginalRatio, [400, 400]); //2. 이미지의 사이즈를 조정하고 batch.addBatch(this, this.moveTo, [200]); // 3. 오른쪽으로 이동하는 트윈을, 트윈이 끝나면 batch.addBatch(this, this.addTitle, ["이미지 이동 완료"]); // 4. 완료가 됐다는 메시지를 찍어본다. batch.addBatch(this, this.moveTextClip, [0, 10]); // 5. 이렇게 찍힌 텍스트클립을 좌상단으로 이동해본다. batch.excuteBatch(); } public function loadImage(uri:String):void { loader.load(new URLRequest(uri)); }
private function handler_loaded_image(event:Event):void { BatchCode.getInstance().onExcuteListener(); } public function resizeOriginalRatio(boundWidth:Number, boundHeight:Number):void { ImageTransform.transformToOriginalRatio(boundWidth, boundHeight, loader); BatchCode.getInstance().onExcuteListener(); } public function moveTo(pos:Number):void { TweenLite.to(loader, 1, {x:pos, ease:Bounce.easeOut, onComplete:handler_complete_move}); } private function handler_complete_move():void { BatchCode.getInstance().onExcuteListener(); } private function addTitle(msg:String):void { var field:TextField = new TextField(); field.name = "field"; field.text = msg; field.x = 0; field.y = 0; field.autoSize = TextFieldAutoSize.LEFT; field.text = msg; sptFieldContainer.addChild(field); sptFieldContainer.x = 300; sptFieldContainer.y = 350;
ActionScript 3.0에서 onReleaseOutside를 대체할 만한 이벤트가 없습니다. 그래서 MOUSE_DOWN 이벤트가 발생할 때, stage에 MOUSE_UP 이벤트를 추가했다가, MOUSE_UP 이벤트 핸들러에서 다시 MOUSE_UP를 제거시키는 방법을 사용해야 하네요.
function dataSendLoad() {
//변수를 PHP 파일로 전송할 개체 생성
var mySendVars = new LoadVars();
//개체에 변수 입력
var mySendVars.sendvars = "testVars";
//PHP로부터 보내진 변수들을 로드할 LoadVars 개체 생성
var myLoadVars = new LoadVars();
//로드 완료 후 실행 할 함수 정의
mySendVars.onLoad = function(success) {
...
}
//PHP 파일로 변수 전송 및 로드
mySendVars.sendAndLoad("send_load.php", myLoadVars, "POST");
}
// 변수를 주고 받을 PHP파일 private var url : String = "send_load.php"; // PHP에 전달한 변수 private var variables : URLVariables;
public function Main() : void { variables = new URLVariables(); // 변수값 할당 variables.sendvars = "testVars";
sendData(url, variables); }
public function sendData(_url:String, _vars:URLVariables):void { var request : URLRequest = new URLRequest(_url); request.data = _vars; // 전송방식 request.method = URLRequestMethod.POST;
var loader:URLLoader = new URLLoader(); // 데이터 형식 지정(BINARY, TEXT, VARIABLES) loader.dataFormat = URLLoaderDataFormat.VARIABLES; loader.addEventListener(ProgressEvent.PROGRESS, onProgressHandler); loader.addEventListener(Event.COMPLETE, onCompleteHandler); loader.addEventListener(IOErrorEvent.IO_ERROR, onIOErrorHandler); loader.load(request); }
private function onProgressHandler(e:ProgressEvent):void { trace("@ PHP Loading"); }
private function onCompleteHandler(e:Event):void { var loader : URLLoader = URLLoader(e.target); trace( "loader.data : " + loader.data ); }
private function onIOErrorHandler(e:IOErrorEvent):void { trace("Error loading URL."); } } }
Unfortunatly, no method exits on the TextField class in AS3 as it does not extend the Sprite class, which contains the buttonMode property.
This is most apparent with the annoying problem of having a TextField inside your Sprite/MovieClip you;re trying to use as a button, where even after setting buttonMode = true on the button, rolling over the textfield inside the button will revert the Cursor back to default.
To get round this simply use the mouseChildren = false property on your Sprite/Movieclip button.
function print_text0(event:MouseEvent):void{ //[프린터 작업 생성]
var skin1:print_skin1 = new print_skin1(); var printJob:PrintJob = new PrintJob(); skin1.content_text.text = text0.text; printJob.start(); try{ printJob.addPage(skin1); printJob.send(); }catch(error:Error){
} }
function save_text0(event:MouseEvent):void{ if(text0.text==""){ ExternalInterface.call("내용이 존재 하지 않습니다."); this.stage.focus=text0; }else{ so.data.text01 = text0.text; so.flush(); ExternalInterface.call("저장 완료!"); } }
function text_clear(evetn:MouseEvent):void{ trace("click"); if(so.data.text01==null){ text0.text=""; } }
[작성자] :http://www.visualp.com - 고병만 플레쉬 2.0 에서는 파일 다운로드 링크를 걸기 위해서 geturl 을 사용 했다. 링크는 되지만. activex경고창 내지는 파일 다운로드 경고차이 뜨면서 다운로드를 선택 하면, flash 페이지가 reflash되는 현상이 발생 한다.
3.0d에 이 문제들을 해결해 주고 있다. FileRefference를 이용하여 다운로드를 하자.
import flash.net.*;
public static var fileReference:FileReference = new FileReference(); var urlRequest:URLRequest = new URLReques(http://blog.visualp.com/filename.zip); fileReference.download(urlRequest);
가장 심풀한 다운로드 소스 이다.
문제는 FileRefference 객체를 생성 할 때전역 함수로 사용 해야 한다.
메소드(함수) 안에서 사용하게 될경우 , 즉 지역 함수로 선언 하면, 파일 다운로드가 되지 않는 문제가 발생 한다. 왜 파일 다운로드가 안되냐고.. 삽질 하지 말고,, 객체가 생성된 위치를 잘 살펴 봐야 하다.
구현시 생각 해야 할 부분, 자바스크립트 와 연동 하여, 다운받을 서버 주소 즉 풀 네임을 얻어서 자기 링크를 걸어야 한다.
즉 다시 말해서 ./../ 뭐 이런식의 접근은 불가능 하다. http 또는 https 형식의 접근이 가능 함으로 반드시 기억해 둬야 한다.
// ActionScript 3.0import fl.controls.TextArea;
var chaparralProEmbeddedFont:Font = new ChaparralProEmbedded();
vartextFormat:TextFormat = newTextFormat();
textFormat.font = chaparralProEmbeddedFont.fontName;
textFormat.size = 32;
var textArea:TextArea = new TextArea();
textArea.setStyle("textFormat", textFormat);
textArea.setStyle("embedFonts", true);
textArea.text = "The quick brown dog jumps over the lazy fox.";
textArea.move(10, 10);
textArea.setSize(300, 200);
addChild(textArea);