XNA中的旋转和弧度,Enemy Ai修正

时间:2013-03-13 19:02:53

标签: c# xna rotation artificial-intelligence

我的暴民AI一直遇到麻烦

它适用于某一点,除了它与我想要的相反,意味着它在错误的方向上变成180度;

        Target = playerST.Posistion;
        Vector2 trivial;
        trivial.X = Posistion.X - Target.X;
        trivial.Y = Posistion.Y - Target.Y;
        instant = ((float)Math.Atan2(trivial.Y, trivial.X)) + 3.141592f; 

这告诉我目标在哪里并计算我需要旋转的数字

它的弧度加上3.1etc就像是180度,因为这样计算它给我的最小值为-3.141或最大值为 3.141但是敌人的旋转在0到6.28之间完成,加上3.141使得瞬间=在敌人的旋转范围内而不是在它下面3.141

无论如何这是我被卡在......实际轮换

的部分
        // irrelevant
                if (attack == true)
            {

                Vector2 modelVelocityAdd = Vector2.Zero;

                modelVelocityAdd.Y = -(float)Math.Sin(rotation);
                modelVelocityAdd.X = -(float)Math.Cos(rotation);

                modelVelocityAdd *= (0.00002f * speed);
                if ((((rotation) + 0.2f)) < instant && (rotation - 0.2f) > instant)
                {
                    modelVelocity += modelVelocityAdd;
                }
        // not so irrelvant and needs fixing!
                if (instant < rotation )
                    {
                         rotation -= rotationspeed / 2000;
                    }
                else if (rotation < instant)
                    {
                         rotation += rotationspeed / 2000;
                    }

所以我的问题是如何阻止它向错误的方向旋转180度并实际让它面对玩家而不是面对相反的

我不能简单地说,做下面的事情是因为船被困在5度到零度之间来回移动

            if (instant < rotation )
                    {
                         rotation += rotationspeed / 2000;
                    }
                else if (rotation < instant)
                    {
                         rotation -= rotationspeed / 2000;
                    }

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

而不是

           if (instant < rotation )
                {
                     rotation += rotationspeed / 2000;
                }
            else if (rotation < instant)
                {
                     rotation -= rotationspeed / 2000;
                }

rotation = Math.Lerp(rotation, instant, 0.1);

0.1控制旋转“速度”。使用lerp使运动更加自然,并将解决角度在正负之间振荡的问题。

答案 1 :(得分:0)

我想通了,

    trivial.X = Posistion.X - Target.X;
    trivial.Y = Posistion.Y - Target.Y;

错误需要

    trivial.X = Target.X -Posistion.X  ;
        trivial.Y = Target.Y - Posistion.Y ;

谢谢你,没有你的帮助我永远不会注意到:D