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.rightdx 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.
Thử thách
Trung bìnhKhiến tường chặn người chơi.
- Sau
player.x += dx, duyệt quawalls. - Với mỗi bức tường mà người chơi va chạm: khi
dx > 0, đặtplayer.right = wall.left; khidx < 0, đặtplayer.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
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ột4Va chạm với các bệ
Tường bên trái và bên phảiTiếp đất trên các bệĐụng đầuRơi khỏi màn chơiTừng trục mộtTự luyện tập: Playground Pygame