Je fais du pathfinding où j'utilise la force pour pousser le corps vers les waypoints. Cependant, une fois qu'ils sont assez près du waypoint, je veux annuler la force. Comment puis-je faire ceci? Dois-je maintenir séparément toutes les forces que j'ai appliquées au corps en question? J'utilise Box2dx (C#/XNA).Box2dx: Annuler la force sur un corps?
Voici ma tentative, mais il ne fonctionne pas du tout:
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;
}
}
MISE À JOUR
Si je fais garder la trace de la quantité de force que j'ai appliqué, il ne tient pas compte pour d'autres forces qui peuvent agir dessus.
Je pourrais utiliser la réflexion et régler _force
directement à zéro, mais cela semble sale.