加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 07:25:46 所属栏目:百科 来源:网络整理
导读:我已经有一段时间了,现在一直试图找出一种有效的方法,看看是否存在其他东西的视线.一个很好的例子就是如果它可以看到你的话,有一个向你发射火箭的球体 – 但显然不是你在墙后面. 以下是我通常如何做到这一点: function cast(end:GameObject,walls:Array,acc
我已经有一段时间了,现在一直试图找出一种有效的方法,看看是否存在其他东西的视线.一个很好的例子就是如果它可以看到你的话,有一个向你发射火箭的球体 – 但显然不是你在墙后面.

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

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行为所需的计算次数;基于磁贴的引擎诞生于您对游戏引擎的确切顾虑.

给定绝对坐标,找出任何敌人所在的特定区块并将其转换为地图上的x,y坐标是微不足道的.一旦你有了这个区块,就不应该太难以缩小你需要运行的“检查”的数量,以便弄清楚是否有另一个对象.

进一步采用基于磁贴的引擎,寻路在基于磁贴的游戏引擎中也非常有用,并且可以非常轻松地完成您的任务;路径距离和/或复杂性可以让您轻松判断2个对象是否可以相互“看到”. (如果您需要走四十步,或者在迷宫般的路径中,对象彼此不可见)

基于磁贴的引擎可以大大减少您开始考虑的开销问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读