Menu
CoddyTech

머리 부딪치기

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

플랫폼 아래에서 점프하면 플레이어가 플랫폼을 뚫고 올라간 다음 위에 착지합니다. 단단한 플랫폼은 머리를 막아야 합니다. 위로 이동할 때 vel_y는 음수이므로, 수직 이동 반복문에 다른 경우를 추가하세요.

vel_y = min(vel_y + GRAVITY, MAX_FALL)
player.y += vel_y
on_ground = False
for wall in walls:
    if player.colliderect(wall):
        if vel_y > 0:
            player.bottom = wall.top
            on_ground = True
        elif vel_y < 0:
            player.top = wall.bottom
        vel_y = 0

머리가 벽의 아래쪽에 닿고, 두 경우 모두 속도가 0이 됩니다. 부딪힌 뒤에는 중력이 즉시 낙하를 시작시킵니다. vel_y = 0이 없으면 플레이어는 계속 위로 이동하려고 하며, 중력이 점프를 모두 소진할 때까지 플랫폼 아래에 붙어 있게 됩니다.

vel_y의 부호는 플레이어가 어느 쪽에서 왔는지 알려줍니다. 이는 벽에서 dx가 하던 역할과 같습니다. 떨어질 때는 벽의 위쪽에 부딪히고, 올라갈 때는 아래쪽에 부딪힙니다.

challenge icon

챌린지

쉬움
  1. 수직 충돌 반복문에 다음 경우를 추가하세요: vel_y < 0: player.top = wall.bottom.
  2. 두 경우 모두 처리한 뒤 vel_y = 0으로 설정하여, 머리에 부딪히면 상승이 멈추게 하세요.

플레이어는 플랫폼 아래에서 시작합니다. 점프해서 확인해 보세요.

직접 해보기

import pygame

TILE = 36
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12

LEVEL = [
    "................",
    "................",
    "................",
    "..........###...",
    "................",
    "................",
    "...#####........",
    "............#...",
    "#....P......#..#",
    "################",
]

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

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

walls = []
for row, line in enumerate(LEVEL):
    for col, char in enumerate(line):
        if char == "#":
            walls.append(pygame.Rect(col * TILE, row * TILE, TILE, TILE))
        elif char == "P":
            start = (col * TILE + TILE // 2, row * TILE + TILE)

player = player_img.get_rect(midbottom=start)
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()
    dx = 0
    if keys[pygame.K_LEFT]:
        dx -= SPEED
    if keys[pygame.K_RIGHT]:
        dx += SPEED

    player.x += dx
    for wall in walls:
        if player.colliderect(wall):
            if dx > 0:
                player.right = wall.left
            elif dx < 0:
                player.left = wall.right

    vel_y = min(vel_y + GRAVITY, MAX_FALL)
    player.y += vel_y
    on_ground = False
    for wall in walls:
        if player.colliderect(wall):
            if vel_y > 0:
                player.bottom = wall.top
                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 wall in walls:
        screen.blit(block_img, wall)
    screen.blit(player_img, player)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

게임 월드의 모든 레슨

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