Menu
CoddyTech

히트 스톱

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

큰 타격은 게임이 찰나 동안 멈추면 더 강하게 느껴집니다. 격투 게임과 액션 게임에서는 이런 방식을 자주 사용합니다. 강한 타격이 들어오면 몇 프레임 동안 모든 것이 멈췄다가 다시 진행됩니다. 이를 히트 스톱이라고 합니다.

멈춤이 끝날 때까지 남은 프레임 수를 세는 카운터를 다시 사용합니다. 값이 0보다 크면 카운터를 줄이고 업데이트 전체를 건너뜁니다. 화면에는 계속 그림을 그려 멈춘 순간이 화면에 유지되도록 합니다.

if freeze > 0:
    freeze -= 1
else:
    enemy.x += enemy_speed
    # ... 나머지 업데이트

중요한 타격에만 값을 설정합니다. 여기서는 세 번째 타격으로 적을 물리치므로, 해당 타격에서 freeze = 12로 설정합니다. 이는 5분의 1초입니다. 작은 타격마다 멈추게 하면 게임이 강렬해지는 대신 뻑뻑하게 느껴집니다.

플래시 카운터도 업데이트의 일부이므로 함께 멈춥니다. 적은 멈춤이 끝날 때까지 계속 하얗게 빛나고, 폭발음은 울려 퍼진 뒤 게임이 다시 진행됩니다. 멈춤 중에도 이벤트는 계속 실행되므로, 그때 키를 누른 플레이어의 입력이 무시되지 않습니다. 여기서는 hp > 0일 때만 Space 키로 공격합니다.

challenge icon

챌린지

중급

적은 좌우로 움직이며, Space 키로 세 번 맞히면 적을 물리칩니다. 적을 물리치는 타격 순간 게임을 멈추세요:

  1. 루프 앞에서 freeze = 0을 설정하세요.
  2. 타격으로 hp가 0이 되는 곳에서 freeze = 12를 설정하세요.
  3. 업데이트에서 freeze가 0보다 큰 동안 1씩 줄이고 업데이트의 나머지 작업은 모두 건너뛰세요. 그리기는 그대로 유지하세요.

직접 해보기

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()

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

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