Question: I want to make my character jump. In my current attempt, the player moves up as long as I hold down SPACEv and falls down when I release SPACE.  import pygame pygame.init() window = pygame.display.set_mode((300, 300)) clock = pygame.time.Clock() rect = pygame.Rect(135, 220, 30, 30) vel = 5 run = True while run: clock.tick(100) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False keys = pygame.key.get_pressed() rect.centerx = (rect.centerx + (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * vel) % 300 if keys[pygame.K_SPACE]: rect.y -= 1 elif rect.y < 220: rect.y += 1 window.fill((0, 0, 64)) pygame.draw.rect(window, (64, 64, 64), (0, 250, 300, 100)) pygame.draw.circle(window, (255, 0, 0), rect.center, 15) pygame.display.flip() pygame.quit() exit()  However, I want the character to jump if I hit the SPACE once. I want a smooth jump animation to start when SPACE is pressed once. How would I go about this step by step?

Answer: To make a character jump you have to use the KEYDOWN event, but not pygame.key.get_pressed(). pygame.key.get_pressed () is for continuous movement when a key is held down. The keyboard events are used to trigger a single action or to start an animation such as a jump. See alos How to get keyboard input in pygame? pygame.key.get_pressed() returns a sequence with the state of each key. If a key is held down, the state for the key is True, otherwise False. Use pygame.key.get_pressed() to evaluate the current state of a button and get continuous movement. while True: for event in pygame.event.get(): if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: jump = True  Use pygame.time.Clock ("This method should be called once per frame.") you control the frames per second and thus the game speed and the duration of the jump. clock = pygame.time.Clock() while True: clock.tick(100)  The jumping should be independent of the player's movement or the general flow of control of the game. Therefore, the jump animation in the application loop must be executed in parallel to the running game. When you throw a ball or something jumps, the object makes a parabolic curve. The object gains height quickly at the beginning, but this slows down until the object begins to fall faster and faster again. The change in height of a jumping object can be described with the following sequence: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10]  Such a series can be generated with the following algorithm (y is the y coordinate of the object): jumpMax = 10 if jump: y -= jumpCount if jumpCount > -jumpMax: jumpCount -= 1 else: jump = False  A more sophisticated approach is to define constants for the gravity and player's acceleration as the player jumps: acceleration = 10 gravity = 0.5  The acceleration exerted on the player in each frame is the gravity constant, if the player jumps then the acceleration changes to the "jump" acceleration for a single frame: acc_y = gravity for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if vel_y == 0 and event.key == pygame.K_SPACE: acc_y = -acceleration  In each frame the vertical velocity is changed depending on the acceleration and the y-coordinate is changed depending on the velocity. When the player touches the ground, the vertical movement will stop: vel_y += acc_y y += vel_y if y > ground_y: y = ground_y vel_y = 0 acc_y = 0  See also Jump  Example 1:  replit.com/@Rabbid76/PyGame-Jump  import pygame pygame.init() window = pygame.display.set_mode((300, 300)) clock = pygame.time.Clock() rect = pygame.Rect(135, 220, 30, 30) vel = 5 jump = False jumpCount = 0 jumpMax = 15 run = True while run: clock.tick(50) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False if event.type == pygame.KEYDOWN: if not jump and event.key == pygame.K_SPACE: jump = True jumpCount = jumpMax keys = pygame.key.get_pressed() rect.centerx = (rect.centerx + (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * vel) % 300 if jump: rect.y -= jumpCount if jumpCount > -jumpMax: jumpCount -= 1 else: jump = False window.fill((0, 0, 64)) pygame.draw.rect(window, (64, 64, 64), (0, 250, 300, 100)) pygame.draw.circle(window, (255, 0, 0), rect.center, 15) pygame.display.flip() pygame.quit() exit()   Example 2:  replit.com/@Rabbid76/PyGame-JumpAcceleration  import pygame pygame.init() window = pygame.display.set_mode((300, 300)) clock = pygame.time.Clock() player = pygame.sprite.Sprite() player.image = pygame.Surface((30, 30), pygame.SRCALPHA) pygame.draw.circle(player.image, (255, 0, 0), (15, 15), 15) player.rect = player.image.get_rect(center = (150, 235)) all_sprites = pygame.sprite.Group([player]) y, vel_y = player.rect.bottom, 0 vel = 5 ground_y = 250 acceleration = 10 gravity = 0.5 run = True while run: clock.tick(100) acc_y = gravity for event in pygame.event.get(): if event.type == pygame.QUIT: run = False if event.type == pygame.KEYDOWN: if vel_y == 0 and event.key == pygame.K_SPACE: acc_y = -acceleration keys = pygame.key.get_pressed() player.rect.centerx = (player.rect.centerx + (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * vel) % 300 vel_y += acc_y y += vel_y if y > ground_y: y = ground_y vel_y = 0 acc_y = 0 player.rect.bottom = round(y) window.fill((0, 0, 64)) pygame.draw.rect(window, (64, 64, 64), (0, 250, 300, 100)) all_sprites.draw(window) pygame.display.flip() pygame.quit() exit()