Menu
CoddyTech

Sounds und gedrückte Tasten

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

Halte die Leertaste gedrückt, und das Raumschiff feuert alle 12 Frames einen Laser ab. Das Starterprojekt spielt den Laser-Sound so ab:

if keys[pygame.K_SPACE]:
    laser_sound.play()
    if cooldown == 0:
        lasers.append(...)

keys[pygame.K_SPACE] ist in jedem Frame wahr, in dem die Taste gedrückt ist. Wenn du also die Leertaste gedrückt hältst, startet der Sound 60-mal pro Sekunde, obwohl nur 5 Laser fliegen. Statt Schüssen hörst du ein raues Brummen.

Die Lösung folgt derselben Regel wie zuvor: Spiele den Sound dort ab, wo die Aktion stattfindet. Ein Schuss wird innerhalb von if cooldown == 0: abgegeben, also gehört der Sound dorthin:

if keys[pygame.K_SPACE]:
    if cooldown == 0:
        lasers.append(...)
        laser_sound.play()

Jetzt hat jeder Laser seinen Sound, und sonst nichts. Spiele den Sound bei einer Aktion, die einmal pro Tastendruck stattfindet, etwa einem Sprung, stattdessen im KEYDOWN-Ereignis ab: Pro Tastendruck gibt es ein Ereignis, egal wie lange die Taste gedrückt bleibt.

challenge icon

Aufgabe

Einfach

Halte die Leertaste gedrückt, und das Schiff feuert alle 12 Frames einen Laser ab, aber der Ton brummt. Verschiebe laser_sound.play(), damit der Ton für jeden abgefeuerten Laser einmal abgespielt wird: in den Zweig if cooldown == 0:, nachdem der Laser hinzugefügt wurde.

Probier es selbst

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Lasers")
clock = pygame.time.Clock()

laser_sound = pygame.mixer.Sound("assets/sounds/laser.ogg")
laser_sound.set_volume(0.5)

ship = pygame.Rect(220, 300, 40, 30)
lasers = []
cooldown = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        ship.x -= 5
    if keys[pygame.K_RIGHT]:
        ship.x += 5
    ship.clamp_ip(screen.get_rect())

    if cooldown > 0:
        cooldown -= 1
    if keys[pygame.K_SPACE]:
        laser_sound.play()
        if cooldown == 0:
            lasers.append(pygame.Rect(ship.centerx - 2, ship.top - 12, 4, 12))
            cooldown = 12

    for laser in lasers:
        laser.y -= 8
    lasers = [laser for laser in lasers if laser.bottom > 0]

    screen.fill((30, 30, 46))
    for laser in lasers:
        pygame.draw.rect(screen, (255, 230, 90), laser)
    pygame.draw.rect(screen, (80, 200, 230), ship)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Sound und Spielgefühl

Übe selbstständig: Pygame-Playground