我已经有一段时间在尝试找到一种高效的方法来确定某物是否在另一个物体的视线范围内。一个很好的例子是,如果一个球体能看到你,它就会向你发射火箭 - 但如果你在墙后面,它显然不会。
以下是我通常处理这个问题的方法:
function cast(end:GameObject, walls:Array, accuracy:uint=10):Object
{
var xp:Number = skin.x;
var yp:Number = skin.y;
var ang:Number = Math.atan2(end.skin.y - yp, end.skin.x - xp);
var xvel:Number = Math.cos(ang)*accuracy;
var yvel:Number = Math.sin(ang)*accuracy;
var i:uint = 0;
for(i; i<800/accuracy; i+=accuracy)
{
xp += xvel;
yp += yvel;
var j:GameObject;
for each(j in walls)
{
if(j.skin.hitTestPoint(xp, yp))
return {visible:false, x:xp, y:yp};
}
}
return {visible:true};
}
使用这个的基本方式是:
var sight:Object = cast(player, impassable);
if(sight.visible) trace('can see');
else trace('cant see - collision at ' + sight.x + ", " + sight.y);
这样做可以工作,但随着每个新火箭的添加或不可通过物体数量的增加,速度会变得极慢。
我认为有一种非常简单高效的方法,但我可能遗漏了什么 - 我是说,所有游戏都可以做到(如暗黑破坏神等),即使有成百上千的敌人,除非你可见,否则它们不会做任何事情。
有什么想法吗?