Menu
CoddyTech

Tốc độ rơi tối đa

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

Trọng lực liên tục làm tăng tốc độ rơi. Nếu rơi từ đủ cao, nhân vật sẽ di chuyển 30 hoặc 40 pixel trong một khung hình. Một ô cao 36 pixel, nên với tốc độ đó, nhân vật có thể xuyên thẳng qua một bệ giữa hai khung hình mà không hề chồng lên bệ.

Trong thực tế, vật rơi cũng có tốc độ tối đa. Giới hạn tốc độ bằng min:

MAX_FALL = 12
# trong vòng lặp
vel_y = min(vel_y + GRAVITY, MAX_FALL)

min trả về số nhỏ hơn trong hai số, nên tốc độ tăng thêm 1 mỗi khung hình cho đến khi đạt 12 rồi giữ nguyên. Cú nhảy bắt đầu ở -15, thấp hơn giới hạn, nên cú nhảy không thay đổi.

Mười hai bằng một phần ba chiều cao của một ô: bất kể nhân vật rơi xuống đâu, sẽ có một khung hình nhân vật chồng lên vật đó, và phép kiểm tra tiếp đất có thể phát hiện ra.

challenge icon

Thử thách

Dễ

Giới hạn tốc độ rơi của nhân vật.

  1. Thêm MAX_FALL = 12 ở đầu.
  2. Thay vel_y += GRAVITY bằng vel_y = min(vel_y + GRAVITY, MAX_FALL).

Nhấn "Chơi": nhân vật bắt đầu ở trên không và ngừng tăng tốc khi đạt 12 pixel mỗi khung hình. Sau đó nhấn "Kiểm tra".

Tự làm thử

import pygame

TILE = 36
FLOOR = 324
GRAVITY = 1
JUMP = -15

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Falling Speed")
clock = pygame.time.Clock()

background = pygame.image.load("assets/backgrounds/clouds.png").convert_alpha()
grass_img = pygame.image.load("assets/images/grass.png").convert_alpha()
player_img = pygame.image.load("assets/images/player.png").convert_alpha()

player = player_img.get_rect(topleft=(264, 40))
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()
    if keys[pygame.K_LEFT]:
        player.x -= 4
    if keys[pygame.K_RIGHT]:
        player.x += 4

    vel_y += GRAVITY
    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 x in range(0, 576, TILE):
        screen.blit(grass_img, (x, FLOOR))
    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

Tự luyện tập: Playground Pygame