Menu
CoddyTech

Chướng ngại vật

Thuộc phần Luật chơi trong hành trình Pygame của Coddy. Bài học 26 trên 30.

Giờ thêm thứ để bạn nhảy qua. Chướng ngại vật là một sprite bắt đầu ở phía bên kia mép phải một chút, trên mặt đất, rồi di chuyển sang trái:

class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = random.choice(obstacle_images)
        self.rect = self.image.get_rect(midbottom=(664, GROUND_Y))

    def update(self):
        self.rect.x -= speed
        if self.rect.right < 0:
            self.kill()

obstacle_images chứa quả bóng gai và khối nhầy, được tải một lần, để mỗi chướng ngại vật chọn một hình mà không cần đọc tệp. kill() xóa một sprite khỏi mọi nhóm mà nó thuộc về, nên các chướng ngại vật đi khỏi màn hình bên trái sẽ bị loại bỏ.

Giữ chúng trong một nhóm: obstacles.update() di chuyển tất cả và obstacles.draw(screen) vẽ tất cả. Bộ hẹn giờ sẽ thêm chúng. Mỗi lần bộ hẹn giờ kích hoạt, hãy khởi động lại nó với một khoảng thời gian ngẫu nhiên để người chơi không thể nhảy theo nhịp:

if event.type == SPAWN:
    obstacles.add(Obstacle())
    pygame.time.set_timer(SPAWN, random.randint(1000, 2000))

Người chạy vẫn chưa thể va phải chúng. Phần đó sẽ có ở bài tiếp theo.

challenge icon

Thử thách

Trung bình

Đưa chướng ngại vật về phía nhân vật chạy.

  1. Thêm SPAWN = pygame.USEREVENT + 1, speed = 6 và obstacle_images: spike_ball.png và blob.png.
  2. Viết sprite Obstacle như hình minh họa và một nhóm obstacles.
  3. Bắt đầu bộ hẹn giờ SPAWN ở 1500 ms; khi có SPAWN, thêm một chướng ngại vật rồi khởi động lại bộ hẹn giờ với random.randint(1000, 2000).
  4. Cập nhật và vẽ nhóm này ở mỗi khung hình.

Nhấn Chơi: chướng ngại vật xuất hiện từ bên phải. Sau đó nhấn Kiểm tra.

Tự làm thử

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 320))
pygame.display.set_caption("Sky Runner")
clock = pygame.time.Clock()

SKY = (140, 200, 240)
GROUND = (90, 160, 80)
GROUND_Y = 260
GRAVITY = 1


class Runner(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.frames = [
            pygame.image.load("assets/images/player.png").convert_alpha(),
            pygame.image.load("assets/images/player_walk.png").convert_alpha(),
        ]
        self.image = self.frames[0]
        self.step = 0
        self.rect = self.image.get_rect(midbottom=(100, GROUND_Y))
        self.vy = 0

    def jump(self):
        if self.rect.bottom == GROUND_Y:
            self.vy = -16

    def update(self):
        self.vy += GRAVITY
        self.rect.y += self.vy
        if self.rect.bottom >= GROUND_Y:
            self.rect.bottom = GROUND_Y
            self.vy = 0
        if self.rect.bottom == GROUND_Y:
            self.step += 1
            self.image = self.frames[self.step // 8 % 2]
        else:
            self.image = self.frames[1]


runner = Runner()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
            runner.jump()

    runner.update()

    screen.fill(SKY)
    pygame.draw.rect(screen, GROUND, (0, GROUND_Y, 640, 60))
    screen.blit(runner.image, runner.rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Tất cả bài học trong Luật chơi

Tự luyện tập: Playground Pygame