这是AS3的问题。 我有类“addadd”,“Symbol1”(Button1),“Symbol2”(Button2)。 在“addadd”中我有3个功能。函数“StanishevFadd”创建对象并添加事件监听器,函数“stanishevFremove”删除事件监听器和函数“frameDOstanishev”,它将在添加事件时触发。 所以,我显然想要从Symbol1触发事件并从Symbol2停止相同的事件。不幸的是这种方式不起作用。我完全被困惑了。例如,如果我只想从Symbol1添加和删除事件侦听器 - YES有效,但我无法从Symbol1创建事件并从类addadd中的Symbol2中删除相同的事件。请帮帮我们!
public class addadd
{
var stanishev:stanishev_line = new stanishev_line;
public function addadd()
{
}
public function stanishevFadd()
{
Main.display.addChild(stanishev);
stanishev.gotoAndPlay("start");
stanishev.addEventListener(Event.ENTER_FRAME, frameDOstanishev);
}
public function stanishevFremove()
{
stanishev.removeEventListener(Event.ENTER_FRAME, frameDOstanishev);
}
public function frameDOstanishev(e:Event)
{
trace (stanishev.currentFrame);
}
}
// ------------------------------
public class Symbol1 extends SimpleButton
{
var call_creator:addadd = new addadd;
public function Symbol1()
{
// constructor code
addEventListener(MouseEvent.MOUSE_OVER, eventResponse);
}
function eventResponse(e:MouseEvent)
{
call_creator.stanishevFadd();
}
}
// ----------------------
public class Symbol2 extends SimpleButton
{
var call_creator:addadd = new addadd;
public function Symbol2()
{
// constructor code
addEventListener(MouseEvent.MOUSE_DOWN, eventResponse2);
}
function eventResponse2(e:MouseEvent)
{
call_creator.stanishevFremove();
}
}
答案 0 :(得分:1)
我相信你应该可以在不涉及你的主类的情况下封装所有这些行为,并且有很多理由不涉及它,特别是not with static variables就像你正在做的那样。
public class OddView extends Sprite { protected var _btn1:SimpleButton; protected var _btn2:SimpleButton; protected var _stanishev:StanishevLine;//note I changed your Class name to be more in line with AS3 standards public function OddView() { super(); } public function get btn1():SimpleButton { return _btn1; } public function set btn1(value:SimpleButton):void { if (value != _btn1) { if (_btn1) { removeEventListener(MouseEvent.MOUSE_OVER, goToState2); } _btn1 = value; if (_btn1) { _btn1.addEventListener(MouseEvent.MOUSE_OVER, goToState2); } } } public function get btn2():SimpleButton { return _btn2; } public function set btn2(value:SimpleButton):void { if (value != _btn2) { if (_btn2) { removeEventListener(MouseEvent.MOUSE_OVER, goToState1); } _btn2 = value; if (_btn2) { _btn2.addEventListener(MouseEvent.MOUSE_OVER, goToState1); } } } public function get stanishev():StanishevLine { return _stanishev; } public function set stanishev(value:StanishevLine):void { if (value != _stanishev) { if (_stanishev) { cleanUp(null); } _stanishev = value; initStanishev(); } } public function initStanishev():void { if (_stanishev) { _stanishev.visible = true; _stanishev.goToAndPlay('start'); addEventListener(Event.ENTER_FRAME, showStanishevFrame); addEventListener(Event.REMOVED_FROM_STAGE, cleanUp); } } public function goToState1(e:Event) :void { goToAndStop(1); } public function goToState2(e:Event):void { goToAndStop('State2'); } public function showStanishevFrame(e:Event):void { if (stanishev) { trace('current frame', stanishev.currentFrame); } } public function cleanUp(e:Event):void { removeEventListener(Event.ENTER_FRAME, showStanishevFrame); removeEventListener(Event.REMOVED_FROM_STAGE, cleanUp); } }
请注意,我假设您要将OddView应用为库符号的基类。我不包括任何实例化或定位逻辑,因为我倾向于use the stage for those things。
请注意,我检查舞台实例是否存在的原因是,理论上某人可能将OddView指定为基类,而不是在该库符号的舞台上放置btn1,btn2或stanishev。
然而,假设您要通过将btn1,btn2和stanishev放置在您希望它们所在的舞台上来处理这3个项目的视觉部分来编写此类。
另请注意,我强烈怀疑大部分内容完全没必要。很可能只需使用btn1的over状态即可处理大部分内容。但是,这并不能完全说明为什么你只想 删除事件监听器,而在btn2被cicked时不采取任何其他行动。因此,如果没有关于你实际想要完成的事情的真实信息,我就会“过度杀戮”。
有关编辑的说明
注意我在setter中正在做什么 - 如果已经存储了一个值,我们删除那个旧的,传出的,监听器上的监听器。然后,如果传入的值不为null,我们添加新的侦听器。
我仍然怀疑你不需要这么做,但考虑到你提供的信息,这应该有助于指明你正确的方向。
答案 1 :(得分:0)
您可以将stanishev
类中的变量addadd
设为静态变量。但是我不建议这样做,原因之一是你只能有一个stanishev
个实例。希望@Amy Blankenship会告诉你如何完全重新设计你的程序,因为它需要重新设计。这种方法虽然有效,但您还应该向添加和删除eventListeners的函数添加条件,以查看stanishev
是否已经有一个eventlistener或者没有。{/ p>
stanishev
public class addadd
{
public static var stanishev:stanishev_line = new stanishev_line;
public function addadd()
{
}
public function stanishevFadd()
{
Main.display.addChild(stanishev);
stanishev.gotoAndPlay("start");
stanishev.addEventListener(Event.ENTER_FRAME, frameDOstanishev);
}
public function stanishevFremove()
{
stanishev.removeEventListener(Event.ENTER_FRAME, frameDOstanishev);
}
public function frameDOstanishev(e:Event)
{
trace (stanishev.currentFrame);
}
}
public class Symbol1 extends SimpleButton
{
public function Symbol1()
{
// constructor code
addEventListener(MouseEvent.MOUSE_OVER, eventResponse);
}
function eventResponse(e:MouseEvent)
{
addadd.stanishev.stanishevFadd();
}
}