Root/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | using System; using System.Collections.Generic; using FarseerPhysics.Dynamics; namespace FarseerPhysics.Controllers { /// <summary> /// Put a limit on the linear (translation - the movespeed) and angular (rotation) velocity /// of bodies added to this controller. /// </summary> public class VelocityLimitController : Controller { public bool LimitAngularVelocity = true ; public bool LimitLinearVelocity = true ; private List<Body> _bodies = new List<Body>(); private float _maxAngularSqared; private float _maxAngularVelocity; private float _maxLinearSqared; private float _maxLinearVelocity; /// <summary> /// Initializes a new instance of the <see cref="VelocityLimitController"/> class. /// Sets the max linear velocity to Settings.MaxTranslation /// Sets the max angular velocity to Settings.MaxRotation /// </summary> public VelocityLimitController() : base (ControllerType.VelocityLimitController) { MaxLinearVelocity = Settings.MaxTranslation; MaxAngularVelocity = Settings.MaxRotation; } /// <summary> /// Initializes a new instance of the <see cref="VelocityLimitController"/> class. /// Pass in 0 or float.MaxValue to disable the limit. /// maxAngularVelocity = 0 will disable the angular velocity limit. /// </summary> /// <param name="maxLinearVelocity">The max linear velocity.</param> /// <param name="maxAngularVelocity">The max angular velocity.</param> public VelocityLimitController( float maxLinearVelocity, float maxAngularVelocity) : base (ControllerType.VelocityLimitController) { if (maxLinearVelocity == 0 || maxLinearVelocity == float .MaxValue) LimitLinearVelocity = false ; if (maxAngularVelocity == 0 || maxAngularVelocity == float .MaxValue) LimitAngularVelocity = false ; MaxLinearVelocity = maxLinearVelocity; MaxAngularVelocity = maxAngularVelocity; } /// <summary> /// Gets or sets the max angular velocity. /// </summary> /// <value>The max angular velocity.</value> public float MaxAngularVelocity { get { return _maxAngularVelocity; } set { _maxAngularVelocity = value; _maxAngularSqared = _maxAngularVelocity * _maxAngularVelocity; } } /// <summary> /// Gets or sets the max linear velocity. /// </summary> /// <value>The max linear velocity.</value> public float MaxLinearVelocity { get { return _maxLinearVelocity; } set { _maxLinearVelocity = value; _maxLinearSqared = _maxLinearVelocity * _maxLinearVelocity; } } public override void Update( float dt) { foreach (Body body in _bodies) { if (!IsActiveOn(body)) continue ; if (LimitLinearVelocity) { //Translation // Check for large velocities. float translationX = dt * body.LinearVelocityInternal.X; float translationY = dt * body.LinearVelocityInternal.Y; float result = translationX * translationX + translationY * translationY; if (result > dt * _maxLinearSqared) { float sq = ( float )Math.Sqrt(result); float ratio = _maxLinearVelocity / sq; body.LinearVelocityInternal.X *= ratio; body.LinearVelocityInternal.Y *= ratio; } } if (LimitAngularVelocity) { //Rotation float rotation = dt * body.AngularVelocityInternal; if (rotation * rotation > _maxAngularSqared) { float ratio = _maxAngularVelocity / Math.Abs(rotation); body.AngularVelocityInternal *= ratio; } } } } public void AddBody(Body body) { _bodies.Add(body); } public void RemoveBody(Body body) { _bodies.Remove(body); } } } |
Source at commit 83549dbfc1c0 created 12 years 7 months ago. By Nathan Adams, Adding missing virtual method |
---|