Menu
CoddyTech

Nhảy

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

Một cú nhảy là tốc độ hướng lên mà trọng lực làm giảm dần. Cho người chạy một tốc độ theo chiều dọc, vy. Mỗi khung hình, trọng lực cộng thêm 1 vào tốc độ này và người chạy di chuyển một đoạn bằng tốc độ đó:

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

Giá trị y tăng theo hướng xuống dưới, vì vậy một cú nhảy đặt vy = -16: người chạy bay lên 15 pixel, rồi 14, rồi 13, chậm dần đến khi dừng lại ở độ cao khoảng 120 pixel, sau đó rơi xuống ngày càng nhanh. Khi chạm đường mặt đất, người chạy được đưa lên đường đó rồi dừng lại.

Chỉ nhảy khi đang ở trên mặt đất. Nếu không kiểm tra điều kiện này, mỗi lần nhấn nút khi đang ở trên không sẽ bắt đầu một cú nhảy mới, và người chạy có thể bay lên mãi:

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

Phần 5 sẽ phát triển nội dung này bằng cách thêm các bục để đáp xuống.

challenge icon

Thử thách

Trung bình

Khiến nhân vật chạy nhảy lên.

  1. Thêm GRAVITY = 1 và self.vy = 0 cho nhân vật chạy.
  2. Viết update() như bên dưới và gọi runner.update() ở mỗi khung hình, trước khi vẽ.
  3. Viết jump(): đặt vy = -16 chỉ khi nhân vật chạy đang ở trên mặt đất. Nhấn phím cách hoặc phím mũi tên lên để gọi runner.jump().

Nhấn Chơi rồi nhấn phím cách: nhân vật chạy sẽ nhảy lên và tiếp đất. 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


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


runner = Runner()

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

    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