检查拦截AS3中视线的物体的有效方法

Mar*_*rty 5 flash performance actionscript-3

我已经有一段时间了,现在一直试图找出一种有效的方法,看看是否存在其他东西的视线.一个很好的例子就是如果它可以看到你的话,有一个向你发射火箭的球体 - 但显然不是你在墙后面.

以下是我通常如何做到这一点:

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};
}
Run Code Online (Sandbox Code Playgroud)

使用这个基本上是:

var sight:Object = cast(player, impassable);

if(sight.visible) trace('can see');
else trace('cant see - collision at ' + sight.x + ", " + sight.y);
Run Code Online (Sandbox Code Playgroud)

工作,但我们知道,每增加一个新火箭或无法通过的物体数量增加,这将变得非常缓慢.

我假设有一种非常简单有效的方法,我错过了 - 我的意思是,所有的游戏都是这样做的(暗黑破坏神等)有数百个敌人,除非你可见,否则什么都不做.

想法?

Bri*_*lia 4

我的意思是,所有游戏(《暗黑破坏神》等)都会有数百个敌人,除非你可见,否则他们不会做任何事情。

像《暗黑破坏神》这样的游戏使用基于图块的引擎来减少计算碰撞、视线和人工智能行为所需的计算量;基于图块的引擎正是出于您对游戏引擎的确切关注而诞生的。

给定绝对坐标,找出敌人所在的特定图块并将其转换为地图上的 x,y 坐标是很简单的。一旦你有了这个图块,就应该不难缩小你需要运行的“检查”的数量,以确定是否有另一个物体在视野中​​。

进一步考虑基于图块的引擎,寻路在基于图块的游戏引擎中也非常有用,并且可以很容易地完成您的任务;路径距离和/或复杂性可以让您轻松判断两个对象是否可以“看到”彼此。(有可能如果您需要走四十步,或者在迷宫般的路径中,物体彼此不可见)

基于图块的引擎大大减少了您开始考虑的开销问题。