Menu
CoddyTech

Từng màn hình một

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

Một màn chơi có thể rộng hơn cửa sổ. Bản đồ này có 32 cột, tương đương hai cửa sổ, mỗi cửa sổ rộng 16 cột. Các bức tường giữ nguyên vị trí trong màn chơi: bức tường ở cột 20 nằm tại x = 720, vượt quá mép phải của cửa sổ ở vị trí 576.

Chiều rộng màn chơi được tính từ bản đồ: len(LEVEL[0]) * TILE. Giữ người chơi bên trong màn chơi, không phải bên trong cửa sổ:

level_width = len(LEVEL[0]) * TILE
level = pygame.Rect(0, 0, level_width, 360)
# trong vòng lặp
player.clamp_ip(level)

Để hiển thị phần màn chơi mà người chơi đang ở, hãy chia màn chơi thành các màn hình rộng 576 pixel. player.centerx // 576 là số màn hình, 0 hoặc 1. Vẽ mọi thứ dịch sang trái một khoảng bằng số lần chiều rộng cửa sổ đó:

offset = player.centerx // 576 * 576
pygame.draw.rect(screen, WALL, wall.move(-offset, 0))

wall.move(-offset, 0) là một bản sao của Rect được dịch sang trái; bản thân bức tường vẫn giữ nguyên vị trí trong màn chơi. Đi qua mép màn hình, cửa sổ sẽ hiển thị màn hình tiếp theo. Người chơi vẫn đi xuyên qua tường: cách chặn người chơi tại tường sẽ được trình bày trong phần Va chạm trong trò chơi đi cảnh.

challenge icon

Thử thách

Trung bình

Hiển thị màn chơi lần lượt từng màn hình.

  1. Trước vòng lặp trò chơi, tạo level_width = len(LEVEL[0]) * TILE và level = pygame.Rect(0, 0, level_width, 360).
  2. Giữ người chơi bên trong level thay vì screen.get_rect().
  3. Mỗi khung hình, đặt offset = player.centerx // 576 * 576, rồi vẽ mọi bức tường, đồng xu và người chơi sau khi dịch chuyển theo -offset trên trục x.

Nhấn Chơi rồi đi sang phải: khi vượt qua mép màn hình, màn hình thứ hai sẽ hiện ra. Sau đó nhấn Kiểm tra.

Tự làm thử

import pygame

TILE = 36
WALL = (120, 90, 60)
COIN = (255, 196, 0)
PLAYER = (80, 200, 120)

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

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Map from Text")
clock = pygame.time.Clock()

walls = []
coins = []
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 == "C":
            coins.append(pygame.Rect(col * TILE + 10, row * TILE + 10, 16, 16))
        elif char == "P":
            player = pygame.Rect(col * TILE + 4, row * TILE + 4, 28, 28)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= 4
    if keys[pygame.K_RIGHT]:
        player.x += 4
    if keys[pygame.K_UP]:
        player.y -= 4
    if keys[pygame.K_DOWN]:
        player.y += 4
    player.clamp_ip(screen.get_rect())

    screen.fill((30, 30, 46))
    for wall in walls:
        pygame.draw.rect(screen, WALL, wall)
    for coin in coins:
        pygame.draw.rect(screen, COIN, coin)
    pygame.draw.rect(screen, PLAYER, 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