0

好的,所以我在一个守卫跟随我的角色的地方做了一些 AI。

我正在使用这段代码:

    private function getDegrees(radians:Number):Number
    {
        //return Math.floor(radians/(Math.PI/180));

        return radians / 0.01745 | 0;
    }

    private function getRadians(delta_x:Number, delta_y:Number):Number
    {
        var r:Number = Math.atan2(delta_y, delta_x);

        if (delta_y < 0)
        {
            //r += (2 * Math.PI);

            r += 6.283;
        }

        return r;
    }

然后在循环中

        if(isShooting)
        {
            // calculate rotation based on mouse X & Y
            _dx = this.x - _root.assassin.x;
            _dy = this.y - _root.assassin.y;

            // which way to rotate
            _rotateTo = getDegrees(getRadians(_dx, _dy));   

            // keep rotation positive, between 0 and 360 degrees
            if (_rotateTo > this.rotation + 180) _rotateTo -= 360;
            if (_rotateTo < this.rotation - 180) _rotateTo += 360;

            // ease rotation
            _trueRotation = (_rotateTo - this.rotation) / _rotateSpeedMax;

            // update rotation
            this.rotation += _trueRotation;         


            gotoAndStop(5);
            isWalking = false;
            isStanding = false;
        }

问题是,后卫奇怪地旋转,就好像他没有看着球员一样。就好像玩家在其他地方一样。不知道,它只是不起作用..我不知道代码有什么问题!

4

2 回答 2

0

为了保持旋转为正,您应该使用模数 360,如下所示,以提高可读性和(代码)简单性,除非这是一个明显的性能问题:(我认为这适用于 AC3,只是在网上快速查找)

_rotateTo = _rotateTo % 360;

另一个可能的问题是您如何定义 _dx 和 _dy。我猜刺客正朝着与预期相反的方向。解决方法是使用我认为它应该是:

_dx = _root.assassin.x - this.x;
_dy = _root.assassin.y - this.y;
于 2014-03-05T04:44:05.023 回答
0

你应该只计算相对角度

 _rotateTo = getDegrees(getRadians(_dx, _dy));   
 _trueRotation = (_rotateTo - this.rotation) / _rotateSpeedMax;

然后将其标准化为尽可能接近零

  _trueRotation = (_trueRotation+900) %360 - 180;

然后将其切成每步的最大旋转

  _trueRotation = max(_trueRotation,_rotateSpeedMax* _timestep);
  _trueRotation = min(_trueRotation,-_rotateSpeedMax*_timestep);

然后使用它来更新前进方向

  this.rotation += _trueRotation;         

速度通常是每次变化的,所以为了语义一致性应该有一个时间步长的乘法。当然,你的时间步可能等于1,或者rotateSpeedMax真的是一个rotateMaxAngle(每步),那么与时间步的乘法就可以去掉了。

于 2014-03-05T09:30:34.973 回答