0

我对 ROLL_OVER 事件侦听器有疑问。当我使用鼠标光标进入带有动画剪辑的空白区域时,会触发 ROLL_OVER 事件。但我希望只有当鼠标光标位于彩色区域时才触发该事件。

为了更清楚:考虑“O”字母,当鼠标光标位于O字母的空白区域(O内部)之间时,不应触发事件。只有当鼠标光标位于黑色区域时才会触发。

我该如何实施?

谢谢

-奥赞

感谢@Ethan Kennerly 解决了问题

我只是想添加一些东西来帮助人们遇到和我一样的问题。在我的情况下,当我的鼠标悬停在大陆上时,我试图让大陆发光。我使用 ROLL_OVER/MOUSE_OVER 事件监听器来检查我的鼠标是否在它们上方。但是根据 Ethan Kennerly 给出的数据,我提出了另一种方法。在 Ethan Kennerly 的解决方案中,如果您的鼠标从透明区域进入大陆区域,它不会产生模糊效果,因为 ROLL_OVER 和 MOUSE_OVER 事件侦听器每次进入只会触发一次,所以我在每个大陆影片剪辑上使用了 MOUSE_MOVE 事件侦听器。对于这个声明:

if (isPixelTransparent(DisplayObject(event.currentTarget), new Point(stage.mouseX, stage.mouseY)) {
    return;
}

添加“ROLL_OUT 或 MOUSE_OUT”事件侦听器函数中的任何内容,将它们全部添加到此语句中。但不要删除 ROLL_OUT 或 MOUSE_OUT 函数。

4

2 回答 2

2

听起来影片剪辑包含一个具有透明像素的形状。透明像素响应鼠标悬停和翻转。如果您可以绘制没有透明像素形状的矢量图形,则鼠标将忽略影片剪辑边界框中的空白区域。

然而,听起来您需要使用透明像素,并且您希望鼠标忽略它们,因此您可以像这样进行保护:

private function onRollOver(event:MouseEvent):void
{
    if (isPixelTransparent(DisplayObject(event.currentTarget), new Point(stage.mouseX, stage.mouseY)) {
        return;
    }
    // respond to roll over.
}

为了检测透明度,Miguel Santirso 在此处渲染像素并转换坐标空间:http: //sourcecookbook.com/en/recipes/97/check-if-a-pixel-is-transparent-in-a-displayobject (行除外38 在我的计算机上看起来像“rect”被渲染为“ct”)。您可以通过仅绘制有问题的像素而不是整个图像来优化该代码,并检查该像素值 (getPixel32) 是否为 0,而不是调用 hitTest。我会像这样优化 Miguel 的代码:

    public static function isPixelTransparent(objectOnStage:DisplayObject, globalPoint:Point):Boolean
    {
        var local:Point = objectOnStage.globalToLocal(globalPoint);
        var matrix:Matrix = new Matrix();
        matrix.translate(-local.x, -local.y); 
        var data:BitmapData = new BitmapData(1, 1, true, 0x00000000);
        data.draw(object, matrix);
        return 0x00000000 == data.getPixel32(0, 0);
    }

顺便说一句,如果您的所有影片剪辑都具有相同的命中测试形状,您可以创建一个单独的透明形状来监听翻转。当图像是更复杂的形状(如中间没有任何东西的 X 或 O)时,我使用透明形状来定义自定义的命中测试形状,该形状是一致且简单的形状(如圆形)。自定义命中测试形状是具有透明形状的 Sprite。精灵听翻滚。如果您的影片剪辑在后面的帧上创建了改变影片剪辑轮廓的新形状,则单独的鼠标侦听器形状也很有用。

于 2013-10-06T01:47:13.763 回答
1

最简单的解决方案是使用 Moses 的 Interactive PNG 类。

http://blog.mosessupposes.com/?p=40

通常,PNG 的透明区域被视为实心区域,这在处理大量相互重叠的图像时尤其令人沮丧,因为它们往往会阻止鼠标在其下方剪辑上的交互。

此实用程序修复了该问题,以便在您碰到实心像素或除完全透明之外的任何透明度值的像素之前不会发生鼠标事件。InteractivePNG 允许您设置 alphaTolerance 级别来确定哪个透明度级别将注册为命中。

于 2013-10-06T02:57:32.030 回答