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)
工作,但我们知道,每增加一个新火箭或无法通过的物体数量增加,这将变得非常缓慢.
我假设有一种非常简单有效的方法,我错过了 - 我的意思是,所有的游戏都是这样做的(暗黑破坏神等)有数百个敌人,除非你可见,否则什么都不做.
想法?
我的意思是,所有游戏(《暗黑破坏神》等)都会有数百个敌人,除非你可见,否则他们不会做任何事情。
像《暗黑破坏神》这样的游戏使用基于图块的引擎来减少计算碰撞、视线和人工智能行为所需的计算量;基于图块的引擎正是出于您对游戏引擎的确切关注而诞生的。
给定绝对坐标,找出敌人所在的特定图块并将其转换为地图上的 x,y 坐标是很简单的。一旦你有了这个图块,就应该不难缩小你需要运行的“检查”的数量,以确定是否有另一个物体在视野中。
进一步考虑基于图块的引擎,寻路在基于图块的游戏引擎中也非常有用,并且可以很容易地完成您的任务;路径距离和/或复杂性可以让您轻松判断两个对象是否可以“看到”彼此。(有可能如果您需要走四十步,或者在迷宫般的路径中,物体彼此不可见)
基于图块的引擎大大减少了您开始考虑的开销问题。