Menu
CoddyTech

Animación de carrera

Parte de la sección Reglas del juego del Journey de Pygame de Coddy. Lección 25 de 29.

El corredor se desliza. El paquete tiene una segunda imagen del mismo héroe, player_walk.png, con las piernas separadas. Alternar entre las dos imágenes hace que corra.

Mantén ambas en una lista y cuenta los fotogramas. self.step // 8 aumenta en 1 cada 8 fotogramas, y % 2 lo convierte 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 fotogramas por imagen equivalen a unos siete pasos por segundo a 60 fotogramas por segundo. Menos fotogramas hacen que corra más rápido; más hacen que vaya más despacio.

En el aire no hay nada sobre lo que correr, así que el corredor mantiene una imagen hasta que aterriza. Carga ambas imágenes una sola vez, en __init__, y alterna cuál de ellas nombra self.image: el grupo o el blit dibuja lo que esta nombre.

challenge icon

Desafío

Intermedio
  1. Carga player.png y player_walk.png en una lista, self.frames, con self.image empezando con el primero y self.step = 0.
  2. En update(), en el suelo, cuenta un paso y muestra self.frames[self.step // 8 % 2].
  3. En el aire, muestra self.frames[1].

Pruébalo tú mismo

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

Todas las lecciones de Reglas del juego

Practica por tu cuenta: Playground de Pygame