Alpha隐身。
我目前将某些图像上的圆形区域定义为“热点”。例如,我可以将我的照片放在屏幕上并在我的头上叠加一个圆圈。为了实时检查与我的头部的交互,我会返回Overver并对与圆重叠的所有对象进行一些操作。为了进行调试,我将圆圈设为黄色,使用alpha 0.5,对于释放,我将alpha减小为0,使圆圈不可见(因为它应该是)。
这会减慢程序的速度吗?还有另一种方法可以使圆圈本身不可见,同时仍然能够进行交互吗?是否有某种方法可以在不使用(可能)昂贵的0的α值的情况下将其“隐形”着色?缓存为位图矩阵?或者其他一些有效的方法来解决“热点”检测而不使用掩模?
答案 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实际数字)。由于精灵是不可见的,因此位图缓存不会有任何帮助。还有其他方法可以通过自己进行数学运算来进行碰撞检测(在具有数十甚至数百个精灵的游戏中更相关)但这对你的情况来说太过分了。