Menu
CoddyTech

Hindernisse

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

Jetzt etwas zum Überspringen. Ein Hindernis ist ein Sprite, das etwas hinter dem rechten Rand auf dem Boden startet und sich nach links bewegt:

class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = random.choice(obstacle_images)
        self.rect = self.image.get_rect(midbottom=(664, GROUND_Y))

    def update(self):
        self.rect.x -= speed
        if self.rect.right < 0:
            self.kill()

obstacle_images enthält den Stachelball und den Blob. Sie werden einmal geladen, sodass jedes Hindernis ein Bild auswählt, ohne eine Datei einzulesen. kill() entfernt ein Sprite aus allen Gruppen, zu denen es gehört. Hindernisse, die links den Bildschirm verlassen, werden so vergessen.

Bewahre sie in einer Gruppe auf: obstacles.update() bewegt alle Hindernisse und obstacles.draw(screen) zeichnet sie alle. Ein Timer fügt sie hinzu. Starte ihn jedes Mal, wenn er auslöst, mit einem zufälligen Abstand neu, damit der Spieler nicht in einem Rhythmus springen kann:

if event.type == SPAWN:
    obstacles.add(Obstacle())
    pygame.time.set_timer(SPAWN, random.randint(1000, 2000))

Der Läufer kann sie noch nicht treffen. Das kommt als Nächstes.

challenge icon

Aufgabe

Mittel
  1. Füge SPAWN = pygame.USEREVENT + 1, speed = 6 und eine Liste obstacle_images mit spike_ball.png und blob.png hinzu.
  2. Schreibe das Sprite Obstacle wie gezeigt.
  3. Erstelle eine Gruppe namens obstacles und starte den SPAWN-Timer auf 1500 ms.
  4. Füge bei SPAWN ein Hindernis hinzu und starte den Timer mit random.randint(1000, 2000) neu.
  5. Aktualisiere und zeichne die Gruppe in jedem Frame.

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.frames = [
            pygame.image.load("assets/images/player.png").convert_alpha(),
            pygame.image.load("assets/images/player_walk.png").convert_alpha(),
        ]
        self.image = self.frames[0]
        self.step = 0
        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
        if self.rect.bottom == GROUND_Y:
            self.step += 1
            self.image = self.frames[self.step // 8 % 2]
        else:
            self.image = self.frames[1]


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()
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Spielregeln

Übe selbstständig: Pygame-Playground