Menu
CoddyTech

Pause

Teil des Abschnitts Die Spielschleife der Pygame-Journey von Coddy. Lektion 30 von 32.

Es gibt zwei Möglichkeiten, die Tastatur abzufragen. pygame.key.get_pressed() gibt in jedem Frame an, welche Tasten gerade gedrückt gehalten werden: geeignet für Bewegungen. Ein KEYDOWN-Ereignis tritt einmal auf, in dem Frame, in dem die Taste gedrückt wird, so wie MOUSEBUTTONDOWN bei einem Klick: geeignet für Aktionen, die einmal pro Tastendruck stattfinden.

Das Pausieren ist eine Aktion, die einmal pro Tastendruck stattfindet. Mit get_pressed würde das Gedrückthalten von P für einen Moment die Pause in jedem Frame ein- und ausschalten. Mit dem Ereignis wird sie einmal umgeschaltet:

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 wandelt True in False um und umgekehrt. Füge die Pause zur Bedingung hinzu, die das Spiel ausführt, und zeige Paused an, solange sie aktiv ist.

challenge icon

Aufgabe

Mittel
  1. Setze vor der Schleife paused = False.
  2. Wechsle in der Ereignisschleife den Wert von paused, wenn die Taste eines KEYDOWN-Ereignisses pygame.K_p ist.
  3. Führe das Spiel nur aus, wenn es nicht pausiert ist: if lives > 0 and score < 10 and not paused:.
  4. Wenn paused wahr ist, zeige Paused zentriert bei (240, 160) an.

Probier es selbst

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()

Alle Lektionen in Die Spielschleife

Übe selbstständig: Pygame-Playground