过滤问题:sprite不再调度MouseEvents

时间:2011-05-30 23:29:45

标签: actionscript-3 filter mouseevent sprite

我正在处理一个非常简单的问题:将一个BevelFilter应用于精灵后,它似乎不再调度MouseEvents。我试图重新启用buttonMode,但没有运气。我错过了一些非常基本的东西,或者这是一个Flash bug吗?它也会出现在DropShadowFilter中。

编辑:这是一些代码。似乎问题来自于面具和过滤器的组合:

        var s:Sprite = new Sprite();
        s.graphics.beginFill(0xff0000,1);
        s.graphics.drawRect(0,0,50,50);
        s.buttonMode = true;
        s.addEventListener(MouseEvent.CLICK, onClick);
        this.addChild(s);
        s.x = s.y = 100;
        var m:Sprite = new Sprite();
        m.graphics.beginFill(0,1);
        m.graphics.drawRect(0,0,50,50);
        s.addChild(m);

        // comment one of these two lines out and it works
        s.filters = [new BevelFilter()];
        s.mask = m;

我试图将mask的mouseChildren,mouseEnabled和buttonMode设置为true,但没有结果。谢谢!

3 个答案:

答案 0 :(得分:3)

我尝试运行您的代码并获得相同的结果。奇怪。

无论如何,我能够通过创建一个“容器”精灵并在那里应用过滤器来使其工作:

var c:Sprite = new Sprite();
this.addChild(c);

var s:Sprite = new Sprite();
s.graphics.beginFill(0xff0000,1);
s.graphics.drawRect(0,0,50,50);
s.buttonMode = true;
s.addEventListener(MouseEvent.CLICK, onClick);
c.addChild(s);
s.x = s.y = 100;
var m:Sprite = new Sprite();
m.graphics.beginFill(0,1);
m.graphics.drawRect(0,0,50,50);
s.addChild(m);

c.filters = [new BevelFilter()];
s.mask = m;

该解决方案是否适用于您的情况?

答案 1 :(得分:0)

如果没有代码,很难确切地说出问题所在。但是设置:

mouseChildren = false;

至少可以消除一些潜在的问题。

我不相信它与BevelFilter直接相关,你是否只能删除BevelFilter并调度MouseEvents?如果是这样的话,我会感到惊讶。

要检查的另一件事 - eventListener设置在哪里?是否有可能以某种方式在实际情况下不添加eventListener?

除了没有代码的理论之外,真的很难做任何事情。

答案 2 :(得分:0)

问题在于,您要将遮罩添加为您要遮罩的对象的子对象,而不是将遮罩设置为原始对象所在的位置。这是固定代码:

import flash.events.MouseEvent;

var s:Sprite = new Sprite();
s.graphics.beginFill(0xff0000,1);
s.graphics.drawRect(0,0,50,50);
s.buttonMode = true;
s.addEventListener(MouseEvent.CLICK, onClick);
this.addChild(s);
s.x = s.y = 100;
var m:Sprite = new Sprite();
m.graphics.beginFill(0,1);
m.graphics.drawRect(0,0,50,50);
m.x = m.y = 100;
this.addChild(m);

// comment one of these two lines out and it works
s.filters = [new BevelFilter()];
s.mask = m;

function onClick(e:MouseEvent):void
{
    trace('clicked');
}