Menu
CoddyTech

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 = -4

Phí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.

challenge icon

Thử thách

Dễ

Nhấn Space một lần để nhảy nhẹ.

  1. Khi nhả phím Space hoặc Up với sự kiện KEYUP, nếu vel_y nhỏ hơn -4, hãy đặt vel_y = -4.
  2. 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

Tự luyện tập: Playground Pygame