Menu
CoddyTech

Pause

Lesson 16 of 41 in Coddy's Make Games with Pygame course.

There are two ways to read the keyboard. pygame.key.get_pressed() says what is held right now, every frame: right for moving. A KEYDOWN event arrives once, in the frame the key goes down, as MOUSEBUTTONDOWN does for a click: right for actions that happen once per press.

Pausing is a once per press action. With get_pressed, holding P for a moment would flip the pause on and off in every frame. With the event it flips once:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_p:
            paused = not paused

not paused turns True into False and back. Add the pause to the condition that runs the game, and show Paused while it is on.

challenge icon

Challenge

Medium

Let P pause the game.

  1. Before the loop, set paused = False. In the event loop, flip it when a KEYDOWN event's key is pygame.K_p.
  2. Run the game only when lives > 0 and score < 10 and not paused.
  3. While paused, show Paused centred at (240, 160).

Press Play and tap P: the game freezes and shows Paused. Then Check.

Try it yourself

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Catch the Blocks")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

basket = pygame.Rect(200, 330, 80, 16)
block = pygame.Rect(220, 0, 20, 20)
score = 0
lives = 3

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    if lives > 0 and score < 10:
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            basket.x -= 8
        if keys[pygame.K_RIGHT]:
            basket.x += 8
        basket.clamp_ip(screen.get_rect())

        block.y += 3
        if block.top > 360:
            block.y = -20
            block.x = random.randint(0, 460)
            lives -= 1
        if block.colliderect(basket):
            block.y = -20
            block.x = random.randint(0, 460)
            score += 1

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), basket)
    pygame.draw.rect(screen, (235, 80, 80), block)
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (10, 10))
    lives_text = font.render(f"Lives: {lives}", True, (240, 240, 240))
    screen.blit(lives_text, (370, 10))
    if lives == 0:
        message = font.render("Game over", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(240, 160)))
    elif score == 10:
        message = font.render("You win!", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(240, 160)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

All lessons in Make Games with Pygame

Practice on your own: Pygame playground