gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:19:17 25 4
gpt4 key购买 nike

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

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com