Menu
CoddyTech

Pause

Part of the The Game Loop section of Coddy's Pygame journey. Lesson 30 of 32.

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
  1. Before the loop, set paused = False.
  2. In the event loop, flip paused when a KEYDOWN event's key is pygame.K_p.
  3. Run the game only when it is not paused: if lives > 0 and score < 10 and not paused:.
  4. When paused is true, show Paused centred at (240, 160).

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 The Game Loop

Practice on your own: Pygame playground