public void ApplyPhysics(TimeSpan delta) { foreach (var C1 in Components) { if (!C1.HasPhysics) { continue; } C1.Start(); //C1.ApplyForce(new Vector2(0,9f)); foreach (var C2 in Components) { if (C1 == C2) { continue; } var force = C2.Component.BoundingRectangle.Center - C1.Component.BoundingRectangle.Center; var d = force.LengthSquared(); force = Vector2.Normalize(force); var strength = 0.5f * C1.Mass * C2.Mass / d; force *= strength; C1.ApplyForce(force); } C1.ApplyFriction(); C1.ApplyAcceleration(delta); var distance = C1.ApplyVelocity(delta); var newPrimitive = C1.Component.BoundingRectangle.Translate(distance); if (Components.Any(c => C1 != c && c.HasCollisions && c.Component.BoundingRectangle.CollidesWith(newPrimitive))) { C1.Velocity *= -0.9f; } distance = C1.ApplyVelocity(delta); C1.Component.Translate(distance); } }