Mit der Zeit schneller
Teil des Abschnitts Die Spielschleife der Pygame-Journey von Coddy. Lektion 32 von 32.
Ein Spiel wird mit zunehmender Spieldauer schwieriger. Hier fallen die Blöcke alle 10 Sekunden etwas schneller.
pygame.time.set_timer(event_type, ms) löst alle ms Millisekunden ein Ereignis dieses Typs aus. Erstelle deinen eigenen Ereignistyp mit pygame.USEREVENT, einer Zahl, die pygame für dich freihält:
SPEED_UP = pygame.USEREVENT + 1
pygame.time.set_timer(SPEED_UP, 10000)
fall_speed = 3
for event in pygame.event.get():
if event.type == SPEED_UP:
fall_speed += 1Das Ereignis trifft zusammen mit den anderen in der Ereignisschleife ein, einmal alle 10 Sekunden. Dann fällt der Block mit block.y += fall_speed statt mit einer festen Geschwindigkeit von 3. Ein neues Spiel beginnt wieder langsam, daher wird beim Neustart auch fall_speed = 3 gesetzt.
Aufgabe
Mittel- Erstelle unterhalb der Schriftart
SPEED_UP = pygame.USEREVENT + 1und starte dafür einen Timer, der alle 10000 ms ausgelöst wird. - Setze
fall_speed = 3vor der Schleife und verwende den Wert für den Fall. - Erhöhe
fall_speedum 1, wenn ein SPEED_UP-Ereignis eintrifft. - Setze den Wert wieder auf 3, wenn R ein neues Spiel startet.
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
paused = False
running = True
while running:
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
elif event.key == pygame.K_r and (lives == 0 or score == 10):
score = 0
lives = 3
basket.x = 200
block.y = -20
block.x = random.randint(0, 460)
if lives > 0 and score < 10 and not paused:
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)))
if lives == 0 or score == 10:
again = font.render("Press R to play again", True, (240, 240, 240))
screen.blit(again, again.get_rect(center=(240, 200)))
if paused:
message = font.render("Paused", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 160)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Die Spielschleife
2Formen und Farben
Kreise, Linien, VieleckeUmrisse und EckenEine Szene aus FormenFarben, die sich ändern5Fang die Blöcke
Der KorbEin fallender BlockÜbe selbstständig: Pygame-Playground