Nhảy ngắn
Thuộc phần Thế giới trò chơi trong hành trình Pygame của Coddy. Bài học 12 trên 36.
Trong hầu hết trò chơi platformer, nhấn nhanh sẽ tạo ra cú nhảy nhẹ, còn nhấn giữ lâu sẽ tạo ra cú nhảy hết tầm. Nhờ vậy, người chơi có thể chọn độ cao của mỗi cú nhảy.
Khi bạn nhả phím nhảy, một sự kiện KEYUP sẽ xuất hiện. Nếu người chơi vẫn đang bay lên nhanh, hãy làm chậm đà bay lên:
elif event.type == pygame.KEYUP and event.key in (pygame.K_SPACE, pygame.K_UP):
if vel_y < -4:
vel_y = -4Phím được giữ không gửi sự kiện KEYUP khi người chơi đang bay lên, nên cú nhảy đạt hết tầm. Nhấn nhanh sẽ gửi sự kiện này ở khung hình tiếp theo, tốc độ giảm xuống -4 và trọng lực khiến người chơi đổi hướng sau vài khung hình.
Điều kiện kiểm tra vel_y < -4 rất quan trọng. Gần đỉnh cú nhảy hoặc khi đang rơi, vel_y lớn hơn -4, và đặt giá trị này thành -4 lúc đó sẽ đẩy người chơi bay lên trở lại.
Thử thách
DễNhấn Space một lần để nhảy nhẹ.
- Khi nhả phím Space hoặc Up với sự kiện
KEYUP, nếuvel_ynhỏ hơn -4, hãy đặtvel_y = -4. - Giữ nguyên cú nhảy
KEYDOWN.
Nhấn Chơi: giữ Space để nhảy hết cỡ, nhấn rồi thả ngay để nhảy 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("Short Hops")
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
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