Menu
CoddyTech

Animazione della corsa

Fa parte della sezione Regole di gioco del percorso Pygame di Coddy. Lezione 25 di 29.

Il corridore scivola. Il pacchetto contiene una seconda immagine dello stesso eroe, player_walk.png, con le gambe divaricate. Alternare le due immagini lo fa correre.

Inseriscile entrambe in un elenco e conta i fotogrammi. self.step // 8 aumenta di 1 ogni 8 fotogrammi e % 2 lo trasforma in 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 fotogrammi per immagine corrispondono a circa sette passi al secondo a 60 fotogrammi al secondo. Con meno fotogrammi corre più velocemente, con più fotogrammi rallenta.

In aria non c'è nulla su cui correre, quindi il corridore mantiene un'immagine finché non atterra. Carica entrambe le immagini una sola volta, in __init__, e alterna quale delle due indica self.image: il gruppo o il blit disegna ciò a cui fa riferimento.

challenge icon

Sfida

Medio
  1. Carica player.png e player_walk.png in un elenco, self.frames, con self.image che inizia con il primo elemento e self.step = 0.
  2. In update(), quando è a terra, conta un passo e mostra self.frames[self.step // 8 % 2].
  3. In aria, mostra self.frames[1].

Provalo tu

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

Tutte le lezioni di Regole di gioco

Esercitati da solo: Playground Pygame