Menu
CoddyTech

Nhảy từ mặt đất

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

Một cú nhảy là chuyển động với tốc độ âm. Đặt vel_y = -15 thì nhân vật di chuyển lên 15 pixel; trọng lực trừ đi 1 sau mỗi khung hình cho đến khi nhân vật rơi xuống lại. Nhờ vậy, nhân vật tạo thành một đường cong.

Cú nhảy chỉ nên bắt đầu khi nhân vật ở trên mặt đất. Hãy giữ một cờ cho biết nhân vật có đứng trên sàn trong khung hình này hay không:

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

Dùng sự kiện KEYDOWN để nhảy, nhờ đó mỗi lần nhấn chỉ tạo ra một cú nhảy, dù bạn có giữ phím hay không:

elif event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
    if on_ground:
        vel_y = JUMP

event.key in (pygame.K_SPACE, pygame.K_UP) là True nếu nhấn một trong hai phím. Khi đang ở trên không, on_ground là False, nên lần nhấn thứ hai sẽ không có tác dụng.

challenge icon

Thử thách

Trung bình

Cho nhân vật nhảy lên từ mặt đất.

  1. Thêm JUMP = -15 ở đầu và on_ground = False trước vòng lặp trò chơi.
  2. Mỗi khung hình, đặt on_ground = False trước khi kiểm tra sàn và đặt on_ground = True bên trong điều kiện đó.
  3. Khi có sự kiện KEYDOWN do nhấn phím Space hoặc Up, nếu on_ground là True thì đặt vel_y = JUMP.

Nhấn Chơi rồi nhấn Space: nhân vật nhảy lên rồi rơi xuống. Sau đó nhấn Kiểm tra.

Tự làm thử

import pygame

TILE = 36
FLOOR = 324
GRAVITY = 1

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))
vel_y = 0

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

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

    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