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 = TrueDù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 = JUMPevent.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.
Thử thách
Trung bìnhCho nhân vật nhảy lên từ mặt đất.
- Thêm
JUMP = -15ở đầu vàon_ground = Falsetrước vòng lặp trò chơi. - Mỗi khung hình, đặt
on_ground = Falsetrước khi kiểm tra sàn và đặton_ground = Truebên trong điều kiện đó. - Khi có sự kiện
KEYDOWNdo nhấn phím Space hoặc Up, nếuon_groundlà True thì đặtvel_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
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