Menu
CoddyTech

Rơi dưới tác dụng của trọng lực

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

Nhân vật trong cửa sổ rơi đều 4 pixel mỗi khung hình, như đi thang máy. Vật thể thật tăng tốc khi rơi. Lưu tốc độ theo chiều dọc của nhân vật trong một biến (variable), rồi tăng giá trị này sau mỗi khung hình:

vel_y += GRAVITY
player.y += vel_y
if player.bottom > FLOOR:
    player.bottom = FLOOR
    vel_y = 0

vel_y là tốc độ tính bằng pixel mỗi khung hình; giá trị dương là hướng xuống. GRAVITY = 1 tăng giá trị này thêm một sau mỗi khung hình, nên nhân vật rơi lần lượt 1, rồi 2, rồi 3 pixel, cứ thế tiếp tục.

Sàn ở đây là một đường nằm tại FLOOR = 324, ở mép trên của bãi cỏ. Khi nhân vật vượt qua đường này, đặt cạnh dưới của nhân vật nằm trên đường rồi dừng cú rơi. Chương tiếp theo sẽ thay đường này bằng các bục thật.

Nhân vật là Rect của hình ảnh: player_img.get_rect(topleft=(264, 40)) là một Rect có kích thước 48 nhân 48 tại vị trí đó, còn screen.blit(player_img, player) vẽ hình ảnh tại đó.

challenge icon

Thử thách

Dễ

Khiến nhân vật rơi ngày càng nhanh.

  1. Thêm GRAVITY = 1 ở đầu chương trình và vel_y = 0 trước vòng lặp trò chơi.
  2. Mỗi khung hình, cộng GRAVITY vào vel_y, rồi cộng vel_y vào player.y, thay vì dùng player.y += 4.
  3. Khi player.bottom vượt quá FLOOR, đặt player.bottom = FLOOR và vel_y = 0.

Nhấn Chơi: nhân vật rơi xuống, ngày càng nhanh, rồi đáp xuống sàn. Sau đó nhấn Kiểm tra.

Tự làm thử

import pygame

TILE = 36
FLOOR = 324

pygame.init()
screen = pygame.display.set_mode((576, 360))
pygame.display.set_caption("Gravity")
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))

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

    player.y += 4
    if player.bottom > FLOOR:
        player.bottom = FLOOR

    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