我在ROLL_OVER事件监听器方面遇到了问题。当我使用带鼠标光标的动画片段进入空白区域时,会触发ROLL_OVER事件。但我希望只有当鼠标光标位于彩色区域时才触发该事件。
更明确:想想“O”字母,当鼠标光标位于O字母的空白区域(O内)时,事件不应该触发。只有当鼠标光标在黑色区域时才会触发。
我该如何实现?
由于
-Ozan
问题是由@Ethan Kennerly解决的
我只想添加一些东西来帮助人们和我一样有问题。在我的情况下,当我的鼠标在他们身上时,我试图让大陆发光。我使用ROLL_OVER / MOUSE_OVER eventlistener来检查我的鼠标是否在它们之上。但是根据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”eventlistener函数中的任何内容,在此语句中添加所有这些内容。但是不要删除ROLL_OUT或MOUSE_OUT函数。
答案 0 :(得分: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。精灵监听翻转。如果您的影片剪辑在以后的帧上创建可以改变影片剪辑轮廓的新形状,则单独的鼠标侦听器形状也很有用。
答案 1 :(得分:1)
最简单的解决方案是使用摩西的交互式PNG课程。
http://blog.mosessupposes.com/?p=40
通常情况下,PNG的清晰区域被视为实体,这在处理大量彼此重叠的图像时尤其令人沮丧,因为它们会阻碍鼠标在其下方的剪辑上的交互。
此实用程序修复了该问题,以便在您之前不会发生鼠标事件 撞击实心像素或任何透明度值的像素 除了完全清楚。 InteractivePNG允许您设置alphaTolerance 等级,以确定将注册为命中的透明度级别。