AS3中不可见的,可交互的对象 - 如何编码高效的隐身?

时间:2012-11-09 02:55:21

标签: performance actionscript-3 optimization rendering alpha

Alpha隐身。

我目前将某些图像上的圆形区域定义为“热点”。例如,我可以将我的照片放在屏幕上并在我的头上叠加一个圆圈。为了实时检查与我的头部的交互,我会返回Overver并对与圆重叠的所有对象进行一些操作。为了进行调试,我将圆圈设为黄色,使用alpha 0.5,对于释放,我将alpha减小为0,使圆圈不可见(因为它应该是)。

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

2 个答案:

答案 0 :(得分: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))
}

答案 1 :(得分:0)

alpha = 0在渲染方面并不是那么昂贵,因为Flash播放器会优化渲染(检查here实际数字)。由于精灵是不可见的,因此位图缓存不会有任何帮助。还有其他方法可以通过自己进行数学运算来进行碰撞检测(在具有数十甚至数百个精灵的游戏中更相关)但这对你的情况来说太过分了。