Эффективный способ проверки объектов, пересекающих линию обзора в AS3

Я уже давно пытаюсь разработать эффективный способ увидеть, есть ли что-то в другом ' прямая видимость. Хорошим примером является сфера, которая запускает в вас ракету, если видит вас, но, очевидно, не, если вы находитесь за стеной.

Вот как я обычно делал это:

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 и т. Д.) С сотнями врагов, которые ничего не делают, если вас не видно.

Идеи?

5
задан Marty 9 May 2011 в 23:12
поделиться