示例#1
0
        public override void Flip()
        {
            base.Flip();

            walkPos = -walkPos;

            Limb torso = GetLimb(LimbType.Torso);

            Vector2 difference;

            Matrix torsoTransform = Matrix.CreateRotationZ(torso.Rotation);

            for (int i = 0; i < character.SelectedItems.Length; i++)
            {
                if (character.SelectedItems[i] != null && character.SelectedItems[i].body != null)
                {
                    difference   = character.SelectedItems[i].body.SimPosition - torso.SimPosition;
                    difference   = Vector2.Transform(difference, torsoTransform);
                    difference.Y = -difference.Y;

                    character.SelectedItems[i].body.SetTransform(
                        torso.SimPosition + Vector2.Transform(difference, -torsoTransform),
                        MathUtils.WrapAngleTwoPi(-character.SelectedItems[i].body.Rotation));
                }
            }

            foreach (Limb limb in Limbs)
            {
                bool mirror    = false;
                bool flipAngle = false;
                bool wrapAngle = false;

                switch (limb.type)
                {
                case LimbType.LeftHand:
                case LimbType.LeftArm:
                case LimbType.RightHand:
                case LimbType.RightArm:
                    mirror    = true;
                    flipAngle = true;
                    break;

                case LimbType.LeftThigh:
                case LimbType.LeftLeg:
                case LimbType.LeftFoot:
                case LimbType.RightThigh:
                case LimbType.RightLeg:
                case LimbType.RightFoot:
                    mirror    = Crouching && !inWater;
                    flipAngle = (limb.DoesFlip || Crouching) && !inWater;
                    wrapAngle = !inWater;
                    break;

                default:
                    flipAngle = limb.DoesFlip && !inWater;
                    wrapAngle = !inWater;
                    break;
                }

                Vector2 position = limb.SimPosition;

                if ((limb.pullJoint == null || !limb.pullJoint.Enabled) && mirror)
                {
                    difference   = limb.body.SimPosition - torso.SimPosition;
                    difference   = Vector2.Transform(difference, torsoTransform);
                    difference.Y = -difference.Y;

                    position = torso.SimPosition + Vector2.Transform(difference, -torsoTransform);

                    //TrySetLimbPosition(limb, limb.SimPosition, );
                }

                float angle = flipAngle ? -limb.body.Rotation : limb.body.Rotation;
                if (wrapAngle)
                {
                    angle = MathUtils.WrapAnglePi(angle);
                }

                TrySetLimbPosition(limb, Collider.SimPosition, position);

                limb.body.SetTransform(limb.body.SimPosition, angle);
            }
        }