Ejemplo n.º 1
0
        public void TickCollisions(TickCollisionsEvent _)
        {
            // TODO: Do this via collision detection instead.
            // TODO: Clean this up.
            // Keeps sword rested on the ground.
            if (this.stateMachine_.IsOnGround)
            {
                var bladeFromGroundY = -(this.playerRigidbody_.CenterY -
                                         this.playerRigidbody_.BottomY);
                bladeFromGroundY -= MathF.Abs(
                    TrigMath.LenDegY(this.handDis_, this.handDeg_));

                var minAngle = MathF.Acos(bladeFromGroundY / this.bladeLength_) /
                               MathF.PI *
                               180;

                var diffToGround = TrigMath.DifferenceInDegrees(this.swordDeg_, 270);
                if (FloatMath.Abs(diffToGround) <= minAngle)
                {
                    this.swordDeg_ = 270 + FloatMath.Sign(diffToGround) * minAngle;

                    if (FloatMath.Abs(this.swordDevVel_) > 2)
                    {
                        this.swordDevVel_ *= -.5f;
                    }
                    else
                    {
                        this.swordDevVel_ = 0;
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public void ProcessInputs(ProcessInputsEvent _)
        {
            var secondaryAnalogStick = this.gamepad_[AnalogStickType.SECONDARY];
            var secStickX            = secondaryAnalogStick.RawAxes.X;
            var secStickY            = secondaryAnalogStick.RawAxes.Y;

            var secStickMag = TrigMath.DistanceBetween(0, 0, secStickX, secStickY);

            if (secStickMag < GamepadConstants.DEADZONE)
            {
                secStickMag = 0;
            }

            var wasShieldOut = this.isShieldOut_;

            this.isShieldOut_ = secStickMag > 0;

            if (this.isShieldOut_)
            {
                var secStickDeg = TrigMath.DegreesBetween(0, 0, secStickX, secStickY);

                var toHandDeg = secStickDeg;

                var maxHorizontalHandDis = this.playerRigidbody_.Width / 2 + 2;
                var maxVerticalHandDis   = this.playerRigidbody_.Height / 2 + 2;
                var maxHandDis           =
                    FloatMath.Abs(
                        TrigMath.LenDegX(maxHorizontalHandDis, secStickDeg)) +
                    FloatMath.Abs(
                        TrigMath.LenDegY(maxVerticalHandDis, secStickDeg));

                var toHandDis = maxHandDis * secStickMag;

                if (!wasShieldOut)
                {
                    this.handDis_ = toHandDis;
                    this.handDeg_ = toHandDeg;
                }
                else
                {
                    var accFactor = 3;

                    this.handDis_ += (toHandDis - this.handDis_) / accFactor;
                    this.handDeg_ +=
                        TrigMath.DifferenceInDegrees(toHandDeg, this.handDeg_) /
                        accFactor;
                }
            }
        }
Ejemplo n.º 3
0
        public void ProcessInputs(ProcessInputsEvent _)
        {
            if (this.whipTimeFraction_ >= 1)
            {
                this.isWhipping_ = false;
            }
            if (this.isWhipping_)
            {
                this.whipTimeFraction_ = MathF.Min(this.whipTimeFraction_ + .1f, 1);
                return;
            }

            var secondaryAnalogStick = this.gamepad_[AnalogStickType.SECONDARY];
            var secStickX            = secondaryAnalogStick.RawAxes.X;
            var secStickY            = secondaryAnalogStick.RawAxes.Y;

            var secStickMag = TrigMath.DistanceBetween(0, 0, secStickX, secStickY);

            if (secStickMag < GamepadConstants.DEADZONE)
            {
                secStickMag = 0;
            }

            this.isStoring_ = secStickMag > .8f;
            if (this.isStoring_)
            {
                var secStickDeg = TrigMath.DegreesBetween(0, 0, secStickX, secStickY);

                this.storedWhipTimer_ = 5;
                this.whipStrength_    = secStickMag;
                this.whipDeg_         = secStickDeg + 180;
            }

            var wasFlicked = this.storedWhipTimer_-- > 0 && secStickMag == 0;

            if (wasFlicked)
            {
                this.isStoring_       = false;
                this.storedWhipTimer_ = -1;

                this.isWhipping_       = true;
                this.whipTimeFraction_ = 0;

                // TODO: Move this out.
                this.playerSounds_.PlayWhipSound();
            }
        }
Ejemplo n.º 4
0
        // TODO: Remove this.
        public void UpdateMatrices()
        {
            if (this.parent_ == null)
            {
                this.endImpl_.X = this.startImpl_.X = this.Transform.X;
                this.endImpl_.Y = this.startImpl_.Y = this.Transform.Y;

                this.transform_.GlobalDeg = this.Transform.RelativeDeg;
                return;
            }

            var startX = this.startImpl_.X = this.parent_.End.X + this.Transform.X;
            var startY = this.startImpl_.Y = this.parent_.End.Y + this.Transform.Y;

            var length  = this.transform_.Length;
            var globDeg = this.transform_.GlobalDeg =
                this.parent_.transform_.GlobalDeg +
                this.transform_.RelativeDeg;

            this.endImpl_.X = startX + TrigMath.LenDegX(length, globDeg);
            this.endImpl_.Y = startY - TrigMath.LenDegY(length, globDeg);
        }
Ejemplo n.º 5
0
        private void ProcessManualInputs_()
        {
            var secondaryAnalogStick = this.gamepad_[AnalogStickType.SECONDARY];
            var secStickX            = secondaryAnalogStick.RawAxes.X;
            var secStickY            = secondaryAnalogStick.RawAxes.Y;

            var secStickMag = TrigMath.DistanceBetween(0, 0, secStickX, secStickY);

            if (secStickMag < GamepadConstants.DEADZONE)
            {
                secStickMag = 0;
            }
            var secStickDeg = TrigMath.DegreesBetween(0, 0, secStickX, secStickY);

            var isResting = secStickMag == 0;

            // TODO: Detect arcs?

            /*if (isResting) {
             * var xVel = this.playerRigidbody_.XVelocity;
             * if (xVel != 0) {
             *  var sign = FloatMath.Sign(xVel);
             *
             *  this.handDis_ = this.maxHandDis_;
             *
             *  if (this.stateMachine_.State == PlayerState.WALKING) {
             *    this.handDeg_ = 90 - sign * (90 + 45);
             *    this.swordDeg_ = 90 - sign * 45;
             *  } else if (this.stateMachine_.State == PlayerState.RUNNING) {
             *    this.handDeg_ = 90 + sign * (90 + 22);
             *    this.swordDeg_ = 90 + sign * (90 + 22);
             *  }
             * }
             * return;
             * }*/

            // Stick moves hands to lift sword. Angle needs to be closer to have
            // more of an effect.
            var diffToHeld =
                TrigMath.DifferenceInDegrees(secStickDeg, this.handDeg_);
            var normalizedDiffToHeld = MathF.Abs(diffToHeld / 180);

            var moveFactor = 1 - normalizedDiffToHeld;

            var diffToTop = TrigMath.DifferenceInDegrees(90, this.handDeg_);
            var isLifting = FloatMath.Sign(diffToTop) == FloatMath.Sign(diffToHeld);

            var moveForce  = 0f;
            var liftFactor = secStickMag * MathF.Pow(moveFactor, 5); // 4, 6, 7

            if (isLifting)
            {
                var liftForce = .6f * diffToHeld * liftFactor;   // .5f
                moveForce = liftForce;
            }
            else
            {
                var dropFactor = secStickMag;
                var dropForce  = .8f * diffToHeld * dropFactor;
                moveForce = dropForce;
            }

            var initDiffToGround   = TrigMath.DifferenceInDegrees(270, this.handDeg_);
            var gravitationalForce = 3 * FloatMath.Sign(initDiffToGround);

            var forceOnHands = moveForce + gravitationalForce;

            // TODO: Use euler method?
            this.handDegVel_ += forceOnHands;
            this.handDeg_    += this.handDegVel_;

            var minAngle          = 45;
            var finalDiffToGround = TrigMath.DifferenceInDegrees(this.handDeg_, 270);

            if (FloatMath.Abs(finalDiffToGround) < minAngle)
            {
                this.handDeg_ = 270 + FloatMath.Sign(finalDiffToGround) * minAngle;

                if (FloatMath.Abs(this.handDegVel_) > 2)
                {
                    this.handDegVel_ *= -.5f;
                }
                else
                {
                    this.handDegVel_ = 0;
                }
            }

            // TODO: This line should theoretically not be here??
            //this.handDeg_ += diffToHeld * liftFactor;
            this.handDeg_ %= 360;

            // TODO: Keep this value when the player lets go of the stick
            this.handDis_ = 16 * secStickMag;

            // TODO: Should be based on velocity instead.
            // If lifting sword, sword angle lags behind.
            //this.swordDeg_ = this.handDeg_;
            var swordDegAccFac = 1 / (1 + MathF.Abs(this.handDegVel_));

            this.swordDeg_ +=
                TrigMath.DifferenceInDegrees(this.handDeg_, this.swordDeg_) * swordDegAccFac;
        }
Ejemplo n.º 6
0
        private void TickAnimation_(TickAnimationEvent _)
        {
            var xVel = this.playerRigidbody_.XVelocity;

            var xVelSign = MathF.Sign(xVel);

            if (xVelSign != 0)
            {
                this.xDir_ = xVelSign;
            }

            var isStanding    = this.stateMachine_.State == PlayerState.STANDING;
            var isWalking     = this.stateMachine_.State == PlayerState.WALKING;
            var isRealRunning = this.stateMachine_.State == PlayerState.RUNNING;

            if (isStanding)
            {
                this.frameFraction_.Value += .01f;
            }

            if (isWalking)
            {
                var walkFraction = FloatMath.Abs(this.playerRigidbody_.XVelocity) /
                                   PlayerConstants.UPRIGHT_MAX_SLOW_XSPD;
                var animationSpeed = FloatMath.Max(.01f, .02f * walkFraction);

                this.frameFraction_.Value += animationSpeed;
            }

            if (isRealRunning)
            {
                var runFraction = FloatMath.Abs(this.playerRigidbody_.XVelocity) /
                                  PlayerConstants.UPRIGHT_MAX_FAST_XSPD;
                var animationSpeed = FloatMath.Max(.01f, .04f * runFraction);

                this.frameFraction_.Value += animationSpeed;
            }

            var frameFraction = this.frameFraction_.Value;
            var frameAngle    = this.frameFraction_.Value * 360;

            var hipWidth      = PlayerConstants.HSIZE * .6f;
            var backHipWidth  = .4f * hipWidth;
            var frontHipWidth = hipWidth - backHipWidth;

            if (isStanding)
            {
                this.hipCenter_.Transform.RelativeDeg = 0;
                this.hipLeft_.Transform.Length        = frontHipWidth;
                this.hipRight_.Transform.Length       = backHipWidth;

                var leanAngle = this.OscillateAround_(15, 15, frameAngle);

                this.upperLegLeft_.Transform.RelativeDeg  = 90 + leanAngle;
                this.upperLegRight_.Transform.RelativeDeg = -90 + leanAngle;

                this.lowerLegLeft_.Transform.RelativeDeg  = -leanAngle;
                this.lowerLegRight_.Transform.RelativeDeg = -leanAngle;
            }


            if (isWalking)
            {
                var hipAngle = TrigMath.LenDegX(15, -20 + frameAngle);
                this.hipCenter_.Transform.RelativeDeg = hipAngle;

                this.hipLeft_.Transform.Length =
                    frontHipWidth * this.OscillateAround_(1, .5f, hipAngle + 180);
                this.hipRight_.Transform.Length =
                    backHipWidth * this.OscillateAround_(1, .5f, hipAngle);

                var upperLegRange = 20;
                this.upperLegLeft_.Transform.RelativeDeg =
                    90 + TrigMath.LenDegX(upperLegRange / 2, frameAngle);
                this.upperLegRight_.Transform.RelativeDeg =
                    -90 + TrigMath.LenDegX(upperLegRange / 2, frameAngle + 180);

                var lowerLegAngle = -15 + frameAngle;
                var lowerLegRange = 30;
                this.lowerLegLeft_.Transform.RelativeDeg =
                    -lowerLegRange / 2 +
                    TrigMath.LenDegX(lowerLegRange / 2, lowerLegAngle);
                this.lowerLegRight_.Transform.RelativeDeg =
                    -lowerLegRange / 2 +
                    TrigMath.LenDegX(lowerLegRange / 2, lowerLegAngle + 180);
            }


            if (isRealRunning)
            {
                var hipAngle = TrigMath.LenDegX(15, -45 + frameAngle);
                this.hipCenter_.Transform.RelativeDeg = hipAngle;

                this.hipLeft_.Transform.Length =
                    frontHipWidth * this.OscillateAround_(1, .5f, hipAngle + 180);
                this.hipRight_.Transform.Length =
                    backHipWidth * this.OscillateAround_(1, .5f, hipAngle);

                this.upperLegLeft_.Transform.RelativeDeg =
                    180 + this.CalcUpperBoneAngle_(frameFraction, false);
                this.upperLegRight_.Transform.RelativeDeg =
                    this.CalcUpperBoneAngle_(frameFraction, true);

                this.lowerLegLeft_.Transform.RelativeDeg =
                    this.CalcLowerBoneAngle_(frameFraction, false);
                this.lowerLegRight_.Transform.RelativeDeg =
                    this.CalcLowerBoneAngle_(frameFraction, true);
            }

            // TODO: Should this happen automatically?
            this.ForEachBone_(bone => bone.UpdateMatrices());

            var leftHeight =
                FloatMath.Abs(TrigMath.LenDegY(this.upperLegLeft_.Transform.Length,
                                               this.upperLegLeft_.Transform
                                               .GlobalDeg)) +
                FloatMath.Abs(TrigMath.LenDegY(this.lowerLegLeft_.Transform.Length,
                                               this.lowerLegLeft_.Transform
                                               .GlobalDeg));
            var rightHeight =
                FloatMath.Abs(TrigMath.LenDegY(this.upperLegRight_.Transform.Length,
                                               this.upperLegRight_.Transform
                                               .GlobalDeg)) +
                FloatMath.Abs(TrigMath.LenDegY(this.lowerLegRight_.Transform.Length,
                                               this.lowerLegRight_.Transform
                                               .GlobalDeg));

            this.legHeight_ = FloatMath.Max(leftHeight, rightHeight);
        }