Mit der Zeit schneller
Lektion 18 von 40 im Kurs Spiele mit Pygame erstellen von Coddy.
Ein Spiel wird im Laufe der Zeit 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 mit pygame.USEREVENT deinen eigenen Ereignistyp. Das ist eine 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 erscheint zusammen mit den anderen alle 10 Sekunden in der Ereignisschleife. Danach 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- Lege unterhalb der Schriftart
SPEED_UP = pygame.USEREVENT + 1fest und starte dafür einen Timer, der alle 10000 ms ausgelöst wird. - Setze
fall_speed = 3vor der Schleife und verwende diesen 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 Spiele mit Pygame erstellen
2Ereignisse und Kollisionen
Der KorbEin fallender BlockÜbe selbstständig: Pygame-Playground