Menu
CoddyTech

Animasi Lari

Termasuk bagian Aturan Game dalam perjalanan Pygame di Coddy. Pelajaran 25 dari 29.

Pelari itu meluncur. Paket ini memiliki gambar kedua dari pahlawan yang sama, player_walk.png, dengan kedua kakinya terbuka. Bergantian menggunakan kedua gambar itu membuatnya berlari.

Simpan keduanya dalam sebuah list dan hitung frame. self.step // 8 bertambah 1 setiap 8 frame, dan % 2 mengubahnya menjadi 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]

8 frame untuk setiap gambar menghasilkan sekitar tujuh langkah per detik pada 60 frame per detik. Lebih sedikit frame membuatnya berlari lebih cepat, lebih banyak frame membuatnya lebih lambat.

Di udara tidak ada tempat untuk berlari, jadi pelari itu mempertahankan satu gambar sampai mendarat. Muat kedua gambar sekali saja, di __init__, lalu ganti gambar yang ditunjuk oleh self.image: grup atau blit akan menggambar gambar yang ditunjuknya.

challenge icon

Tantangan

Sedang
  1. Muat player.png dan player_walk.png ke dalam list, self.frames, dengan self.image dimulai dari gambar pertama dan self.step = 0.
  2. Di update(), saat berada di tanah, hitung satu langkah dan tampilkan self.frames[self.step // 8 % 2].
  3. Saat berada di udara, tampilkan self.frames[1].

Coba sendiri

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()

Semua pelajaran di Aturan Game

Latihan sendiri: Playground Pygame