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);
}
}
}
만약 내가 올바르게 이해한다면 - 당신은 문서 클래스에 청취자를 추가하는 것을 말하고 있습니다 - 그러나 나는 실수하지 않는 한, 이벤트가 맨 위 거품을 일으키고 다른 인스턴스를 결코 치지 않기 때문에 소리가 들리지 않습니다. 그 접근법에 문제가 있습니다. 생성 된 모든 버튼 (배열, 인스턴스에 대한 메소드 호출 디스패치 루핑)을 추적해야하고, 찾고있는 자기 인식 방식을 잃어 버리게됩니다. 이 방법은 본질적으로 그룹과 같습니다. 이드는 모든 버튼 관리를 문서 클래스에서 멀리 유지하는 것을 좋아합니다 ... 내가 오해 한 경우, 정교하게 생각해 둡니까? – Beans
문서 클래스가 아니고 스테이지입니다. stage.addEventListener(); 귀하의 버튼 클래스 안에있을 것입니다. – typeoneerror
포레스트 나무에 대한 응? 고맙습니다. 나는 그의 머리 꼭대기에 그들을 찾기 위해서만 안경을 잃어버린 남자를 부끄럽게 느낀다. 각주와 같이 무대 청취자를 추가하면 그룹 및 관리자 방법에 비해 나쁜 형태로 간주됩니까? – Beans