0

我的暴民 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 度和负 5 度之间来回移动

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

谢谢你的帮助

4

2 回答 2

1

代替

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

尝试

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

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

于 2013-03-13T20:15:13.083 回答
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

于 2013-03-13T20:35:17.307 回答