Jumping & Boundaries
Subscribe to Tech with Tim
Setting Boundaries
In the last tutorial we created a rectangle that we could move around the screen using the arrow keys. However, when we reach the end of the screen the rectangle is still allowed to continue to move. To stop this we need to set up some boundaries and check that our rectangle is within them before moving it again.
To do this we can simply check the x and y coordinates of the rectangle against the dimensions of the screen. When we do this we need to remember that when we draw something in pygame we draw from the top left hand corner of the object. This means the top left corner will be our x and y values while the top right corner will be (x + width, y) and the bottom left will be (x, y + height).
import pygame pygame.init() win = pygame.display.set_mode((500,500)) pygame.display.set_caption("First Game") x = 50 y = 50 width = 40 height = 60 vel = 5 run = True while run: pygame.time.delay(100) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and x > vel: # Making sure the top left position of our character is greater than our vel so we never move off the screen. x -= vel if keys[pygame.K_RIGHT] and x < 500 - vel - width: # Making sure the top right corner of our character is less than the screen width - its width x += vel if keys[pygame.K_UP] and y > vel: # Same principles apply for the y coordinate y -= vel if keys[pygame.K_DOWN] and y < 500 - height - vel: y += vel win.fill((0,0,0)) pygame.draw.rect(win, (255,0,0), (x, y, width, height)) pygame.display.update() pygame.quit()
Now our character can not move off the screen!
Jumping
To jump we need to set up a few variables.
# These go near the top of your program, outside the while loop isJump = False jumpCount = 10
Now we are going to check to see if the user hits the space bar. If they do we will change isJump to True and start jumping.
# Goes inside the while loop, under event for moving down if keys[pygame.K_SPACE]: isJump = True
Now when we are jumping we do not want to allow the user to jump again or to be able to move up and down. To disallow the user from doing this we will add another if/else statement.
import pygame pygame.init() win = pygame.display.set_mode((500,500)) pygame.display.set_caption("First Game") x = 50 y = 50 width = 40 height = 60 vel = 5 isJump = False jumpCount = 10 run = True while run: pygame.time.delay(100) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and x > vel: # Making sure the top left position of our character is greater than our vel so we never move off the screen. x -= vel if keys[pygame.K_RIGHT] and x < 500 - vel - width: # Making sure the top right corner of our character is less than the screen width - its width x += vel if not(isJump): # Checks is user is not jumping if keys[pygame.K_UP] and y > vel: # Same principles apply for the y coordinate y -= vel if keys[pygame.K_DOWN] and y < 500 - height - vel: y += vel if keys[pygame.K_SPACE]: isJump = True else: # This is what will happen if we are jumping win.fill((0,0,0)) pygame.draw.rect(win, (255,0,0), (x, y, width, height)) pygame.display.update() pygame.quit()
We are now going to start writing the code for making the character jump. We are going to implement a quadratic formula for our jumping. This is because ideally we would like our jump to be smooth and look something like this:
Inside of the else we will paste the following.
if jumpCount >= -10: y -= (jumpCount * abs(jumpCount)) * 0.5 jumpCount -= 1 else: # This will execute if our jump is finished jumpCount = 10 isJump = False # Resetting our Variables
And now our character can jump!
If you are confused by this please refer to the video starting at 11:00.
Note: I use abs() use instead of ** just to eliminate the need for the neg variable seen in the video. Both versions of this code work the same.
Full Code
Here is what your full code should look like.
import pygame pygame.init() win = pygame.display.set_mode((500,500)) pygame.display.set_caption("First Game") x = 50 y = 50 width = 40 height = 60 vel = 5 isJump = False jumpCount = 10 run = True while run: pygame.time.delay(100) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and x > vel: x -= vel if keys[pygame.K_RIGHT] and x < 500 - vel - width: x += vel if not(isJump): if keys[pygame.K_UP] and y > vel: y -= vel if keys[pygame.K_DOWN] and y < 500 - height - vel: y += vel if keys[pygame.K_SPACE]: isJump = True else: if jumpCount >= -10: y -= (jumpCount * abs(jumpCount)) * 0.5 jumpCount -= 1 else: jumpCount = 10 isJump = False win.fill((0,0,0)) pygame.draw.rect(win, (255,0,0), (x, y, width, height)) pygame.display.update() pygame.quit()