【发布时间】:2011-03-24 08:40:52
【问题描述】:
所以我正在对一些重的东西进行位图以尝试降低根据 FlashBuilder 的配置文件相当高的 [pre-render] 和 [render]。我认为这一切进展顺利,直到我意识到一旦将 MovieClip 更改为位图,就会失去鼠标移动事件(Over、Out、Move...)的基于像素的精度,你剩下的就是位图的整个边界框,这是不太理想的。我有一个游戏,其中许多位图资产将在一个场景中,在舞台上,以各种方式排列,并且需要在每个之间移动像素精度,并且已经用尽了我的努力来实现与正常情况一样,位图人的鼠标移动结果相同。
http://seadersforums.appspot.com/static/bitmaps.fla 是一个显示此操作的 FLA,您可以在此处查看它的工作原理 http://seadersforums.appspot.com/static/bitmaps.html 。当它加载时,舞台上的两个项目都是绘制的形状,封装在 MovieClips 中,如果你将鼠标悬停在它们上面,它们都会发光。如果你完全点击舞台,紫色的家伙会变成一个位图,现在,他的“命中区域”,当涉及到 MouseEvents 时,就是他的整个边界框,你只能通过边缘裂片处的后面绿色项目.
我也在跟踪鼠标所在的像素,所以我可以清楚地知道鼠标何时在透明区域上,它是 0,但是我如何告诉事件沿着链向下转发到绿色影片剪辑?
以下是它现在对我来说非常有效的方式,
var bitmap:Bitmap = this['bitmap'];
var shouldMouseOver:Boolean = bitmap.bitmapData.getPixel(event.localX - bitmap.x, event.localY - bitmap.y);
if(shouldMouseOver)
{
this.mouseOver();
}
else {
this.mouseEnabled = false;
var point:Point = new Point(event.stageX, event.stageY);
for each(var other:DisplayObject in _topContainer.getObjectsUnderPoint(_topContainer.globalToLocal(point)))
{
if(other.mouseEnabled)
{
point = other.globalToLocal(point);
other.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_MOVE, false, false, point.x, point.y));
break;
}
}
this.mouseEnabled = true;
}
我为我的项目关闭了 mouseEnabled,当我知道它是错误的时,然后我搜索另一个符合要求的项目,如果有,则向该项目发送一个事件并中断。如果那个也错了,它会再次做同样的事情,但每次都会让自己脱离循环。
这确实完全按照我的意愿工作,但我总是更喜欢保留 globalToLocal 和循环之类的东西,并从数组中读取不经常更新的方法,例如 MOUSE_MOVE 的侦听器。有没有更有效的方法来做到这一点?
【问题讨论】:
-
它被称为冒泡,它是事件流的重要组成部分。更多在这里:help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/…
-
实际上我不相信冒泡会到达调度程序下方的剪辑。据我了解,当冒泡事件时,它从调度程序的深度传播到显示列表的顶部(根/阶段),然后返回到调度程序,不确定它是否到达下面的任何内容。我可能是错的,但我对此表示怀疑,因为如果不是这种情况,那么每个冒泡事件都会遍历整个显示列表,这可能会破坏更大应用程序的性能。我想一个简单的测试是为了。
标签: flash actionscript-3 bitmap