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.
Aufgabe
Mittel- Füge
SPAWN = pygame.USEREVENT + 1,speed = 6und eine Listeobstacle_imagesmitspike_ball.pngundblob.pnghinzu. - Schreibe das Sprite
Obstaclewie gezeigt. - Erstelle eine Gruppe namens
obstaclesund starte denSPAWN-Timer auf 1500 ms. - Füge bei
SPAWNein Hindernis hinzu und starte den Timer mitrandom.randint(1000, 2000)neu. - 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()
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