1.플래쉬에서 버블을 하나 그리고 BubbleClip라는 이름의 무비클립을 만든다.(Export to Actionscript 박스
체크!) 그리고 SWC로 export한다.(저장 위치는 현재 작업하고 있는 해당 project안의 libs 폴더)
2.Bubble.as class를 작성한다.
3. Document class인 BubbleTest.as를 작성한다.
public class Bubble extends Sprite
{
private var clip: BubbleClip = new BubbleClip();
public var vx: Number = 1;
public var vy: Number = 1;
//public var topBound:Number=0; //public var rightBound:Number=800; //public var bottonBound:Number=400;
public static var topBound: Number = 0;
public static var rightBound: Number = 800;
public static var bottomBound: Number = 400;
public static var resistance: Number = 0.95;
public static var gravity: Number = 0.2 ;
public function Bubble()
{
super();
this.setLayout();
}
private function setLayout(): void
{
this.addChild( clip );
} // 움직임 명령이 주어지면, 매 프레임마다 할 액션 등록하기
public function startMove(): void
{
this.addEventListener( Event.ENTER_FRAME, onEnter );
} // 매 프레임마다... 할 일..
private function onEnter( e: Event ): void
{
this.x = this.x + this.vx;
this.y = this.y + this.vy;
//vx,vy가 변하지 않으면 등속도 운동... //-를 이용하면 언젠가는 반대로 움직여야 한다. //빙판과 같은 움직임 서서히 줄어드는 것은 곱하기로 한다.
this.vx = this.vx * Bubble.resistance; //공통으로 사용하는 것이므로 위에서 static처리 해준다. //this.vx.=this.vx*0.98;
this.vy = this.vy + Bubble.gravity;
1.flash에서 원을 하나 그리고 SnowClip라는 이름의 무비클립을 만든다.(Export to Actionscript 박스 체크!) 그리고 SWC로 export한다.(저장 위치는 flex내 현재 작업하고 있는 해당 project안의 libs 폴더)
2.Snow.as class를 작성한다.
3. Document class인 SnowTest.as를 작성한다.
눈내리는 효과
컴퓨터 bit :전기가 충전 / 방전 1,0
2bit ::00/01/10/11
8bit ::00110010 ---->1byte 0~256가지의 정보를 저장할 수 있다.
int::-20억~20억---->4byte
number는 8byte
public var vx:Number=1; ------------>8byte public var vy:Number=1; ------------>8byte public var ground:Number=400; ----->8byte 총 24byte
주로 변수들이 메모리를 차지한다.
그러므로 공유용인지 개별용인지를 구분하여 공유용인 것은 static으로 바꿔주어 메모리 할당량을 줄여준다.
실험을 해보면 static을 쓸때와 그렇지 않을 때 퍼포먼스의 차이가 많이 나게 되는 것을 알 수 있다.
public class Snow extends Sprite
{
private var clip: SnowClip = new SnowClip();
// 속도 변수 :: 외부에서 설정할 수 있도록... public으로 설정 //모든 눈의 속도는 다르므로 개별적으로 가져야한다.
public var vx: Number = 1; // 개별
public var vy: Number = 1; // 개별
// 공유변수는 static 변수로 설정 --> 클래스 변수 //모든 눈이 도달하는 ground위치는 같으므로 ground 변수는 공유해도 된다.
//public var ground: Number = 400; // 공유변수 !!!!! Snow.ground(아래의 static 변수와 비교하며 실험해본다.)
public static var ground: Number = 400; // 공유변수 !!!!! Snow.ground
//메서드는 따로 저장이 되므로 그냥 두고 변수 부분을 최대한 줄여보자!!!!!!! //공유변수는 static 변수로 설정 ====>클래스 변수
// static 함수 ---> 사용의 편의성 Math.random() // static 변수 ---> 공유의 목적...!!
public function Snow()
{
super();
this.setLayout();
this.addEvent();
}
private function setLayout(): void
{
this.addChild( clip );
}
private function addEvent(): void
{
}
// 이 함수가 호출되면, 매 프레임마다 움직이기 시작...!!
public function startMove(): void
{
this.addEventListener( Event.ENTER_FRAME, onEnter );
}
// 땅으로 떨어지고나면, 매 프레임마다 할 일 제거하고, 자신은 parent로부터 삭제 // removeChild할 경우, (하고있는 일을 멈추지 않고 잠깐 강의실을 나가있어라! 와 같은 뜻임) //(removeChild의 경우는 계속 Event.ENTER_FRAME은 여전히 작동중이므로 Event도 지워준다.) // 1. 애니메이션이 있으면 stop()시키고, // 2. EnterFrame 이벤트 삭제하기
if( this.y > Snow.ground ){
this.removeEventListener( Event.ENTER_FRAME, onEnter );
parent.removeChild( this );
}
}
class Person
{
private int age;
public int getAge() { return age; }
public void setAge(int age) {
if (age < 0) throw RuntimeException();
this.age = age;
}
...
}
첫번째는 이와같이, 사용자의 입력값을 검증하는데 쓰일 수 있다는 것이구요.
이런의미에서 값의 갱신이 어떻게 이루어져야하는가 (여기서는 나이가 음수일수
없다는 규칙)에 대해서 외부로 부터 숨길 수 있게 됩니다.
이 경우는 간단하니까 - 나이가 음수면 안된다는 것은 너무나 상식적이므로 - 그냥
외부에서 잘 넘겨주어도 될 것 같다는 생각이 들 수 있지만, 좀더 복잡한 속성이라면
갱신시 필요한 규칙을 모두 따져주기가 힘들 수 있겠죠.
이 역할을 getter나 setter가 담당합니다.
(2) 때로 getter/setter 는 readonly/writeonly 의 구현에도 사용될 수 있습니다.
이 경우는 변수의 모든 측면에 '다 접근할 수 없는' 예가 되겠죠.
class Person
{
private int age;
public int getAge() { return age; }
private void setAge(age) { if (age<0) throw RuntimeException(); this.age = age; }
public Person(age) { setAge(age); }
}
(3) 메소드 선언은 미래의 확장을 위한 것입니다.
예를들어 Person에서 Child와 Adult가 구분된다고 해보죠.
그리고 Adult가 되는 기준을 18세라고 해보겠습니다. 그렇다면,
class Adult extends Person
{
public void setAge(int age) {
if (age < 18) throw RuntimeException();
super.setAge(age);
}
}
와 같이 구현할 수 있을 것입니다.
만약 이 경우에 Person의 age가 메소드가 아니라 단지 변수였다면
그렇다면 '나이'에 대한 규칙을 이렇게 쉽게 오버라이딩 할 수 있었을까요?
메소드로 선언하거나, 클래스로 만들거나 하는 것은 리팩토링에서도 나오듯이
미래의 확장을 위한 대비책입니다.
if (복잡한 수식) { ... }
을
if (checkCondition(var1,var2,...)) { ... }
로 바꾸는 것도 조건 수정이 쉽게 되게 하기 위해서죠...
getter/setter도 마찬가지입니다.
제목 : Re: 상황에 따라 적절히 사용하는 건 어떨까요?
글쓴이: 손님(guest) 2005/08/16 15:01:52 조회수:33 줄수:5
모든 변수를 private 선언하고 public 함수로 접근하는 것 보다는
상황에 따라 public 변수 선언하고 막바로 참조하는 것도 실제 코딩에선 효률적인 듯합니다.
전에 자바를 공부하면서 대체 왜 세터와 게터를 쓰는 걸까 하고 궁금해 했는데, C++ 책을 읽으면서 알게 됐다. 클래스안의
protected한 변수에 접근하기 위해서는 멤버함수 (클래스 안에 정의 되어진 함수) 를 이용하거나 friend 키워드를
통해서 접근해야 하는데 이때에 protected한 변수를 쉽게 접근할 수 있게 미리 만들어 놓은 게터와 세터를 이용하게 되는
것이다.(게터와 세터 역시 멤버함수이다) 굉장히 간단한 사실이지만 프로그래밍 초보인 나는 이 사실을 알아내고 굉장히 신기해
과정
1. 5개의 임의의 jpg 사진을 flex의 현재 작업하고 있는 프로젝트 안의 img 폴더에 저장한다.
2. flash에서 디자인한 SWC파일을 flex로 export한다.
3. PhotoGallery calss 코딩
4. PhotoGalleryTest 코딩
1.검정 사각형(width:410 heght:320)을 그리고 F8, convert to symbol 팝업창이 뜨면 무비클립 이름을 (PhotoGallery) 적고 Export to ActionScript를 체크한 후 저장
2.검정 무비클립 안으로 들어가서 새로운 레이어를 만들고 회색 사각 무비클립 (instance name은 screen_mc ) 생성
3.오른쪽에 무비클립은 버튼 5개 생성 ( instance name은 btn_1 ~btn 5)
4.libray로 돌아가 PhotoGallery 무비클립의 linkage를 확인 한 후 swc파일로 export 저장 장소는 flex 의 작업 프로젝트 안으로 함
5.flex에서 확인
public class WeatherWidget extends Sprite
{
private var clip:WeatherWidgetClip= new WeatherWidgetClip();
public function WeatherWidget()
{
super();
this.addChild(this.clip)
var obj0:Object=new Object();
obj0.label="서울"
obj0.data="KSXX0037"
this.clip.city_cbo.addItem(obj0);
var obj1:Object=new Object();
obj1.label="제주"
obj1.data="KSXX0004"
this.clip.city_cbo.addItem(obj1);
}
}
}
Superclass: Sprite
package
{
import flash.display.Sprite;
import timo.widget.WeatherWidget;
[SWF(widthe="500", height="400", frameRate="36", background="0X23EEEE")]
public class WeatherWidgetTest extends Sprite
{
public function WeatherWidgetTest()
{
super();
var weatherWidget:WeatherWidget=new WeatherWidget();
this.addChild(weatherWidget);
}
for(var i:int=0;i <this.arrCity.length;i++)
{
var obj:Object=new Object();
obj.label=this.arrCity[i];
obj.data=this.arrCode[i];
this.clip.City.addItem(obj); //데이터와 라벨을 합쳐서 아이템이라고 부른다.
}//for
this.clip.City.addEventListener(Event.CHANGE, onChange); //바뀔 때마다 변화가 일어나게 하는 것
}//weatherWiget
private function onChange(e:Event):void
{ //trace("콤보박스 선택....!!!")
trace(this.clip.City.selectedItem.label,this.clip.City.selectedItem.data); //바뀐 내용을 알 수 있도록 선택되도록 한다. //데이터와 라벨을 합쳐서 아이템이라 하므로 셀렉티드아이템을 선택하는 것이다.
var weather:WeatherService= new WeatherService();
weather.addEventListener(WeatherResultEvent.WEATHER_LOADED, onComplete);
weather.getWeather(this.clip.City.selectedItem.data,"c");
}
private function onComplete(e:WeatherResultEvent):void
{
this.clip.humi_txt.text=e.weather.current.atmosphere.humidity+"%";
this.clip.press_txt.text=e.weather.current.atmosphere.pressure+"mb";
this.clip.tem_txt.text=e.weather.current.temperature+"c";
this.clip.sind_txt.text=e.weather.current.wind.speed+"m/s"
//받은 이미지 링크 정보로 부터 이미지 호출
this.loader.load(new URLRequest(e.weather.current.imageURL)); //this.loader.load(new URLRequest(e.weather.current.imageURL)); //e.weather.current.imageURL //e.weather.forecast
}
}//class
}//package
WeatherWidget 클라스 중간에 초기 화면에도 정보가 뜰 수 있도록 코드를 더해준다 (붉은색 표시)
public class WeatherWidget extends Sprite
{ // UI와 코딩이 결함된 클래스
// ui
private var clip: WeatherWidgetClip = new WeatherWidgetClip();
private var loader: Loader = new Loader();
// 도시정보
private var arrCity: Array = [ "서울", "제주", "부산", "대전" ];
private var arrCode:Array = [ "KSXX0037", "KSXX0004", "KSXX0050", "KSXX0027" ]; // 생성자에서 할 일... 1. UI 구성, 2. 이벤트 설정
public function WeatherWiget()
{
super();
this.addChild(this.clip);
this.clip.screen_mc.addChild(loader);
for(var i:int=0; i<this.arrCity.length;i++)
{
var obj:Object=new Object();
obj.label=this.arrCity[i];
obj.data=this.arrCode[i];
this.clip.city_cbo.addItem(obj);
}//for
//강제로 이벤트를 발생시키는 코드(붉은색)가 첨가되지 않았을 때는 default로 서울이 선택되고 어떤 정보도 나오지 않았다. //처음 선택된 도시의 정보도 보여주도록 하기 위해 최초로 호출되는 배열을 2번으로 하고 그 변화를 호츨 하도록 디스페치이벤트를 사용한다. //city_cbo가 CHANGE 이벤트를 듣고 있으므로 강제로 dispatchEvent를 써주는 것임 //함수로 처리하는 또다른 방법이 있 디스페치를 쓰는 것이 더 세련됨 this.clip.city_cbo.addEventListener(Event.CHANGE, onChange); this.clip.city_cbo.selectedIndex=2; this.clip.city_cbo.dispatchEvent(new Event(Event.CHANGE));
}
private function onChange(e:Event):void
{
trace(this.clip.city_cbo.selectedItem.label,this.clip.city_cbo.selectedItem.data);
var weather:WeatherService=new WeatherService();
weather.addEventListener(WeatherResultEvent.WEATHER_LOADED, onComplete);
weather.getWeather(this.clip.city_cbo.selectedItem.data,"c");
}
private function onComplete(e:WeatherResultEvent):void
{
this.clip.humid_txt.text=e.weather.current.atmosphere.humidity+"%%%%%";
this.clip.pressure_txt.text=e.weather.current.atmosphere.pressure+"mb";
this.clip.temp_txt.text=e.weather.current.temperature+"c";
this.clip.wind_txt.text=e.weather.current.wind.speed+"m/s"
//받은 이미지 링크 정보로 부터 이미지 호출
this.loader.load(new URLRequest(e.weather.current.imageURL));
}
}//class
}//package
2번 배열에 해당하는 부산이 초기에 뜨고 관련 정보가 릴리즈된다. (텍스트 색은 swc파일을 변경한 것임..무시하길 바람)
[SWF(width="550", height="400",frameRate="36", background="0X23EEEE")] public class YahooTest extends Sprite { public function YahooTest() { super(); //1.객체생성 var weather:WeatherService=new WeatherService //2.데이터가 도착하면 할일 weather.addEventListener(WeatherResultEvent.WEATHER_LOADED, onComplete); //3.데이터 호출 weather.getWeather("KSXX0037","c"); } private function onComplete(e:WeatherResultEvent):void { trace("습도,온도,가시거리,풍향,풍속...모두 꺼낼 수 있다."); trace(e.data)
//data는 오브젝트이기 때문에 dot을 찍었을때 세부네용이 모두 나오지 않았다. 다시말하면 data는 오브젝트로서 모든 정보가
뭉쳐져있는 상태인 것이다. 세부 테이터를 선택할 수 있도록 하려면 com > event 폴더에 저장 되어있는
WeatherResultEvent 파일에 getter를 첨부해주어야 한다. (자세한 코드는 아래에 첨부함)
//찾아들어가는 방식은 컨트롤을 누른 상태에서 "WeatherResultEvent"를 클릭하여 해당 이벤트로 바로 이동하거나 수동으로
찾아들어간다.
trace("온도:",e.weather.current.temperature); // 현재 온도를 찾아들어가는 과정 dot을 찍었을때 나오는 하위 정보를 선택 trace("풍속:",e.weather.current.wind.speed+"km/s"); trace("습도:",e.weather.current.atmosphere.humidity+"%"); trace("풍속:",e.weather.current.atmosphere.pressure+"mb"); //모든 정보를 때마다 외워서 코딩하는 것은 비 효율적이므로 위와 같이 간단하게 상식선에서 활용할 수 있도록 하는 것이 목적이다. } }//class }//package
src>com>event>WeatherResultEvent
/*
Copyright (c) 2008 Yahoo! Inc. All rights reserved.
The copyrights embodied in the content of this file are licensed under the BSD (revised) open source license
*/
package com.yahoo.webapis.weather.events
{
import com.yahoo.webapis.weather.Weather;
import flash.events.Event;
/**
* Event class in response to data events from the Yahoo! Weather API.
*
* @langversion ActionScript 3.0
* @playerversion Flash 9
* @author Allen Rabinovich 02/10/07
*/
public class WeatherResultEvent extends Event
{
/**
* True if the event is the result of a successful call,
* False if the call failed
*/
public var success:Boolean;
private var _data:Object;
/**
* The type of event dispatched when Weather data has loaded successfully.
*/
public static const WEATHER_LOADED:String = "weatherLoaded";
/**
* Constructs a new WeatherResultEvent
*/
public function WeatherResultEvent(type:String, inData:Object)
{
_data = inData;
super( type, bubbles, cancelable );
}
//날씨 정보를 가져오는 getter public function get weather():Weather { return _data as Weather; //_ 라는 것이 weather 를 뜻함 }
/**
* Data
*/
public function get data():Object
{
return _data;
}
public function set data( value:Object ):void
{
_data = value;
}
public class WeaterTest extends Sprite
{
public function WeaterTest()
{
super();
//1.객체생성
var weather:WeatherService=new WeatherService //2.데이터가 도착하면 할일
weather.addEventListener(WeatherResultEvent.WEATHER_LOADED, onComplete); //3.데이터 호출
weather.getWeather("KSXX0037","c"); // KSXX0037: 한국에 해당하는 지역코드 , C: 섭씨 온도
}
private function onComplete(e:WeatherResultEvent):void
{
trace(e.data);
}
}
}
// XMLLoader는 XMLLoaderEvent와 연결되어 있다... 라는 것을... 정의해줘야.. 코드힌트에 나온다..
[ Event( name="complete", type="timo.events.XMLLoaderEvent")]
public class XMLLoader extends EventDispatcher
{ // has a 관계 { 위임관계 } URLLoader에게 기능을 위임한다.
private var urlLoader: URLLoader = new URLLoader(); //EventDispatcher를 상속받았기때문에 생기는 괄호안에 있는 초기 내용은 지워준다.
public function XMLLoader()
{
super();
}
public function load( url: String ): void
{
urlLoader.addEventListener( Event.COMPLETE, onComplete );
urlLoader.load( new URLRequest( url ) );
}
private function onComplete( e: Event ): void
{
var evt: XMLLoaderEvent = new XMLLoaderEvent( xml, XMLLoaderEvent.COMPLETE );
this.dispatchEvent( evt );
}
}
}
Package: timo.events / SuperClass: Event
package timo.events
{
import flash.events.Event;
public class XMLLoaderEvent extends Event
{ // 이벤트 타입은 쉽게 읽어올수 있도록 상수로 저장해둔다...!!
public static const COMPLETE: String = "complete";
public var xml: XML;
public function XMLLoaderEvent( xml: XML, type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
this.xml = xml; //위의 생성자(xml:XML)에서 저장한 데이터를 꺼내쓸 수 있도록 하는 것
}
public class XMLLoaderTest2 extends Sprite
{
public function XMLLoaderTest2()
{
super(); // 1. 관리자
var xmlLoader: XMLLoader = new XMLLoader(); // 2. 데이터가 도착하면 할 일
xmlLoader.addEventListener( XMLLoaderEvent.COMPLETE, onComplete ); // 3. 호출
xmlLoader.load( "./sample1.xml" );
//이벤트는 정보와 같다..사건을 보도 받으면 사건발생장소 시간 등등 의 세부내용을 알려줘야 정확한전달이 가능
//e:Event 상태는 "정보 왔어요" 정도의 정보임 세탁다 되었어요 (손에는 세탁물없이 버튼만 )세탁물은 알아서 찾아가세요
//e.target 말하는이 e,currunttarget . 듣는이
//이벤트에는 타입 자리밖에 없다.....다른 요소 들이 들어갈 자리가 없다. 그러므로
// 엑스엠을 쓰려면 이벤트를 엑스엠엘이 들어갈 공간이 있느 ㄴ곳으로 이벤트를 보내면 된다.
//쓰고있는 클라스 전용 이벤트를 만들어준다
//A(나 ) B(중간자)는 C가 가진 데이터를 엑스엠엘로 바꾼다음에 엑스엠엘로더 이벤트로 바꾼 후에 야후라는문자열을 붙여서
//나에게 전달한다.
//클래스.변수/함 static함수 혹은 변수
private var urlLoader:URLLoader=new URLLoader();
public function XMLLoader()
{
super();
}
public function loade(url:String):void
{
urlLoader.addEventListener(Event.COMPLETE, onComplete);
urlLoader.load(new URLRequest(url));
}
private function onComplete(e:Event):void
{
var evt:Event=new Event("yahoo");
this.dispatchEvent(evt);
}
public class XMLLoaderTest1 extends Sprite
{
public function XMLLoaderTest1()
{
super();
var xmlLoader:XMLLoader = new XMLLoader();
xmlLoader.addEventListener("yahoo",onQQQ);
xmlLoader.loade("./sample1.xml");
}
private function onQQQ(e:Event):void
{
trace("data 도착했다고 했죠")
}
}
}
[CH7]에서 다루는 몇가지 Loader 실험에서는 외부 데이터(이미지 혹은 XML)를 읽어들이고 활용하는 과정에서 클래스를 어떻게 제작/활용 하는지를 알아본다.
클래스 설계(제작): 쓰기 편하게 만드는 대표적인 예
(같은 결과를 보여주더라도 일정 부분을 클래스로 제작하여 활용하면 효율성을 증가시킬 수 있다.)
* 동기식 ( Synchronous ) VS 비동기식 ( Asynchronous ) -동기식 (싱크로너스-->싱크로나이징)
싱크로나이징이란 보조를 맞추는 것 즉 호흡을 맞추는 것 :: 호흡을 잘 맞추려면 잘하는 사람이 기다려주는 것이 가장 중요하다.
동기식=기다려준다. (예시..편의점에서의 거스름돈 계산 시에는 과정이 금방 끝날 것을 알고 다른 일을 하지 않은 채 기다려준다 )
-비동기식
기다리지않기 (완전히 기다리지않는 것은 아니다.) 시켜놓고 내 할일을 하다 완료 되면 다시 바라본다.
(예시..세탁소에서는 미리 세탁물을 맡긴 후 다른 곳에서 본인 할일을 하다가 세탁이 완료되면 찾으러 간다 )
-컴퓨터는 동기식일까 비동기식일까?
동기식이다. (매우 빨리 돌아가기 때문에...)
현 액션 이후에 추가 액션이 있더라도 이전 것이 수행/완료될 때까지 기다린다.
function AAA()
{
trace( "aaa" )
BBB();
trace( "bbb" );
}
function BBB()
{
trace( "kkk" );
}
AAA();
aaa = 20;
bbb = 80;
bbb = aaa + 20;
bbb = bbb + 40;
-웹은????!!!!!
과거 jsp 일때는 동기식이었으나
최근 웹2.0의 AJAX( AJAX : Asynchronous Javascript And XML) 형식은 비동기식이다. (자바스크립트를 사용하고 XML을 사용)
-플레시는???!!!
플레시도 기본적으로 동기식으로 동작 그러나"외부와의 연동"은 비동기식으로 동작한다.
XML 가져오기 이미지 가져오기 (즉 네트웍을 탄다고 하면 모두 비동기식이다. )
1.0에서는 무비클립 로더를 이용했어야 했다.
function loadMovie(파일명)
this.width=400
this.height=500
그러나 3.0에서는 아래와 같은 방법으로 비동기식 코딩을 하도록 한다. ======================================= !!!!!!비동기식 코딩방법 (아무리줄여도 3줄) 1.var 객체생성 2.데이터가 도착하면 할일 3.데이터 호출
=======================================
1.LoaderTest 먼저 비동기식 코딩방법을 이용하여 간단하게 외부이미지를 로드 하는 방법을 실험해보자.
(load할 이미지는 img folder를 생성하여 그 안에 "aaa.jpg"이름으로 저장한다.)
외부 이미지를 불러들이는 클래스 :Loader
특징
1. DisplayObjectContainer를 상속받았다..
2. 이벤트 연결은 loader.contentLoaderInfo.addEventListener로 해야 한다..
3. 이미지가 도착하면, Event.COMPLETE 이벤트가 발생한다.
4. 이미지는 Loader.content로 불려진다.. { content를 다른곳에 붙이지 않는다.. }
**test1과 test2의 차이는 this.addChild(loader)를 썼는가 this.addChild(loader.content); 임 해당 설명은 본문에 나와있음
[SWF( width="550", height="400", frameRate="36", backgroundColor="0xEEEEEE")]
public class LoaderTest1 extends Sprite
{
private var loader:Loader=new Loader();
public function LoaderTest1()
{
super(); //1.이미지관리객체만들기 //var loader:Loader=new Loader(); //2.데이터가 도착하면 할일 loader.addEventListener가 아니라 //loader.contentLoaderInfo.addEventListener 예외케이스이므로 무조건 암기
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); //3.이미지호출
loader.load(new URLRequest("./img/aaa.jpg")); //4.화면에 붙이기 addChild(loader);
}
private function onComplete(e:Event):void
{ //이미지의 크기나 위치 등을 변경하려면 이미지가 도착한 이후에 해야한다...!!!!!!!!! //실제 이미지는 loader.contents로 도착한다 !! //loader.width=50; //loader.height=50; //절대로 로더안에 있는 컨텐츠를 다른 곳에 붙이지 않는다. 단 한번만 작동하고 다음 시도때는 작동하지 않는다. //this.addChild(loader.content);
trace( "이미지 도착");
}
}
}
[SWF( width="550", height="400", frameRate="36", backgroundColor="0xEEEEEE")]
public class LoaderTest1 extends Sprite
{
private var loader:Loader=new Loader();
public function LoaderTest1()
{
super(); //1.이미지관리객체만들기 //var loader:Loader=new Loader(); //2.데이터가 도착하면 할일 loader.addEventListener가 아니라 //loader.contentLoaderInfo.addEventListener 예외케이스이므로 무조건 암기
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); //3.이미지호출
loader.load(new URLRequest("./img/aaa.jpg")); //4.화면에 붙이기 //addChild(loader); //이거 쓸 때 this.addChild(loader.content); 를 가려주고 실험하자
}
private function onComplete(e:Event):void
{ //이미지의 크기나 위치 등을 변경하려면 이미지가 도착한 이후에 해야한다...!!!!!!!!! //실제 이미지는 loader.contents 안으로 도착한다 !! //loader.width=50; //loader.height=50; //절대로 로더안에 있는 컨텐츠를 다른 곳에 붙이지 않는다. 단 한번만 작동하고 다음 시도때는 작동하지 않는다.
this.addChild(loader.content); //이것 쓸 때 위에 있는 addChild(loader)가려주자고 실험하자
trace( "이미지 도착");
}
}
}
위와 같이 내장 클라스인 Loader를 사용하는 것이 아닌 ImageLoader라는 새로운 클라스를 만들어 활용 할 수도 있다.'
특정 클라스를 상속을 받는 것보다 해당 클라스를 가지고 있는 것이 활용성에 있어서 유연하기 때문에 별도 전용 클라스를 만들어 쓰는 것이다. 상세 설명은 아래와 같다.
ImageLoader 클래스는 무엇을 상속받을까?
load의 기능이 필요한 경우는 두가지 (소송시 변호사가 되거나 변호사를 고용한다 (전자는 상속 후자는 가지는 것 )
1.loader를 상속 받는다 .... is a 관계 (내가 ~이다 )
2.loader를 하나 가진다 .... has a 관계 (내가 ~을 가진다 )
*******상속은 하나 밖에 못받기 때문에 has a가 더 유연하다 필요에 따라 여러개 가져올 수 있으므로 **********
이에 대한 실험은 ImageLoaderTest와 XMLLoaderTest를 참고하기 바란다.
* 동기식 ( Synchronous ) VS 비동기식 ( Asynchronous )
*** 동기식 : ( 싱크로너스 --> 싱크로나이징 ) :: 호흡을 맞춘다..보조를 맞추는 것 ::: >>> 기다려준다..!!
{동기식 == 기다려주기 }
function onComplete( e: ImageLoaderEvent ): void
{
// 완료...
}
====================
URLLoader:XML;
클래스 설계(제작): 쓰기 편하게 만드는 대표적인 예
*동기식 비동기식
동기식 (싱크로너스-->싱크로나이징)
싱크로나이징이란 보조를 맞추는 것 즉 호흡을 맞추는 것 :: 호흡을 잘 맞추려면 잘하는 사람이 기다려주는 것이 가장 중요하다.
동기식=기다려준다. (택시 편의점 거스름돈 금방끝날 것을 알고 다른 일 안하고 기다려준다 )
비동기식 :기다리지않기 (완전히 기다리지않는 것은 아니다.) 시켜놓고 내할일을 하다가 다 되면 바라본다.
(예..세탁소..세탁물을 맡기고 자기 할일을 하다가 세탁이 모두 되면 찾으러 간다 )
컴퓨터는 동기식일까 비동기실까?
동기식 이다 매우 빨리 돌아가기 때문에...
밑에 액션이 있더라도 이전것이 수행완료될때까지 기다린다.
웹은!!!!!
jsp 일때는 동기식
아이작스: 비동기식 (자바스크립스를 사용하고 엑스엠을 사용)
플레시도 기본적으로 동기식으로 동작
"외부와의 연동"은 비동기식으로 동작한다.
엑스엠엘 가져오기 이미지 가져오기 (네트웍을 탄다고 하면 모두 비동기식 )
1.0에서는 무비클립 로더를 이용했어야 했다.
function loadeMovie(파일명)
this.width=400
this.height=500
=======================================
!!!!!!비동기식 코딩방법 (아무리줄여도 3줄)
1.var 객체생성
2.데이터가 도착하면 할일
3.데이터 호출
외부텍스트 불러오기
var urlLoader:URLLoader=n
=================
로더 클래스 안에 컨텐츠라는 문이 있다.
컨텐츠로 제이피지 등이 들어온다.
로더는 이미지를담은 컨텐츠를 컨테이너로 담아온다.
===========
엑스엠일
var xml....
제정의 해야한다.
뉴 리퀘스트를 쓰지 않고(어려우니깐)스트링을 쓰려면 오버라이드를 펑션 앞에 써준다.
class XMLLoader extends URLloder
class XMLLoader extends ?????????
{
내용
}
오버라이드
접근제한자 바꿀 수 없다 매개변수 타입 개수 발수반환 타입 바꿀 수 없고 내용만 바꿀 수 있다.
그러므로 url:string 을 그대로 쓸 수 없다.