Menu
CoddyTech

Hoạt ảnh chạy

Thuộc phần Luật chơi trong hành trình Pygame của Coddy. Bài học 25 trên 30.

Nhân vật chạy lướt đi. Gói tài nguyên có thêm một hình ảnh của cùng nhân vật, player_walk.png, với hai chân dang ra. Luân phiên giữa hai hình ảnh này sẽ tạo hiệu ứng chạy.

Giữ cả hai hình ảnh trong một danh sách và đếm số khung hình. self.step // 8 tăng thêm 1 sau mỗi 8 khung hình, còn % 2 biến kết quả thành 0, 1, 0, 1:

if self.rect.bottom == GROUND_Y:
    self.step += 1
    self.image = self.frames[self.step // 8 % 2]
else:
    self.image = self.frames[1]

Hiển thị mỗi hình ảnh trong 8 khung hình tương đương khoảng bảy bước mỗi giây ở tốc độ 60 khung hình mỗi giây. Giảm số khung hình thì nhân vật chạy nhanh hơn, tăng số khung hình thì nhân vật chạy chậm hơn.

Khi ở trên không, nhân vật không có gì để chạy trên đó, nên giữ nguyên một hình ảnh cho đến khi tiếp đất. Tải cả hai hình ảnh một lần trong __init__, rồi đổi hình ảnh mà self.image trỏ đến: nhóm hoặc thao tác blit sẽ vẽ hình ảnh mà nó trỏ đến.

challenge icon

Thử thách

Trung bình

Làm cho chân của nhân vật chạy chuyển động.

  1. Tải player.png và player_walk.png vào một danh sách, self.frames, với self.image ban đầu là hình đầu tiên và self.step = 0.
  2. Trong update(), khi ở trên mặt đất, đếm một bước và hiển thị self.frames[self.step // 8 % 2].
  3. Khi ở trên không, hiển thị self.frames[1].

Nhấn Chơi: nhân vật chạy tại chỗ và giữ nguyên một tư thế khi nhảy. 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
GRAVITY = 1


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))
        self.vy = 0

    def jump(self):
        if self.rect.bottom == GROUND_Y:
            self.vy = -16

    def update(self):
        self.vy += GRAVITY
        self.rect.y += self.vy
        if self.rect.bottom >= GROUND_Y:
            self.rect.bottom = GROUND_Y
            self.vy = 0


runner = Runner()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
            runner.jump()

    runner.update()

    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