0

阿尔法隐形。

我目前将某些图像上的圆形区域定义为“热点”。例如,我可以在屏幕上显示我的照片并在我的头上覆盖一个圆圈。为了实时检查与我的头部的交互,我将返回Overlaps 并对与圆圈重叠的所有对象进行一些操作。为了调试,我用 alpha 0.5 将圆圈设为黄色,在发布时,我将 alpha 降低到 0,使圆圈不可见(应该如此)。

这会减慢程序的速度吗?是否有另一种方法可以使圆圈本身不可见,同时仍然能够进行交互?是否有某种方法可以在不使用(可能)昂贵的 alpha 0 的情况下将其着色为“不可见”?缓存为位图矩阵?或者其他一些不使用掩码解决“热点”检测的有效方法?

4

2 回答 2

1

只有几个不可见的显示对象不应该减慢它的速度,但有很多可以。我认为一个更简洁的选择可能是只在代码中处理它,而不是在舞台上实际不可见的显示对象。

对于圆,您将定义中心点和半径。然后如果有人点击它,你可以去:

var xDist:Number = circle.x - mousePoint.x;
var yDist:Number = circle.y - mousePoint.y;

if((xDist * xDist) + (yDist * yDist) <= (circle.radius * circle.radius)){
    // mousePoint is within circle
} else {
    // mousePoint is outside of circle
}

如果您坚持使用显示对象来设置这些圆形命中区域(有时在视觉上会更容易,然后通过数字),您还可以编写一些代码来读取这些显示对象(并从渲染中删除它们)以获取它们的位置和半径大小。


添加方法:

// inputX and inputY are the hotspot's x and y positions, and inputRadius is the radius of the hotspot
function hitTestObj(inputA:DisplayObject, inputX:int, inputY:int, inputRadius:int):Boolean {
    var xDist:Number = inputX - inputA.x;
    var yDist:Number = inputY - inputA.y;
    var minDist:Number = inputRadius + (inputA.width / 2);
    return (((xDist * xDist) + (yDist * yDist)) =< (minDist * minDist))
}
于 2012-11-09T03:32:38.330 回答
0

就渲染而言,alpha=0 并不是那么昂贵,因为 Flash 播放器会对此进行优化(查看此处查看实际数据)。位图缓存不会有任何帮助,因为精灵是不可见的。还有其他方法可以通过自己进行数学运算来执行碰撞检测(在具有数十甚至数百个精灵的游戏中更相关),但在您的情况下这将是过度杀伤力。

于 2012-11-09T03:57:33.720 回答