Menu
CoddyTech

Tường bên trái và bên phải

Thuộc phần Thế giới trò chơi trong hành trình Pygame của Coddy. Bài học 15 trên 36.

Các khối đã được vẽ, nhưng người chơi đi xuyên qua chúng. Tường phải chặn người chơi. Trước tiên, hãy di chuyển rồi chỉnh lại bước di chuyển: nếu người chơi đang chồng lên tường, hãy đẩy người chơi ra ngoài về phía họ vừa đi tới.

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

dx là bước di chuyển ngang trong khung hình này: số dương là sang phải. Khi di chuyển sang phải, người chơi chạm vào mặt trái của tường, nên cạnh phải của người chơi sẽ nằm ở đó. Khi di chuyển sang trái, cạnh trái của người chơi sẽ nằm ở mặt phải của tường.

Bản đồ được tạo sẵn trong walls, một danh sách Rect, giống như trong bài học Maps from Text. Sàn vẫn là đường tại FLOOR, và người chơi vẫn có thể rơi xuống phần trên của một khối: tiếp theo là xử lý việc đáp xuống tường.

challenge icon

Thử thách

Trung bình

Khiến tường chặn người chơi.

  1. Sau player.x += dx, duyệt qua walls.
  2. Với mỗi bức tường mà người chơi va chạm: khi dx > 0, đặt player.right = wall.left; khi dx < 0, đặt player.left = wall.right.

Nhấn Chơi rồi đi vào tường: người chơi sẽ dừng lại trước tường. Sau đó nhấn Kiểm tra.

Tự làm thử

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

Tất cả bài học trong Thế giới trò chơi

Tự luyện tập: Playground Pygame