是否可以从一个类访问另一个类的事件处理程序,如果可以,如何?我想从对象中删除一个事件处理程序。我有两个对象说objectA和objectB。在objectA中如何删除objectB的事件处理程序。这是我尝试过的,但它不起作用。
MovieClip(root).objectB.removeEventListener(MouseEvent.CLICK, ready);
详细信息:
我有两个名为Guest和Guest2的类。我想知道是否可以从Guest2类中删除Guest类中的eventlistener。以下是完整的代码。注意:两个类都具有完全相同的代码
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.filters.*;
public class Guest extends MovieClip
{
var walkSpeed:Number = 5;
var oldPosX;
var oldPosY;
var myGlow:GlowFilter = new GlowFilter();
public function Guest()
{
addEventListener(MouseEvent.MOUSE_OVER, addGlow);
}
function addGlow(event:MouseEvent):void
{
filters = [myGlow];
addEventListener(MouseEvent.MOUSE_OUT, removeGlow);
addEventListener(MouseEvent.CLICK, ready);
}
function removeGlow(event:MouseEvent):void
{
filters = [];
}
function ready(event:MouseEvent):void
{
filters = [myGlow];
stage.addEventListener(MouseEvent.MOUSE_DOWN, walk);
removeEventListener(MouseEvent.MOUSE_OUT, removeGlow);
**MovieClip(root).Guest02.addEventListener(MouseEvent.CLICK, walkTo);**
}
function walk(event:MouseEvent):void
{
oldPosX = parent.mouseX;
oldPosY = parent.mouseY;
rotation = Math.atan2(oldPosY - y,oldPosX - x) / Math.PI * 180;
filters = [];
stage.removeEventListener(MouseEvent.MOUSE_DOWN, walk);
stage.addEventListener(Event.ENTER_FRAME, loop);
}
function loop(event:Event):void
{
var dx:Number = oldPosX - x;
var dy:Number = oldPosY - y;
var distance:Number = Math.sqrt((dx*dx)+(dy*dy));
if (distance<walkSpeed)
{
// if you are near the target, snap to it
x = oldPosX;
y = oldPosY;
removeEventListener(Event.ENTER_FRAME, loop);
}
else
{
x = x+Math.cos(rotation/180*Math.PI)*walkSpeed;
y = y+Math.sin(rotation/180*Math.PI)*walkSpeed;
}
}
**function walkTo(event:MouseEvent):void
{
_Guest02.removeEventListener(MouseEvent.CLICK, ready);
}**
}
}
答案 0 :(得分:0)
在objectA中你应该能够写:
objectB.removeEventListener(MouseEvent.CLICK, ready);
您遇到的问题似乎是您无法获得对objectB的引用。我猜这是因为你试图用“root”获取引用的方式。我建议在objectA的构造函数中传递对objectB的引用。
private var _objectB : ObjectB;
public class ObjectA( objectBRef : ObjectB )
{
_objectB = objectBRef;
}
然后在需要的时候做:
_objectB.removeEventListener(MouseEvent.CLICK, ready);
如果您仍然迷路,请发布更多代码。整个objectA和objectB类都会有所帮助。
修改强>
在看到您的新细节之后,我认为您需要重新考虑如何创建和管理访客的方法。拥有两个具有相同代码的类通常是个坏主意。在我看来,guest类以外的东西应该处理添加和删除事件处理程序,创建guest的东西可能是一个很好的起点。
答案 1 :(得分:0)
注意强>
没有两个类应该具有完全相同的代码!
它完全没有达到课程和目的的目的。对象。
无论如何,如果代码确实不同,请努力在代码中实现继承。
<强>答案强>
向班级添加一项功能&amp;叫它,让它删除它自己的监听器。类似的东西:
public function removeListeners () {
this.removeEventListener(MouseEvent.CLICK, ready);
}
并将其命名为:
objectB.removeListeners();