Я уже некоторое время пытаюсь найти эффективный способ увидеть, находится ли что-то в поле зрения другого.Хорошим примером является сфера, которая запускает в вас ракету, если она видит вас, но, очевидно, нет, если вы находитесь за стеной.
Вот как я обычно это делал:
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);
Работает, но, как мы знаем, это будет очень медленным с каждой новой ракетой или с увеличением количества непроходимых объектов.
Я предполагаю, что есть действительно простой эффективный способ, который мне не хватает - я имею в виду, что все игры делают это (Diablo и т. Д.) С сотнями врагов, которые ничего не делают, если вы не видны.1012 * Идеи?