我在这里遇到的一个奇怪的问题。 我已经为我的敌人实现了视野,这样当玩家在可探测区域(前面120度锥体)内移动时,他会被坏人追赶,直到他离开FOV。
问题是有一个 120 FOV 的锥体也从敌人后面出来,所以有两个锥体,一个在前面,一个在后面,我只想使用前面的那个。 我唯一能想到的是我溢出了通过的 PI? 我真的不确定。
我使用本教程通过矢量数学来实现这一点。 点积部分。http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-2/
这是与 FOV 相关的代码。
Vector2 EnemyVecAngle = new Vector2((float)Math.Cos(EnemyAnimation.Angle), (float)Math.Sin(EnemyAnimation.Angle));
//normalize
Vector2 EnemyFacingN = Vector2.Normalize(EnemyVecAngle);
Vector2 EnemytoPlayer = Vector2.Normalize(player.Position - Position);
//check angle
float CheckAngle = (float)Math.Acos(Vector2.Dot(EnemyFacingN, EnemytoPlayer));
if ((CheckAngle >= 60) && (CheckAngle <= 120)
following = true;
这是一旦检测到敌人就会面对玩家的声明
EnemyAnimation.Angle = (float)Math.PI / -2 + (float)Math.Atan2(Position.Y - player.Position.Y, Position.X - player.Position.X);
我想知道为什么我需要添加 -PI/2 才能工作,我认为这可能与问题有关。 任何帮助将不胜感激!
我认为添加 Math.PI/-2 是将纹理旋转 90º。
你应该使用Atan2:
Vector2 EnemyVecAngle = new Vector2((float)Math.Cos(EnemyAnimation.Angle), (float)Math.Sin(EnemyAnimation.Angle));
//normalize
Vector2 EnemyFacingN = Vector2.Normalize(EnemyVecAngle);
Vector2 EnemytoPlayer = Vector2.Normalize(player.Position - Position);
//check angle
float CheckAngle = (float) (Math.Atan2(EnemyFacingN.Y, EnemyFacingN.X)
- Math.Atan2(EnemytoPlayer.Y, EnemytoPlayer.X) );
有了这个应该足够了...Atant2 将负责直角标志...尽管您将检查新计算的角度以选择足够的范围...