2010-02-15 2 views
1

as3 리스너 및 클래스의 인스턴스와 관련하여 질문이 있습니다.객체 인스턴스 전체의 AS3 리스너 - 가능/좋음 또는 좋지 않음?

주요 질문 : 다른 버튼 인스턴스가

(문서 클래스의 청취자를 필요로하지 않고)들을 수있는 방식으로 버튼 인스턴스에서 이벤트를 전달하는 방법이 내가 말할 수 있습니다 문서 클래스와 버튼 클래스가 있어야합니다. 문서에는 표시 목록에 추가 된 버튼 클래스의 여러 인스턴스가 있습니다. 버튼이 선택되면 set 메소드가 호출되어 selected의 패키지 변수를 해당 인스턴스로 설정합니다. 그것은 여기에서 모든 다른 인스턴스를 알리기 위해 이벤트를 파견하고 싶습니다.

|document 
|-button instance 1 
|-button instance 2 
|-button instance 3 (i want to send an event directly to instance 1 and 2...) 

현재 해결 방법은 버튼을 인스턴스화 한 buttonGroup 클래스를 만드는 것이고 버튼은 그룹 부모에게 이벤트 호출을 보냅니다. 적어도 내가 여러 그룹이 있다면 그리고 난 .. 그럼 내가이 그룹을 추적하기 위해 buttonManager 클래스를 필요 그룹 인스턴스의 모든 이벤트를 보내려는 (또는 -

|document 
|-button group (catch the event and send an event to all instances within the group) 
|---button instance 1 
|---button instance 2 
|---button instance 3 (dispatch the event) 

하지만 내 문제는 남아 사실 내 솔루션은 좋은 방법이 있다면 거기에 다른 방법 경우, 또는이 내가 그것을 이해하는 방법이다?)

|document 
|-button manager (catch the event and send an event to all group instances) 
| 
|---button group 1 
|-----button instance 1 
|-----button instance 2 
|-----button instance 3 (dispatch the event) 
| 
|---button group 2 
|-----button instance 1 
|-----button instance 2 
|-----button instance 3 (dispatch the event) 

나는이 "솔루션"에 불리한 아니다, 난 그냥 궁금합니다. 내 코드의 기초가 아래에 있습니다 (버튼 관리자 및 그룹 수업 빼기)

나는 이것이 충분히 설명력이 있었으면 좋겠다. 친절히, 나는 OOP를 처음 사용하기를 희망합니다. 미리 감사드립니다.

document.as

import flash.display.*; 
import flash.events.*; 
import myClasses.events.ButtonEvent; 

public class Document extends MovieClip {  

    public function Document(){ 
     trace("initialising Document..."); 
     addEventListener(Event.ADDED_TO_STAGE, popStageVars);   
    } 


    private function popStageVars(e:Event){ 
     trace("popping stage vars...") 

     var ob1:AbstractOBJ = new AbstractOBJ   
     var ob2:AbstractOBJ = new AbstractOBJ   
     var ob3:AbstractOBJ = new AbstractOBJ 

     addChild(ob1) 
     addChild(ob2) 
     addChild(ob3) 


     ob1.selected = ob1 
     ob2.selected = ob2 
     ob3.selected = ob3 

    }  

} 

버튼 클래스

:

import flash.display.*; 
import flash.events.*; 
import myClasses.events.ButtonEvent; 

public class ButtonOBJ extends MovieClip implements IEventDispatcher { 

    internal static var _selected:Object = null 

    public function ButtonOBJ(){ 
     trace("initialising ButtonOBJ...");   
     addEventListener(Event.ADDED_TO_STAGE, popStageVars); 
     addEventListener(AbstractEvent.SET_CUR, checkClip); 
    } 


    private function popStageVars(e:Event){ 
     trace("popping stage vars..." + this.name) 
    }  

    private function checkClip(e:AbstractEvent){ 
     trace("checking button registered... " + this.name) 
    } 

    public function get selected():Object{ 
     return _selected       
    } 

    public function set selected(s:Object):void{ 
     var sName:String 

     if(selected != null){ 
      sName = selected.name 
     }else{ 
      sName = null 
     } 

     trace(this.name + " is changing the current selected from: " + sName + " - to: " + s.name)   

     _selected = s 
     dispatchEvent(new AbstractEvent(AbstractEvent.SET_CUR, true)); 
    }  

} 

또한 buttonEvent :

package myClasses.events{  

import flash.events.Event; 

public class ButtonEvent extends Event { 

    public static const SET_CUR:String = "setSelected"; 
    public static const VERSION:Number = 1.0; 

    public function ButtonEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) {   
     super(type, bubbles, cancelable); 
    } 

    public override function clone():Event { 
     return new ButtonEvent(this.type, this.bubbles, this.cancelable); 
    } 

} 
} 

답변

1

귀하의 버튼 클래스 무대에 리스너를 추가 할 수 있습니다. 이벤트가 거품을 일으키면 이벤트가 대상에 의해 발사되면 무대 위로 거품이 생깁니다. 버튼이 이벤트를 "듣고"응답합니다. 나는 보통 당신이하는 일을하고 그룹에 리스너를 추가합니다. 그런 다음 이벤트가 수신되면 버튼을 반복하고 event.target이 루프의 현재 버튼과 동일하면 "selected"를 설정합니다.

+0

만약 내가 올바르게 이해한다면 - 당신은 문서 클래스에 청취자를 추가하는 것을 말하고 있습니다 - 그러나 나는 실수하지 않는 한, 이벤트가 맨 위 거품을 일으키고 다른 인스턴스를 결코 치지 않기 때문에 소리가 들리지 않습니다. 그 접근법에 문제가 있습니다. 생성 된 모든 버튼 (배열, 인스턴스에 대한 메소드 호출 디스패치 루핑)을 추적해야하고, 찾고있는 자기 인식 방식을 잃어 버리게됩니다. 이 방법은 본질적으로 그룹과 같습니다. 이드는 모든 버튼 관리를 문서 클래스에서 멀리 유지하는 것을 좋아합니다 ... 내가 오해 한 경우, 정교하게 생각해 둡니까? – Beans

+0

문서 클래스가 아니고 스테이지입니다. stage.addEventListener(); 귀하의 버튼 클래스 안에있을 것입니다. – typeoneerror

+0

포레스트 나무에 대한 응? 고맙습니다. 나는 그의 머리 꼭대기에 그들을 찾기 위해서만 안경을 잃어버린 남자를 부끄럽게 느낀다. 각주와 같이 무대 청취자를 추가하면 그룹 및 관리자 방법에 비해 나쁜 형태로 간주됩니까? – Beans

0

또한 비교적 최근에 AS3에 새로 도입되었지만 최근에 이벤트 리스너와 많은 관계를 맺어 왔습니다. 스테이지에 이벤트 리스너를 추가하는 문제는 해당 이벤트가 스테이지에 도달 할 때마다 발생하는 것입니다. 또한 이벤트 리스너가 클래스의 일부이고 해당 클래스의 인스턴스를 10 개 추가하면 이제 스테이지에서 동일한 작업을 수행하는 10 개의 이벤트 리스너가 생겨서 모두 실행됩니다. 차별화 (AKA 각 버튼이 다른 기능을 수행하는 경우)를 원한다면 어쨌든 반복해야하고 무대에 추가하려는 모든 목적을 저지해야합니다.

내가 수행 한 작업은 저수준 객체의 사용자 정의 이벤트 이외의 이벤트 리스너를 사용하지 않는 것입니다. 버튼을 클릭했을 때 다른 일을하고 싶은 버튼이 3 개 있다고 가정 해 봅시다. 글쎄요, 전혀 나타나기 위해서 그들은 무언가의 아이들로 추가되어야 할 것입니다, 그렇죠?부모가 무엇이든 상관없이 하나의 이벤트 리스너를 추가 한 다음 부모로부터 발생시키고 싶은 함수를 호출합니다. 그래서 같이 :

:

public class ParentObject extends Sprite{ 
    public ParentObject(){ 
     addchild(new ButtonObject1()); 
     addchild(new ButtonObject2()); 
     addchild(new ButtonObject3()); 
     addEventListener(MouseEvent.CLICK, doButtonThing); 
    } 

    private doButtonThing(e:MouseEvent):void{ 
     if(e.target is ButtonObject){ 
      e.target.doStuff(); 
     } 
    } 
} 

public ButtonObject1 extends ButtonObject{ //This works for 2 and 3. Also note that all three objects extend a parent class called ButtonObject. This is useful in checking the event target. 
    public ButtonObject1(){ 
     //Create the Object here. 
    } 

    public doStuff():void{ 
     //Whatever you want the button to do 
    } 

} 무언가를 클릭하면

, 부모 객체가 이벤트를 잡을 것입니다 (참고 이것은 실제 코드보다 더 많은 의사입니다). 그런 다음 클릭 된 객체가 ButtonObject (1, 2 또는 3 중 하나인지, 단추가 아닌 경우 발사하기를 원하지 않는지 여부)를 확인합니다. 그럴 경우 클릭 한 객체에서 doStuff 함수를 호출하고 다른 객체에서는 doStuff 함수를 호출하지 않습니다. 객체를 찾기 위해 event.target을 사용하기 때문에 명시 적으로 추적 할 필요가 없습니다. 한 번에 모든 단추가 실행되는 것을 방지하고 물론 모든 단추가 다른 작업을 수행 할 수 있습니다.