ActionScript 3
이벤트 작업
수색…
비고
이벤트는 프로그램이 만들고 교환하고 대응할 수있는 데이터 조각입니다. 비동기 이벤트 흐름은 마우스 움직임 또는 다른 프레임이 표시되는 것과 같은 외부 이벤트에 대한 반응으로 Flash 엔진에서 표시 목록을 통해 전달됩니다. 다른 모든 이벤트 흐름과 모든 이벤트 처리는 동기식이므로 코드 조각이 이벤트를 생성하면 코드의 다음 줄이 실행되기 전에 모든 반응이 처리됩니다. 또한 여러 이벤트 리스너가있는 경우 모두 처리됩니다. 다음 이벤트가 처리 될 수 있기 전에 실행되었을 것입니다.
플래시 프로그래밍과 관련된 몇 가지 주요 이벤트가 있습니다. Event.ENTER_FRAME
은 Flash에서 다른 프레임을 그리기 전에 생성되며, 전체 표시 목록에 그려 지도록 신호를 보내고 동기 타이머로 사용할 수 있습니다. MouseEvent.CLICK
및 그 형제는 사용자로부터 마우스 입력을받는 데 사용할 수 있으며 TouchEvent.TOUCH_TAP
는 터치 스크린의 아날로그입니다. KeyboardEvent.KEY_DOWN
및 KEY_UP
은 키보드에서 사용자 입력을받는 것을 의미하지만 실제 키보드가없는 장치로 인해 모바일 부서에서의 사용은 거의 불가능합니다. 마지막으로 Event.ADDED_TO_STAGE
는 표시 객체가 스테이지에 대한 액세스를 받으면 전달되고 표시 목록을 위아래로 움직일 수있는 전체 이벤트를받는 전역 표시 목록에 포함됩니다.
Flash의 대부분의 이벤트는 구성 요소마다 다릅니다. Flash 이벤트를 사용할 자체 구성 요소를 디자인하는 경우 flash.events.Event
자손 클래스와 정적 String
속성을 사용하여 구성 요소의 이벤트 세트를 만듭니다.
이벤트 데이터가있는 사용자 정의 이벤트
package
{
import flash.events.Event;
public class CustomEvent extends Event
{
public static const START:String = "START";
public static const STOP:String = "STOP";
public var data:*;
public function CustomEvent(type:String, data:*,
bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
if (data)
this.data = data;
}
}
}
맞춤 이벤트를 전달하려면 다음 단계를 따르세요.
var dataObject:Object = {name: "Example Data"};
dispatchEvent(new CustomEvent(CustomEvent.START, dataObject))
맞춤 이벤트를 수신하려면 다음 단계를 따르세요.
addEventListener(CustomEvent.STOP, stopHandler);
function stopHandler(event:CustomEvent):void
{
var dataObject:* = event.data;
}
표시 목록에서 이벤트 처리
package {
import flash.events.EventDispatcher;
public class AbstractDispatcher extends EventDispatcher {
public function AbstractDispatcher(target:IEventDispatcher = null) {
super(target);
}
}
}
인스턴스에 이벤트를 전달하는 방법은 다음과 같습니다.
var dispatcher:AbstractDispatcher = new AbstractDispatcher();
dispatcher.dispatchEvent(new Event(Event.CHANGE));
인스턴스에서 이벤트를 수신하려면 다음을 수행하십시오.
var dispatcher:AbstractDispatcher = new AbstractDispatcher();
dispatcher.addEventListener(Event.CHANGE, changeHandler);
function changeHandler(event:Event):void
{
}
기본 이벤트 처리
Flash는 대부분의 객체에 대해 Events
를 전달합니다. 가장 기본적인 이벤트 중 하나는 ENTER_FRAME
으로 모든 표시 목록 객체에 (SWF의 프레임 속도에서) 전달됩니다.
import flash.display.Sprite;
import flash.events.Event;
var s:Sprite = new Sprite();
s.addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(e:Event)
{
trace("I am called on every frame !");
}
이 함수는 모든 프레임에서 비동기 적으로 호출됩니다. 즉, onEnterFrame
이벤트 핸들러로 지정한 함수는 영향을받는 프레임에 첨부 된 다른 ActionScript 코드보다 먼저 처리됩니다.
나만의 이벤트 추가
Event
클래스를 확장하여 고유 한 이벤트를 만들고 전달할 수 있습니다.
import flash.events.Event;
class MyEvent extends Event
{
var data: String;
static public var MY_EVENT_TYPE = "my_event_my_event_code";
public function MyEvent(type: String, data: String)
{
this.data = data;
}
override public function clone():Event
{
return new MyEvent(type, data);
}
}
그런 다음 EventDispatcher
사용하여 EventDispatcher
를 디스패치하고 청취 할 수 있습니다. 대부분의 플래시 객체는 이벤트 디스패처입니다.
import flash.events.EventDispatcher;
var d = new EventDispatcher();
d.addEventListener(MyEvent.MY_EVENT_TYPE, onType);
function onType(e: MyEvent)
{
trace("I have a string: "+e.data);
}
d.dispatchEvent(new MyEvent(MyEvent.MY_EVENT_TYPE, "Hello events!"));
이벤트를 재발송하려면 clone
방법이 필요합니다.
간단한 마우스 이벤트 구조
event types
을 사용하면 많은 이벤트 처리 함수를 정의하는 대신 1 개의 함수로 이벤트를 필터링하여 스테이지의 많은 객체에 대한 이벤트를 정의 할 때 자주 발생하는 코드 팽창을 쉽게 줄일 수 있습니다.
무대에 object1
, object2
... object10
이라는 10 개의 객체가 있다고 상상해보십시오.
당신은 다음을 할 수 있습니다 :
var i: int = 1;
while(getChildByName("object"+i) != null){
var obj = getChildByName("object"+i)
obj.addEventListener(MouseEvent.CLICK, ObjectMouseEventHandler);
obj.addEventListener(MouseEvent.MOUSE_OVER, ObjectMouseEventHandler);
obj.addEventListener(MouseEvent.MOUSE_OUT, ObjectMouseEventHandler);
obj.alpha = 0.75;
i++;
}
function ObjectMouseEventHandler(evt:Event)
{
if(evt.type == "click")
{
trace(evt.currentTarget + " has been clicked");
}
else
{
evt.currentTarget.alpha = evt.type == "mouseOver" ? 1 : 0.75;
}
}
이 방법의 이점은 다음과 같습니다.
- 이벤트를 적용 할 객체의 양을 지정할 필요가 없습니다.
- 어떤 객체가 상호 작용했는지 구체적으로 알 필요는 없지만 여전히 기능을 적용합니다.
- 대량으로 이벤트를 쉽게 적용 할 수 있습니다.