Menu
CoddyTech

점프 버퍼

Coddy Pygame 여정의 게임 월드 섹션에 포함된 레슨. 35개 중 14번째.

플레이어는 착지하는 순간이 다가오는 것을 보면 점프 버튼을 누르며, 대개 몇 프레임 일찍 누릅니다. KEYDOWN 이벤트에서 점프를 처리하면, 그 버튼을 눌렀을 때 플레이어가 공중에 있어 입력이 무시됩니다. 플레이어는 게임이 자신의 입력을 무시했다고 느낍니다.

점프 버퍼는 몇 프레임 동안 입력을 기억합니다. 이벤트에서는 타이머만 시작합니다.

elif event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
    jump_timer = JUMP_BUFFER

매 프레임 중력 적용 전에 타이머가 아직 작동 중이고 플레이어가 지면에 있으면 점프하고, 타이머를 줄입니다.

if jump_timer > 0 and on_ground:
    vel_y = JUMP
    jump_timer = 0
if jump_timer > 0:
    jump_timer -= 1

JUMP_BUFFER = 6이면 입력은 6프레임, 즉 10분의 1초 동안 유효합니다. 일찍 누른 입력을 받아들이기에는 충분히 길고, 착지보다 훨씬 전에 누른 입력으로 갑자기 점프하지 않을 만큼 짧습니다. 지면에서 누른 입력도 다음 프레임에 점프합니다.

challenge icon

챌린지

어려움
  1. 맨 위에 JUMP_BUFFER = 6을 추가하고 루프 앞에 jump_timer = 0을 추가합니다.
  2. Space 키 또는 Up 키의 KEYDOWN 이벤트가 발생하면 점프하는 대신 jump_timer = JUMP_BUFFER로 설정합니다.
  3. 매 프레임 중력 적용 전에 jump_timer > 0이고 on_ground일 때 vel_y = JUMP와 jump_timer = 0으로 설정합니다. 그런 다음 jump_timer > 0이면 값을 1 줄입니다.

직접 해보기

import pygame

TILE = 36
FLOOR = 324
GRAVITY = 1
JUMP = -15
MAX_FALL = 12

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Jump Buffer")
clock = pygame.time.Clock()

background = pygame.image.load("assets/backgrounds/clouds.png").convert_alpha()
grass_img = pygame.image.load("assets/images/grass.png").convert_alpha()
player_img = pygame.image.load("assets/images/player.png").convert_alpha()

player = player_img.get_rect(topleft=(264, 40))
vel_y = 0
on_ground = False

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 in (pygame.K_SPACE, pygame.K_UP):
            if on_ground:
                vel_y = JUMP
        elif event.type == pygame.KEYUP and event.key in (pygame.K_SPACE, pygame.K_UP):
            if vel_y < -4:
                vel_y = -4

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= 4
    if keys[pygame.K_RIGHT]:
        player.x += 4

    vel_y = min(vel_y + GRAVITY, MAX_FALL)
    player.y += vel_y
    on_ground = False
    if player.bottom > FLOOR:
        player.bottom = FLOOR
        vel_y = 0
        on_ground = True

    for y in range(0, 360, 72):
        for x in range(0, 576, 72):
            screen.blit(background, (x, y))
    for x in range(0, 576, TILE):
        screen.blit(grass_img, (x, FLOOR))
    screen.blit(player_img, player)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz icon실력 점검

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

게임 월드의 모든 레슨

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