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)); }
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); }