protected void _SetupForce(Force force, ref ForceInstance fi) { Assert.Fatal(SceneObject != null, "Cannot set up force before adding to scene"); SceneObject.RegisterInterface(this, fi._strength); fi._strength.Value = force.InitialStrength; if (force.LinkName != null && force.LinkName != String.Empty) { fi._linkPosition = SceneObject.Components.GetInterface<ValueInterface<Vector2>>("vector2", force.LinkName); fi._linkRotation = SceneObject.Components.GetInterface<ValueInterface<float>>("float", force.LinkName); } }
/// <summary> /// Add a new force to this object. Force will continue to be applied until RemoveForce /// is called for the force. /// </summary> /// <param name="force">Force to applye.</param> public void AddForce(Force force) { _forces.Add(force); ForceInstance fi = new ForceInstance(); fi._strength = new ValueInPlaceInterface<float>(); if (SceneObject != null) _SetupForce(force, ref fi); _forceInstances.Add(fi); }
protected void _GetForceData(Force force, ForceInstance fi, out Vector2 offset, out Vector2 direction) { offset = SceneObject.GetWorldLinkPosition(fi._linkPosition, fi._linkRotation, force.Offset) - SceneObject.Position; float dirRot; if (force.UseLinkDirection) { dirRot = SceneObject.GetWorldLinkRotation(fi._linkRotation, force.RotationOffset); } else { dirRot = force.ConstantDirection; if (!force.ConstantDirectionIsWorldSpace) dirRot += SceneObject.Rotation; dirRot = (dirRot + force.RotationOffset) % 360.0f; } direction = T2DVectorUtil.VectorFromAngle(dirRot); }