Menu
CoddyTech

소리와 누르고 있는 키

Coddy Pygame 여정의 사운드와 게임의 손맛 섹션에 포함된 레슨. 23개 중 4번째.

스페이스바를 누르고 있으면 우주선이 12프레임마다 레이저를 발사합니다. 시작 코드는 다음과 같이 레이저 소리를 재생합니다.

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

keys[pygame.K_SPACE]는 키를 누르고 있는 모든 프레임에서 참입니다. 따라서 스페이스바를 누르고 있는 동안 소리가 초당 60번 시작되지만, 레이저는 5발만 발사됩니다. 발사음 대신 거친 윙윙거리는 소리가 들립니다.

해결 방법은 앞에서와 같은 규칙입니다. 어떤 일이 일어나는 곳에서 소리를 재생하세요. 발사는 if cooldown == 0: 안에서 일어나므로, 소리도 그곳에서 재생합니다.

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

이제 레이저가 발사될 때마다 소리가 나고, 다른 때에는 소리가 나지 않습니다. 점프처럼 누를 때 한 번만 일어나는 동작은 대신 KEYDOWN 이벤트에서 소리를 재생하세요. 키를 얼마나 오래 누르고 있든 누를 때마다 이벤트는 하나만 발생합니다.

challenge icon

챌린지

쉬움

Space를 누르고 있으면 함선이 12프레임마다 레이저를 발사하지만, 소리가 웅웅거립니다. laser_sound.play()를 발사된 각 레이저마다 한 번씩 재생되도록 이동하세요. 레이저를 추가한 다음, if cooldown == 0: 분기 안으로 옮기세요.

직접 해보기

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 icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

사운드와 게임의 손맛의 모든 레슨

직접 연습해 보세요: Pygame 플레이그라운드