0

我正在寻找路径,我用力将身体推到航点。但是,一旦它们足够接近航点,我想取消力量。我怎样才能做到这一点?我是否需要分别保持我对相关身体施加的所有力?

我正在使用 Box2dx (C#/XNA)。

这是我的尝试,但它根本不起作用:

   internal PathProgressionStatus MoveAlongPath(PositionUpdater posUpdater)
    {
        Vector2 nextGoal = posUpdater.Goals.Peek();
        Vector2 currPos = posUpdater.Model.Body.Position;
        float distanceToNextGoal = Vector2.Distance(currPos, nextGoal);
        bool isAtGoal = distanceToNextGoal < PROXIMITY_THRESHOLD;

        Vector2 forceToApply = new Vector2();
        double angleToGoal = Math.Atan2(nextGoal.Y - currPos.Y, nextGoal.X - currPos.X);
        forceToApply.X = (float)Math.Cos(angleToGoal) * posUpdater.Speed;
        forceToApply.Y = (float)Math.Sin(angleToGoal) * posUpdater.Speed;

        float rotation = (float)(angleToGoal + Math.PI / 2);

        posUpdater.Model.Body.Rotation = rotation;

        if (!isAtGoal)
        {
            posUpdater.Model.Body.ApplyForce(forceToApply, posUpdater.Model.Body.Position);
            posUpdater.forcedTowardsGoal = true;
        }

        if (isAtGoal)
        {
            // how can the body be stopped?

            posUpdater.forcedTowardsGoal = false;
            //posUpdater.Model.Body.SetLinearVelocity(new Vector2(0, 0));
            //posUpdater.Model.Body.ApplyForce(-forceToApply, posUpdater.Model.Body.GetPosition());
            posUpdater.Goals.Dequeue();

            if (posUpdater.Goals.Count == 0)
            {
                return PathProgressionStatus.COMPLETE;
            }
        }

更新

如果我确实记录了我施加了多少力,它就无法解释可能作用于它的其他力。

我可以使用反射并_force直接设置为零,但这感觉很脏。

4

1 回答 1

0

如果您只是想阻止身体死亡(消除作用于它的所有力量),您可以让它进入睡眠状态:

posUpdater.Model.Body.SetAwake( false )

这清除了身体的线性和角向力和速度。睡眠体也不会与其他睡眠体发生碰撞,并且通常占用更少的 CPU 时间,因为它们的物理功能实际上已关闭。

如果您真的希望身体在停止死亡后参与物理,只需立即唤醒它:

posUpdater.Model.Body.SetAwake( false )
posUpdater.Model.Body.SetAwake( true)

当然,如果身体正与其他物体发生碰撞,这可能会导致看起来“不自然”的结果。

于 2010-04-01T22:09:36.300 回答