Menu
CoddyTech

Klasa Sprite

Część sekcji Sprite’y i obrazy ścieżki Pygame w Coddy. Lekcja 16 z 36.

Każdy dotychczasowy obiekt gry miał obraz, Rect, metodę update i sposób na rysowanie. pygame ma klasę stworzoną właśnie do tego: pygame.sprite.Sprite. Twoje obiekty gry stają się jej podklasami:

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = ship_image
        self.rect = self.image.get_rect(midbottom=(320, 470))

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= 6

Trzy zasady. Najpierw wywołaj super().__init__(): przygotowuje ono to, czego klasa Sprite potrzebuje wewnętrznie. Nazwij obraz self.image, a pozycję self.rect — dokładnie tak: własny kod pygame odczytuje te dwie nazwy. Umieść reguły wykonywane w każdej klatce w update.

Obraz statku jest wczytywany raz, na górze, jako ship_image, a klasa z niego korzysta. Na razie narysuj duszka za pomocą blit: screen.blit(player.image, player.rect). W następnej lekcji pygame będzie go rysować.

challenge icon

Wyzwanie

Średni
  1. Napisz class Player(pygame.sprite.Sprite) jak wyżej: self.image to ship_image, a dolny środek self.rect znajduje się w punkcie (320, 470).
  2. Metoda update przesuwa Rect o 6 pikseli w lewo lub w prawo za pomocą strzałek i ogranicza go do okna: przenieś do niej linie z kodu początkowego.
  3. Utwórz player = Player(), wywołuj player.update() w każdej klatce i blituj player.image w miejscu określonym przez player.rect.

Spróbuj swoich sił

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Sprite Ship")
clock = pygame.time.Clock()

ship_image = pygame.image.load("assets/images/ship.png").convert_alpha()
ship_rect = ship_image.get_rect(midbottom=(320, 470))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        ship_rect.x -= 6
    if keys[pygame.K_RIGHT]:
        ship_rect.x += 6
    ship_rect.clamp_ip(screen.get_rect())

    screen.fill((20, 22, 40))
    screen.blit(ship_image, ship_rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Wszystkie lekcje w sekcji Sprite’y i obrazy

Poćwicz samodzielnie: Edytor online Pygame