Box2dx: отменить силу на теле? - PullRequest
0 голосов
/ 26 марта 2010

Я делаю поиск пути, где использую силу, чтобы подтолкнуть тело к путевым точкам. Однако, как только они приблизятся к путевой точке, я хочу отменить силу. Как я могу это сделать? Нужно ли мне отдельно поддерживать все силы, которые я приложил к данному телу?

Я использую 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;
            }
        }

UPDATE

Если я отслеживаю, сколько сил я применил, он не учитывает другие силы, которые могут на него воздействовать.

Я мог бы использовать отражение и установить _force на ноль напрямую, но это выглядит грязно.

1 Ответ

0 голосов
/ 02 апреля 2010

Если вы просто хотите остановить тело мертвым (устраняя все силы, действующие на него), вы можете просто уложить его в сон:

posUpdater.Model.Body.SetAwake( false )

Это очищает линейные и угловые силы и скорости тела. Спящие тела также не сталкиваются с другими спящими телами и, как правило, занимают меньше процессорного времени, поскольку их физика отключается.

Если вы действительно хотите, чтобы тело приняло участие в физике после того, как его остановили, просто немедленно разбудите его:

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

Это может привести к «неестественным» результатам, если, конечно, тело находилось в процессе столкновения с другими вещами.

...