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.
Thử thách
DễGiới hạn tốc độ rơi của nhân vật.
- Thêm
MAX_FALL = 12ở đầu. - Thay
vel_y += GRAVITYbằngvel_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
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