Menu
CoddyTech

Класс Sprite

Часть раздела Спрайты и изображения путешествия по Pygame на Coddy. Урок 16 из 36.

У каждого игрового объекта до сих пор были изображение, Rect, метод update и способ отрисовки. В pygame есть класс, созданный именно для этого: pygame.sprite.Sprite. Твои игровые объекты становятся его подклассами:

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

Три правила. Сначала вызови super().__init__(): он подготавливает всё необходимое классу Sprite. Точно так назови изображение self.image, а позицию — self.rect: собственный код pygame обращается к этим двум именам. Помести правила, выполняемые каждый кадр, в update.

Изображение корабля загружается один раз в начале программы под именем ship_image, и класс использует его. Пока что выводи спрайт с помощью blit: screen.blit(player.image, player.rect). В следующем уроке pygame будет отрисовывать его самостоятельно.

challenge icon

Задание

Средне
  1. Напиши class Player(pygame.sprite.Sprite), как показано выше: self.image — это ship_image, а нижняя середина self.rect находится в точке (320, 470).
  2. Метод update перемещает Rect на 6 пикселей влево или вправо с помощью клавиш со стрелками и ограничивает его границами окна: перенеси в него строки из начального кода.
  3. Создай player = Player(), вызывай player.update() в каждом кадре и выводи player.image в позиции player.rect с помощью blit.

Попробуйте сами

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

Все уроки раздела Спрайты и изображения

Потренируйтесь самостоятельно: Песочница Pygame