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 = 0vel_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 đó.
Thử thách
DễKhiến nhân vật rơi ngày càng nhanh.
- Thêm
GRAVITY = 1ở đầu chương trình vàvel_y = 0trước vòng lặp trò chơi. - Mỗi khung hình, cộng
GRAVITYvàovel_y, rồi cộngvel_yvàoplayer.y, thay vì dùngplayer.y += 4. - Khi
player.bottomvượt quáFLOOR, đặtplayer.bottom = FLOORvà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
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ột3Trọng lực và nhảy
Rơi dưới tác dụng của trọng lựcNhảy từ mặt đấtNhảy ngắnTốc độ rơi tối đaĐệm lệnh nhảyTự luyện tập: Playground Pygame