Menu
CoddyTech

Trefferstopp

Teil des Abschnitts Sound und Spielgefühl der Pygame-Journey von Coddy. Lektion 14 von 23.

Ein kräftiger Treffer wirkt härter, wenn das Spiel für einen Sekundenbruchteil anhält. Kampf- und Actionspiele machen das ständig: Bei einem starken Schlag friert alles für ein paar Frames ein und läuft dann weiter. Das nennt man Trefferstopp.

Verwende wieder einen Zähler für die verbleibenden Frames des Einfrierens. Solange er über 0 liegt, zählst du ihn herunter und überspringst das gesamte Update. Zeichne weiter, damit der eingefrorene Moment auf dem Bildschirm bleibt:

if freeze > 0:
    freeze -= 1
else:
    enemy.x += enemy_speed
    # ... der Rest des Updates

Setze ihn nur bei den Treffern, die wichtig sind. Hier besiegt der dritte Treffer den Gegner, also setzt dieser Treffer freeze = 12, ein Fünftel einer Sekunde. Wenn das Spiel bei jedem kleinen Treffer einfriert, fühlt es sich zäh statt kraftvoll an.

Der Blitz-Zähler ist Teil des Updates und wartet deshalb ebenfalls: Der Gegner bleibt während des gesamten Einfrierens weiß, der Explosionssound klingt nach und dann läuft das Spiel weiter. Ereignisse werden während des Einfrierens weiterhin verarbeitet, sodass ein Spieler, der dann eine Taste drückt, nicht ignoriert wird; hier trifft die Leertaste nur, wenn hp > 0.

challenge icon

Aufgabe

Mittel

Der Gegner läuft nach links und rechts; drei Treffer mit der Leertaste besiegen ihn. Halte das Spiel nach dem entscheidenden Treffer an:

  1. Setze freeze = 0 vor der Schleife.
  2. Wenn der Treffer hp auf 0 senkt, setze freeze = 12.
  3. Verringere in der Aktualisierung freeze um 1, solange der Wert größer als 0 ist, und überspringe alles andere in der Aktualisierung. Lass das Zeichnen unverändert.

Probier es selbst

import pygame

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

hit_sound = pygame.mixer.Sound("assets/sounds/hit.ogg")
explosion_sound = pygame.mixer.Sound("assets/sounds/explosion.ogg")
enemy = pygame.Rect(100, 150, 60, 60)
enemy_speed = 2
hp = 3
flash = 0
defeated = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE and hp > 0:
            hp -= 1
            flash = 6
            if hp == 0:
                explosion_sound.play()
            else:
                hit_sound.play()

    enemy.x += enemy_speed
    if enemy.left < 40 or enemy.right > 440:
        enemy_speed = -enemy_speed
    if flash > 0:
        flash -= 1
    if hp == 0:
        defeated += 1
        hp = 3
        enemy.x = 100

    screen.fill((30, 30, 46))
    if flash > 0:
        pygame.draw.rect(screen, (255, 255, 255), enemy)
    else:
        pygame.draw.rect(screen, (220, 80, 80), enemy)
    label = font.render(f"HP: {hp}   Defeated: {defeated}", True, (240, 240, 240))
    screen.blit(label, (20, 20))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Alle Lektionen in Sound und Spielgefühl

Übe selbstständig: Pygame-Playground