Menu
CoddyTech

Przeszkody

Część sekcji Zasady gry ścieżki Pygame w Coddy. Lekcja 26 z 29.

Teraz coś, nad czym trzeba przeskoczyć. Przeszkoda to duszek, który pojawia się nieco za prawą krawędzią, na ziemi, i porusza się w lewo:

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 zawiera kolczastą kulę i gluta, wczytane raz, dzięki czemu każda przeszkoda wybiera obrazek bez odczytywania pliku. kill() usuwa duszka ze wszystkich grup, do których należy, więc przeszkody, które znikną po lewej stronie, są usuwane.

Trzymaj je w grupie: obstacles.update() przesuwa je wszystkie, a obstacles.draw(screen) rysuje je wszystkie. Dodaje je timer. Za każdym razem, gdy zadziała, uruchom go ponownie z losowym odstępem czasu, żeby gracz nie mógł skakać w rytm:

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

Biegacz nie może jeszcze w nie trafić. Tym zajmiemy się w następnej kolejności.

challenge icon

Wyzwanie

Średni
  1. Dodaj SPAWN = pygame.USEREVENT + 1, speed = 6 oraz listę obstacle_images z spike_ball.png i blob.png.
  2. Napisz duszka Obstacle tak, jak pokazano.
  3. Utwórz grupę o nazwie obstacles i uruchom timer SPAWN na 1500 ms.
  4. Po zdarzeniu SPAWN dodaj przeszkodę i uruchom timer ponownie, używając random.randint(1000, 2000).
  5. Aktualizuj i rysuj grupę w każdej klatce.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Zasady gry

Poćwicz samodzielnie: Edytor online Pygame