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.
Thử thách
Trung bìnhHiển thị màn chơi lần lượt từng màn hình.
- Trước vòng lặp trò chơi, tạo
level_width = len(LEVEL[0]) * TILEvàlevel = pygame.Rect(0, 0, level_width, 360). - Giữ người chơi bên trong
levelthay vìscreen.get_rect(). - 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-offsettrê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
1Bản đồ dạng văn bản
Một màn chơi bằng văn bảnHàng và cộtCác chữ cái mang ý nghĩaNơi người chơi bắt đầuTừng màn hình mộtTự luyện tập: Playground Pygame