XNA - Hold longer to jump higher

后端 未结 2 1118
野趣味
野趣味 2021-01-27 07:35

I\'m looking for a simple method for my game, so that when you hold down the space bar, you jump higher. When you \'tap\' you don\'t jump to maximum height. There would need to

2条回答
  •  心在旅途
    2021-01-27 08:34

    During the accent of a jump, the Y velocity is completely overridden by a power curve. During the decent, gravity takes over. The jump velocity is controlled by the jumpTime field which measures time into the accent of the current jump.

    First off you will need some simple global variables,

    public bool isJumping; //Is the player in a jump?
    private bool wasJumping; //Did the player just exit a jump?
    private float jumpTime; //Time the player has been in a jump (Useful for adding a power curve or to max out on jump height)
    
    MaxJumpTime = .8f; //If you want to max out a jump, otherwise remove the relevant parts of the code
    JumpLaunchVelocity = -3000.0f; //How much velocity to "jump" with, this may depend on your speed of your player, so it will need some ajustment
    

    Here is the function that does most of the work:

     private float DoJump(float velocityY, GameTime gameTime)
            {
                // If the player wants to jump
                if (isJumping)
                {
                    // Begin or continue a jump
                    if ((!wasJumping && IsOnGround) || jumpTime > 0.0f)
                    {
                        //Do things like animate, or play a sound here
                        jumpTime += (float)gameTime.ElapsedGameTime.TotalSeconds;
                    }
    
                    // If we are in the ascent of the jump
                    if (0.0f < jumpTime && jumpTime <= MaxJumpTime)
                    {
                        // Fully override the vertical velocity with a power curve that gives players more control over the top of the jump (If you dont want this you can remove the Math.Pow)
                        velocityY = JumpLaunchVelocity * (1.0f - (float)Math.Pow(jumpTime / MaxJumpTime, JumpControlPower));
                    }
                    else
                        jumpTime = 0.0f;   // Reached the apex of the jump
                }
                else
                {
                    // Continues not jumping or cancels a jump in progress
                    jumpTime = 0.0f;
                }
                wasJumping = isJumping;
    
                return velocityY;
            }
    

    In your update when you calculate position and stuff:

    velocity.Y = DoJump(velocity.Y, gameTime);
    

    Take a look at the Platformer Starter Kit if you run into any problems!

提交回复
热议问题