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 UpdatesSetze 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.
Aufgabe
MittelDer Gegner läuft nach links und rechts; drei Treffer mit der Leertaste besiegen ihn. Halte das Spiel nach dem entscheidenden Treffer an:
- Setze
freeze = 0vor der Schleife. - Wenn der Treffer
hpauf 0 senkt, setzefreeze = 12. - Verringere in der Aktualisierung
freezeum 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