Exemplo n.º 1
0
        public static IState WallJump(PlayerController p, Vector2 dir)
        {
            p.SpriteManager.SetAnimation("WallJump");
            p.SpriteManager.FaceTowards(dir);
            p.CapJumpIfRising();

            var direction = (Vector2.up + dir).normalized;

            return(new JumpState(direction, p.WallJumpForce)
                   .WithAccelerationCurve(p.WallJumpAcclerationCurve));
        }
Exemplo n.º 2
0
        public IState Execute(PlayerController p)
        {
            p.DetermineFacing();

            if (accelerationCurve != null)
            {
                var accel = p.Physics.Acceleration * accelerationCurve.Evaluate(Time.time - startTime);
                p.Move(p.Physics.Speed, accel);
            }
            else
            {
                p.Move();
            }

            // While inside the jump extend window, we don't apply gravity.
            var extendTime          = p.JumpExtendTime;
            var outsideExtendWindow = Utility.Elapsed(startTime, extendTime);

            if (outsideExtendWindow)
            {
                p.ApplyGravity();
            }

            foreach (var input in p.Input)
            {
                if (input.Action == InputActions.AttackDown)
                {
                    return(new AttackState());
                }

                // If we release the button mid-jump, cap our upward momentum and start to fall.
                if (cappable && input.Action == InputActions.JumpUp && !outsideExtendWindow)
                {
                    p.CapJumpIfRising();
                    return(CreateFallState());
                }

                // Walljumping.
                if (input.Action == InputActions.JumpDown)
                {
                    if (p.SweepForWall(Vector2.right))
                    {
                        return(PlayerController.WallJump(p, Vector2.left));
                    }
                    if (p.SweepForWall(Vector2.left))
                    {
                        return(PlayerController.WallJump(p, Vector2.right));
                    }
                }

                p.Input.Release(input);
            }

            if (p.Falling)
            {
                return(CreateFallState());
            }

            if (p.Surface.Unstable)
            {
                return(new FallSlideState());
            }

            return(null);
        }