Пример #1
0
        private static Joint DeserializeJoint(IGameObject parent, XElement jointElement, IPhysicsManager physicsManager, Dictionary <string, Body> bodies)
        {
            Joint     joint = null;
            JointType type = JointType.Angle;
            Body      bodyA = null, bodyB = null;
            bool      collideConnected = false;
            World     world            = physicsManager.PhysicsWorld;

            var jointData = new FarseerJointUserData();

            if (jointElement.Attribute("type") != null)
            {
                type = (JointType)Enum.Parse(typeof(JointType), jointElement.Attribute("type").Value, true);
            }

            if (jointElement.Element("bodyA") != null)
            {
                var jointName = jointElement.Element("bodyA").Value;
                bodyA = bodies[jointName];
                jointData.BodyAName = jointName;
            }


            if (jointElement.Element("bodyB") != null)
            {
                var jointName = jointElement.Element("bodyB").Value;
                bodyB = bodies[jointName];
                jointData.BodyBName = jointName;
            }

            if (jointElement.Element("collideConnected") != null)
            {
                bool.TryParse(jointElement.Element("collideConnected").Value, out collideConnected);
            }

            #region Joint Types Instantiation

            if (bodyA != null)
            {
                switch (type)
                {
                case JointType.Angle:
                    if (bodyB != null)
                    {
                        joint = DeserializeAngleJoint(jointElement, bodyA, bodyB, world);
                    }
                    break;

                case JointType.Distance:
                    if (bodyB != null)
                    {
                        joint = DeserializeDistanceJoint(jointElement, bodyA, bodyB, world);
                    }
                    break;

                //case JointType.FixedAngle:
                //    joint = DeserializeFixedAngleJoint(jointElement, bodyA, world);
                //    break;
                //case JointType.FixedDistance:
                //    joint = DeserializeFixedDistanceJoint(jointElement, bodyA, world);
                //    break;
                //case JointType.FixedFriction:
                //    joint = DeserializeFixedFrictionJoint(jointElement, bodyA, world);
                //    break;
                //case JointType.FixedPrismatic:
                //    joint = DeserializeFixedPrismaticJoint(jointElement, bodyA, parent, world);
                //    break;
                //case JointType.FixedRevolute:
                //    joint = DeserializeFixedRevoluteJoint(jointElement, bodyA, world);
                //    break;
                //case JointType.Friction:
                //    if (bodyB != null)
                //        joint = DeserializeFrictionJoint(jointElement, bodyA, bodyB, world);
                //    break;
                //case JointType.FixedLine:
                //    if (bodyB != null)
                //        joint = DeserializeLineJoint(jointElement, bodyA, bodyB, world);
                //    break;
                //case JointType.Prismatic:
                //    if (bodyB != null)
                //        joint = DeserializePrismaticJoint(jointElement, bodyA, bodyB, world);
                //    break;
                //case JointType.Pulley:
                //    if (bodyB != null)
                //        joint = DeserializePulleyJoint(jointElement, bodyA, bodyB, world);
                //    break;
                case JointType.Revolute:
                    if (bodyB != null)
                    {
                        joint = DeserializeRevoluteJoint(jointElement, bodyA, bodyB, world);
                    }
                    break;

                // case JointType.Slider:
                //     if (bodyB != null)
                //         joint = DeserializeSliderJoint(jointElement, bodyA, bodyB, world);
                //     break;
                case JointType.Weld:
                    if (bodyB != null)
                    {
                        joint = DeserializeWeldJoint(jointElement, bodyA, bodyB, world);
                    }
                    break;
                }
            }
            #endregion

            if (joint != null)
            {
                joint.CollideConnected = collideConnected;
            }

            joint.UserData = jointData;

            return(joint);
        }
        public static Joint CopyJoint(Joint joint, Body bodyA, Body bodyB, World world)
        {
            Joint newJoint = null;

            switch (joint.JointType)
            {
                case JointType.Angle:
                    newJoint = JointFactory.CreateAngleJoint(world, bodyA, bodyB);
                    break;
                case JointType.Distance:
                    newJoint = new DistanceJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter);
                    break;
                case JointType.FixedAngle:
                    newJoint = new FixedAngleJoint(bodyA);
                    break;
                case JointType.FixedDistance:
                    newJoint = new FixedDistanceJoint(bodyA, bodyA.WorldCenter, Vector2.Zero);
                    break;
                case JointType.FixedFriction:
                    newJoint = new FixedFrictionJoint(bodyA, bodyA.WorldCenter);
                    break;
                case JointType.FixedPrismatic:
                    var fpJoint = joint as FixedPrismaticJoint;
                    var fpAxis = fpJoint.LocalXAxis1;
                    newJoint = new FixedPrismaticJoint(bodyA, bodyA.WorldCenter, fpAxis);
                    break;
                case JointType.FixedRevolute:
                    newJoint = new FixedRevoluteJoint(bodyA, bodyA.WorldCenter, Vector2.Zero);
                    break;
                case JointType.Friction:
                    newJoint = new FrictionJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter);
                    break;
                case JointType.Line:
                    var lineJoint = joint as LineJoint;
                    var axis = lineJoint.LocalXAxis;
                    newJoint = new LineJoint(bodyA, bodyB, bodyA.WorldCenter, axis);
                    break;
                case JointType.Prismatic:
                    var pJoint = joint as PrismaticJoint;
                    var pAxis = pJoint.LocalXAxis1;
                    newJoint = new PrismaticJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter, pAxis);
                    ((PrismaticJoint)newJoint).LimitEnabled = pJoint.LimitEnabled;
                    ((PrismaticJoint)newJoint).MotorEnabled = pJoint.MotorEnabled;
                    ((PrismaticJoint)newJoint).MaxMotorForce = pJoint.MaxMotorForce;
                    ((PrismaticJoint)newJoint).MotorSpeed = pJoint.MotorSpeed;
                    ((PrismaticJoint)newJoint).LowerLimit = pJoint.LowerLimit;
                    ((PrismaticJoint)newJoint).UpperLimit = pJoint.UpperLimit;
                    ((PrismaticJoint)newJoint).ReferenceAngle = pJoint.ReferenceAngle;
                    ((PrismaticJoint)newJoint).LocalXAxis1 = pJoint.LocalXAxis1;
                    break;
                case JointType.Pulley:
                    var pulleyJoint = joint as PulleyJoint;
                    var ratio = pulleyJoint.Ratio;
                    newJoint = new PulleyJoint(bodyA, bodyB, Vector2.Zero, Vector2.Zero, bodyA.WorldCenter, bodyB.WorldCenter, ratio);
                    break;
                case JointType.Revolute:
                    newJoint = new RevoluteJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter);
                    break;
                case JointType.Slider:
                    var sliderJoint = joint as SliderJoint;
                    var minLength = sliderJoint.MinLength;
                    var maxLength = sliderJoint.MaxLength;
                    newJoint = new SliderJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter, minLength, maxLength);
                    break;
                case JointType.Weld:
                    newJoint = new WeldJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter);
                    break;
            }

            var data = new FarseerJointUserData();
            data.BodyAName = ((FarseerJointUserData) joint.UserData).BodyAName;
            data.BodyBName = ((FarseerJointUserData) joint.UserData).BodyBName;

            joint.UserData = data;

            return newJoint;
        }
Пример #3
0
        //private static Joint DeserializeSliderJoint(XElement jointElement, Body bodyA, Body bodyB, World world)
        //{
        //    SliderJoint joint = null;
        //    Vector2 localAnchorA, localAnchorB;
        //    float minLength = 0.0f, maxLength = 100.0f, dampingRatio = 0.0f, frequency = 0.0f;

        //    localAnchorA = bodyA.WorldCenter;
        //    localAnchorB = bodyB.WorldCenter;

        //    foreach (XElement element in jointElement.Elements())
        //    {
        //        switch (element.Name.ToString().ToLower())
        //        {
        //            case "minlength":
        //                float.TryParse(element.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out minLength);
        //                break;
        //            case "maxlength":
        //                float.TryParse(element.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out maxLength);
        //                break;
        //            case "dampingratio":
        //                float.TryParse(element.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out dampingRatio);
        //                break;
        //            case "frequency":
        //                float.TryParse(element.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out frequency);
        //                break;
        //            case "localanchora":
        //                localAnchorA = localAnchorA.DeserializeOffset(element);
        //                localAnchorA = ConvertUnits.ToSimUnits(localAnchorA);
        //                break;
        //            case "localanchorb":
        //                localAnchorB = localAnchorB.DeserializeOffset(element);
        //                localAnchorB = ConvertUnits.ToSimUnits(localAnchorB);
        //                break;
        //        }
        //    }

        //    joint = JointFactory.CreateSliderJoint(world, bodyA, bodyB, localAnchorA, localAnchorB, minLength, maxLength);
        //    joint.DampingRatio = dampingRatio;
        //    joint.Frequency = frequency;

        //    return joint;
        //}

        #endregion

        #endregion

        public static Joint CopyJoint(Joint joint, Body bodyA, Body bodyB, World world)
        {
            Joint newJoint = null;

            switch (joint.JointType)
            {
            case JointType.Angle:
                newJoint = JointFactory.CreateAngleJoint(world, bodyA, bodyB);
                break;

            case JointType.Distance:
                newJoint = new DistanceJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter);
                break;

            /*case JointType.FixedAngle:
             *  newJoint = new FarseerPhysics.Factories.JointFactory().(bodyA);
             *  break;
             * case JointType.FixedDistance:
             *  newJoint = new FixedDistanceJoint(bodyA, bodyA.WorldCenter, Vector2.Zero);
             *  break;
             * case JointType.FixedFriction:
             *  newJoint = new FixedFrictionJoint(bodyA, bodyA.WorldCenter);
             *  break;
             * case JointType.FixedPrismatic:
             *  var fpJoint = joint as FixedPrismaticJoint;
             *  var fpAxis = fpJoint.LocalXAxis1;
             *  newJoint = new FixedPrismaticJoint(bodyA, bodyA.WorldCenter, fpAxis);
             *  break;
             * case JointType.FixedRevolute:
             *  newJoint = new FixedRevoluteJoint(bodyA, bodyA.WorldCenter, Vector2.Zero);
             *  break;*/
            case JointType.Friction:
                newJoint = new FrictionJoint(bodyA, bodyB, bodyA.WorldCenter /*, bodyB.WorldCenter*/);
                break;

            /*case JointType.FixedLine:
             *  var lineJoint = joint as LineJoint;
             *  var axis = lineJoint.LocalXAxis;
             *  newJoint = new LineJoint(bodyA, bodyB, bodyA.WorldCenter, axis);
             *  break; */
            case JointType.Prismatic:
                var pJoint = joint as PrismaticJoint;
                var pAxis  = pJoint.LocalXAxis;
                newJoint = new PrismaticJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter, pAxis);
                ((PrismaticJoint)newJoint).LimitEnabled   = pJoint.LimitEnabled;
                ((PrismaticJoint)newJoint).MotorEnabled   = pJoint.MotorEnabled;
                ((PrismaticJoint)newJoint).MaxMotorForce  = pJoint.MaxMotorForce;
                ((PrismaticJoint)newJoint).MotorSpeed     = pJoint.MotorSpeed;
                ((PrismaticJoint)newJoint).LowerLimit     = pJoint.LowerLimit;
                ((PrismaticJoint)newJoint).UpperLimit     = pJoint.UpperLimit;
                ((PrismaticJoint)newJoint).ReferenceAngle = pJoint.ReferenceAngle;
                //((PrismaticJoint)newJoint).LocalXAxis = pJoint.LocalXAxis;
                break;

            case JointType.Pulley:
                var pulleyJoint = joint as PulleyJoint;
                var ratio       = pulleyJoint.Ratio;
                newJoint = new PulleyJoint(bodyA, bodyB, Vector2.Zero, Vector2.Zero, bodyA.WorldCenter, bodyB.WorldCenter, ratio);
                break;

            case JointType.Revolute:
                newJoint = new RevoluteJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter);
                break;

            /*case JointType.Slider:
             *  var sliderJoint = joint as SliderJoint;
             *  var minLength = sliderJoint.MinLength;
             *  var maxLength = sliderJoint.MaxLength;
             *  newJoint = new SliderJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter, minLength, maxLength);
             *  break; */
            case JointType.Weld:
                newJoint = new WeldJoint(bodyA, bodyB, bodyA.WorldCenter, bodyB.WorldCenter);
                break;
            }

            var data = new FarseerJointUserData();

            data.BodyAName = ((FarseerJointUserData)joint.UserData).BodyAName;
            data.BodyBName = ((FarseerJointUserData)joint.UserData).BodyBName;

            joint.UserData = data;

            return(newJoint);
        }
        private static Joint DeserializeJoint(IGameObject parent, XElement jointElement, IPhysicsManager physicsManager, Dictionary<string, Body> bodies)
        {
            Joint joint = null;
            JointType type = JointType.Angle;
            Body bodyA = null, bodyB = null;
            bool collideConnected = false;
            World world = physicsManager.PhysicsWorld;

            var jointData = new FarseerJointUserData();

            if (jointElement.Attribute("type") != null)
                type = (JointType) Enum.Parse(typeof(JointType), jointElement.Attribute("type").Value, true);

            if (jointElement.Element("bodyA") != null)
            {
                var jointName = jointElement.Element("bodyA").Value;
                bodyA = bodies[jointName];
                jointData.BodyAName = jointName;
            }
                

            if (jointElement.Element("bodyB") != null)
            {
                var jointName = jointElement.Element("bodyB").Value;
                bodyB = bodies[jointName];
                jointData.BodyBName = jointName;
            }

            if (jointElement.Element("collideConnected") != null)
                bool.TryParse(jointElement.Element("collideConnected").Value, out collideConnected);

            #region Joint Types Instantiation

            if (bodyA != null)
            {
                switch (type)
                {
                    case JointType.Angle:
                        if (bodyB != null)
                            joint = DeserializeAngleJoint(jointElement, bodyA, bodyB, world);
                        break;
                    case JointType.Distance:
                        if (bodyB != null)
                            joint = DeserializeDistanceJoint(jointElement, bodyA, bodyB, world);
                        break;
                    case JointType.FixedAngle:
                        joint = DeserializeFixedAngleJoint(jointElement, bodyA, world);
                        break;
                    case JointType.FixedDistance:
                        joint = DeserializeFixedDistanceJoint(jointElement, bodyA, world);
                        break;
                    case JointType.FixedFriction:
                        joint = DeserializeFixedFrictionJoint(jointElement, bodyA, world);
                        break;
                    case JointType.FixedPrismatic:
                        joint = DeserializeFixedPrismaticJoint(jointElement, bodyA, parent, world);
                        break;
                    case JointType.FixedRevolute:
                        joint = DeserializeFixedRevoluteJoint(jointElement, bodyA, world);
                        break;
                    case JointType.Friction:
                        if (bodyB != null)
                            joint = DeserializeFrictionJoint(jointElement, bodyA, bodyB, world);
                        break;
                    case JointType.Line:
                        if (bodyB != null)
                            joint = DeserializeLineJoint(jointElement, bodyA, bodyB, world);
                        break;
                    case JointType.Prismatic:
                        if (bodyB != null)
                            joint = DeserializePrismaticJoint(jointElement, bodyA, bodyB, world);
                        break;
                    case JointType.Pulley:
                        if (bodyB != null)
                            joint = DeserializePulleyJoint(jointElement, bodyA, bodyB, world);
                        break;
                    case JointType.Revolute:
                        if (bodyB != null)
                            joint = DeserializeRevoluteJoint(jointElement, bodyA, bodyB, world);
                        break;
                    case JointType.Slider:
                        if (bodyB != null)
                            joint = DeserializeSliderJoint(jointElement, bodyA, bodyB, world);
                        break;
                    case JointType.Weld:
                        if (bodyB != null)
                            joint = DeserializeWeldJoint(jointElement, bodyA, bodyB, world);
                        break;
                }
            }
            #endregion

            if (joint != null)
                joint.CollideConnected = collideConnected;

            joint.UserData = jointData;

            return joint;
        }