代码之家  ›  专栏  ›  技术社区  ›  RCIX

弹丸跟踪码困难

  •  0
  • RCIX  · 技术社区  · 14 年前

    我在游戏中为一个抛射类编写了一些代码,如果可以的话,它可以跟踪目标:

                if (_target != null && !_target.IsDead)
                {
                    Vector2 currentDirectionVector = this.Body.LinearVelocity;
                    currentDirectionVector.Normalize();
                    float currentDirection = (float)Math.Atan2(currentDirectionVector.Y, currentDirectionVector.X);
                    Vector2 targetDirectionVector = this._target.Position - this.Position;
                    targetDirectionVector.Normalize();
                    float targetDirection = (float)Math.Atan2(targetDirectionVector.Y, targetDirectionVector.X);
                    float targetDirectionDelta = targetDirection - currentDirection;
                    if (MathFunctions.IsInRange(targetDirectionDelta, -(Info.TrackingRate * deltaTime), Info.TrackingRate * deltaTime))
                    {
                        Body.LinearVelocity = targetDirectionVector * Info.FiringVelocity;
                    }
                    else if (targetDirectionDelta > 0)
                    {
                        float newDirection = currentDirection + Info.TrackingRate * deltaTime;
                        Body.LinearVelocity = new Vector2(
                            (float)Math.Cos(newDirection),
                            (float)Math.Sin(newDirection)) * Info.FiringVelocity;
                    }
                    else if (targetDirectionDelta < 0)
                    {
                        float newDirection = currentDirection - Info.TrackingRate * deltaTime;
                        Body.LinearVelocity = new Vector2(
                            (float)Math.Cos(newDirection),
                            (float)Math.Sin(newDirection)) * Info.FiringVelocity;
                    }
                }
    

    这有时是可行的,但取决于与目标弹丸的相对角度,弹丸会转而远离目标。我被难住了;有人能指出我的代码中的缺陷吗?

    更新:思考一下,尝试一下,我得出结论,这与方向(弧度)低于0,当前射角高于0有关。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Leftium    14 年前

    变量 targetDirectionDelta 不一定是到达目标的最短方向。如果绝对值 目标方向Delta 大于π弧度,则会显示射弹正在远离目标。向另一个方向转弯较短,而且是预期的。

    例子:

    currentDirection = 2
    targetDirection = -2
    

    弹丸可以旋转-4弧度(在负方向),或2*(pi-2)弧度(大约2.2弧度)(在正方向)。

    在这种情况下,代码总是计算较长的方向,但您希望抛射体转向较短的方向:

    targetDirectionDelta = targetDirection - currentDirection