왼쪽과 오른쪽 벽
Coddy Pygame 여정의 게임 월드 섹션에 포함된 레슨. 35개 중 15번째.
블록은 그려지지만 플레이어가 블록을 통과합니다. 벽은 플레이어를 멈춰야 합니다. 먼저 이동한 다음 이동을 바로잡으세요. 플레이어가 이제 벽과 겹친다면, 들어온 쪽으로 밀어내세요.
player.x += dx
for wall in walls:
if player.colliderect(wall):
if dx > 0:
player.right = wall.left
elif dx < 0:
player.left = wall.rightdx는 이번 프레임의 좌우 이동량입니다. 양수이면 오른쪽으로 이동합니다. 오른쪽으로 이동할 때 플레이어가 벽의 왼쪽 면에 부딪히므로, 플레이어의 오른쪽 가장자리를 그 위치에 둡니다. 왼쪽으로 이동할 때는 플레이어의 왼쪽 가장자리를 벽의 오른쪽 면에 둡니다.
맵은 Maps from Text에서와 같은 방식으로 Rect 목록인 walls에 만들어집니다. 바닥은 여전히 FLOOR 위치의 선이며, 플레이어는 여전히 블록 위쪽으로 떨어질 수 있습니다. 벽 위에 착지하는 방법은 다음에 알아봅니다.
챌린지
중급player.x += dx다음에walls를 반복해서 살펴보세요.- 플레이어가 충돌하는 각 벽에 대해,
dx > 0이면player.right = wall.left로 설정하고,dx < 0이면player.left = wall.right로 설정하세요.
직접 해보기
import pygame
TILE = 36
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12
FLOOR = 324
LEVEL = [
"................",
"................",
"................",
"................",
"................",
"................",
"................",
"#..........##..#",
"#.P..#.....##..#",
"################",
]
pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Walls")
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
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 wall in walls:
screen.blit(block_img, wall)
screen.blit(player_img, player)
pygame.display.flip()
clock.tick(60)
pygame.quit()
게임 월드의 모든 레슨
직접 연습해 보세요: Pygame 플레이그라운드