flash - 在 AS3 中检查拦截视线的对象的有效方法

标签 flash actionscript-3 performance

一段时间以来,我一直试图找出一种有效的方法来查看某物是否在其他人的视线内。一个很好的例子是有一个球体,如果它可以看到你,它就会向你发射火箭——但如果你在墙后面,显然不会。

以下是我通常这样做的方法:

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);

有效,但正如我们所知,随着每个新火箭的加入或无法通过的物体数量的增加,这将变得非常缓慢。

我假设有一种我缺少的非常简单有效的方法 - 我的意思是,所有游戏(暗黑破坏神等)都会这样做,数百个敌人不会做任何事情,除非你是可见的。

想法?

最佳答案

I mean, all games do it (Diablo, etc) with hundreds of enemies that don't do anything unless you're visible.



暗黑破坏神之类的游戏使用基于磁贴的引擎,以减少计算碰撞、视线和 AI 行为所需的计算量;基于磁贴的引擎诞生于您对游戏引擎的确切关注。

给定绝对坐标,找出任何敌人所在的特定瓷砖并将其转换为 map 上的 x,y 坐标是微不足道的。一旦你有了那个磁贴,缩小​​你需要运行的“检查”的数量应该不会太难,以确定是否有另一个物体在视线范围内。

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

基于磁贴的引擎 大幅度减少您开始考虑的开销问题。

关于flash - 在 AS3 中检查拦截视线的对象的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5943531/

相关文章:

Android:使用 onTouch 移动 View 有明显的滞后

javascript - Firefox 的 Flash 外部接口(interface)问题

CSS 100% 高度 + 具有静态高度的标题;

actionscript-3 - ActionScript 3 : Loading ai files dynamically?

actionscript-3 - Flash AS3 - 添加反射/镜像到可拖动的动画片段

python - 将 ascii 编码转换为 int 并在 python 中再次返回(快速)

Java 性能逐渐下降

c# - 使用 C# 图形从 swf 中绘制图像

flash - 有没有办法子类化和覆盖自定义命名空间中的方法?

actionscript-3 - 使用 AS3/Air 进行递归文件夹/目录复制