Nhảy
Thuộc phần Luật chơi trong hành trình Pygame của Coddy. Bài học 24 trên 30.
Một cú nhảy là tốc độ hướng lên mà trọng lực làm giảm dần. Cho người chạy một tốc độ theo chiều dọc, vy. Mỗi khung hình, trọng lực cộng thêm 1 vào tốc độ này và người chạy di chuyển một đoạn bằng tốc độ đó:
def update(self):
self.vy += GRAVITY
self.rect.y += self.vy
if self.rect.bottom >= GROUND_Y:
self.rect.bottom = GROUND_Y
self.vy = 0Giá trị y tăng theo hướng xuống dưới, vì vậy một cú nhảy đặt vy = -16: người chạy bay lên 15 pixel, rồi 14, rồi 13, chậm dần đến khi dừng lại ở độ cao khoảng 120 pixel, sau đó rơi xuống ngày càng nhanh. Khi chạm đường mặt đất, người chạy được đưa lên đường đó rồi dừng lại.
Chỉ nhảy khi đang ở trên mặt đất. Nếu không kiểm tra điều kiện này, mỗi lần nhấn nút khi đang ở trên không sẽ bắt đầu một cú nhảy mới, và người chạy có thể bay lên mãi:
def jump(self):
if self.rect.bottom == GROUND_Y:
self.vy = -16Phần 5 sẽ phát triển nội dung này bằng cách thêm các bục để đáp xuống.
Thử thách
Trung bìnhKhiến nhân vật chạy nhảy lên.
- Thêm
GRAVITY = 1vàself.vy = 0cho nhân vật chạy. - Viết
update()như bên dưới và gọirunner.update()ở mỗi khung hình, trước khi vẽ. - Viết
jump(): đặtvy = -16chỉ khi nhân vật chạy đang ở trên mặt đất. Nhấn phím cách hoặc phím mũi tên lên để gọirunner.jump().
Nhấn Chơi rồi nhấn phím cách: nhân vật chạy sẽ nhảy lên và tiếp đất. Sau đó nhấn Kiểm tra.
Tự làm thử
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 320))
pygame.display.set_caption("Sky Runner")
clock = pygame.time.Clock()
SKY = (140, 200, 240)
GROUND = (90, 160, 80)
GROUND_Y = 260
class Runner(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.image.load("assets/images/player.png").convert_alpha()
self.rect = self.image.get_rect(midbottom=(100, GROUND_Y))
runner = Runner()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill(SKY)
pygame.draw.rect(screen, GROUND, (0, GROUND_Y, 640, 60))
screen.blit(runner.image, runner.rect)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Tất cả bài học trong Luật chơi
Tự luyện tập: Playground Pygame