我在这里遇到的问题。我已经为我的敌人实施了一个视野,所以当玩家在可探测区域(前方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才能工作,我认为这可能与问题有关。非常感谢任何帮助!
答案 0 :(得分:1)
我认为添加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会照顾正确的角度标志...... 虽然您将检查新计算的角度以选择适当的范围...