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.
Thử thách
Trung bìnhLàm cho chân của nhân vật chạy chuyển động.
- Tải
player.pngvàplayer_walk.pngvào một danh sách,self.frames, vớiself.imageban đầu là hình đầu tiên vàself.step = 0. - Trong
update(), khi ở trên mặt đất, đếm một bước và hiển thịself.frames[self.step // 8 % 2]. - 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