Menu
CoddyTech

Laufanimation

Teil des Abschnitts Spielregeln der Pygame-Journey von Coddy. Lektion 25 von 29.

Der Läufer gleitet dahin. Das Bildpaket enthält ein zweites Bild desselben Helden, player_walk.png, mit gespreizten Beinen. Der Wechsel zwischen den beiden Bildern lässt ihn laufen.

Bewahre beide in einer Liste auf und zähle die Frames. self.step // 8 erhöht sich alle 8 Frames um 1, und % 2 macht daraus 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 Frames pro Bild entsprechen bei 60 Frames pro Sekunde etwa sieben Schritten pro Sekunde. Weniger Frames lassen ihn schneller laufen, mehr lassen ihn langsamer laufen.

In der Luft gibt es nichts, worauf er laufen kann, also hält der Läufer ein Bild fest, bis er landet. Lade beide Bilder einmal in __init__ und ändere, welches Bild self.image bezeichnet: Die Gruppe oder der Blit zeichnet, was es bezeichnet.

challenge icon

Aufgabe

Mittel
  1. Lade player.png und player_walk.png in eine Liste self.frames, wobei self.image mit dem ersten Bild beginnt und self.step = 0 gesetzt ist.
  2. Zähle in update() am Boden einen Schritt und zeige self.frames[self.step // 8 % 2] an.
  3. Zeige in der Luft self.frames[1] an.

Probier es selbst

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

Alle Lektionen in Spielregeln

Übe selbstständig: Pygame-Playground