Menu
CoddyTech

Animation de course

Fait partie de la section Règles du jeu du Journey Pygame de Coddy. Leçon 25 sur 29.

Le coureur glisse. Le jeu contient une deuxième image du même héros, player_walk.png, avec les jambes écartées. Alterner entre les deux images le fait courir.

Garde les deux images dans une liste et compte les images d’animation. self.step // 8 augmente de 1 toutes les 8 images, et % 2 transforme cela en 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 images par image d’animation, c’est environ sept pas par seconde à 60 images par seconde. Moins d’images le font courir plus vite, davantage le ralentissent.

En l’air, il n’y a rien sur quoi courir, alors le coureur garde une image jusqu’à ce qu’il atterrisse. Charge les deux images une seule fois, dans __init__, et change celle que désigne self.image : le groupe ou le blit dessine l’image qu’elle désigne.

challenge icon

Défi

Moyen
  1. Charge player.png et player_walk.png dans une liste, self.frames, avec self.image initialisé à la première image et self.step = 0.
  2. Dans update(), au sol, incrémente le compteur de pas et affiche self.frames[self.step // 8 % 2].
  3. Dans les airs, affiche self.frames[1].

Essayez vous-même

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

Toutes les leçons de Règles du jeu

Entraînez-vous par vous-même : Playground Pygame