점프 버퍼
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 -= 1JUMP_BUFFER = 6이면 입력은 6프레임, 즉 10분의 1초 동안 유효합니다. 일찍 누른 입력을 받아들이기에는 충분히 길고, 착지보다 훨씬 전에 누른 입력으로 갑자기 점프하지 않을 만큼 짧습니다. 지면에서 누른 입력도 다음 프레임에 점프합니다.
챌린지
어려움- 맨 위에
JUMP_BUFFER = 6을 추가하고 루프 앞에jump_timer = 0을 추가합니다. - Space 키 또는 Up 키의
KEYDOWN이벤트가 발생하면 점프하는 대신jump_timer = JUMP_BUFFER로 설정합니다. - 매 프레임 중력 적용 전에
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()
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
게임 월드의 모든 레슨
직접 연습해 보세요: Pygame 플레이그라운드