> For the complete documentation index, see [llms.txt](https://pygame.gitbook.io/razrabotchiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://pygame.gitbook.io/razrabotchiki/teoriya/spraity.md).

# Спрайты

### Спрайт&#x20;

Спрайты - это объекты в игре. В двухмерной игре все, что вы видите на экране, является спрайтами. Спрайты можно анимировать, заставлять их взаимодействовать между собой или передавать управление ими игроку.

### Из чего состоит спрайт?

1. Содержимое:\
   Это наполнение спрайта: может быть цветом или изображением\ <br>
2. Коллизия:\
   Это его граница. В Pygame - это прямоугольник вокруг содержимого\
   \ <img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXf1KH69SPtl2lxbnEhIY-wHs8cTJk7EOpzoZx5-E2m01p71PJgBe5kCOs9MULx0vwV9y2mje0e9NwZlKTp0xrZK4gPBEzhf2D7S65JAIccwLaAxyM5z4UKdqkGG0Onq_80A1YRiRBV6L1ZbXEVj0njxaUQH?key=f2SNgdAX1Dtr5adHmpvWSg" alt="" data-size="original">\ <br>
3. Точка спавна:\
   Это точка, относительно которой будет создаваться спрайт.\
   \
   ![](https://lh7-us.googleusercontent.com/docsz/AD_4nXeKztFF3UWce0Ewg2OYzJg-wKfAKShjJmKw7XHeMI3CSA19EOlvUFJmI0kzgvrVodD15dGuntbimwaF-bf5Vl23hNuOAwV-OX9OfMK98E2n3SWaYcR-qz3xg4J7Gn1uKysWqG6TwrJoCwPXyIBg2LbJNLD8?key=f2SNgdAX1Dtr5adHmpvWSg)

<br>

Первое, что необходимо добавить — спрайт, который олицетворяет собой игрока. В итоге это будет космический корабль, но на начальных этапах можно просто игнорировать графику и использовать прямоугольники вместо спрайтов. Важно добиться того, чтобы они отображались на экране и двигались так, как требуется. Заменить их потом артами не составит труда.

```python
import pygame

# Определение цветов и размеров экрана
GREEN = (0, 255, 0)
WIDTH, HEIGHT = 800, 600

class Player(pygame.sprite.Sprite):
    """
    Класс, представляющий игрока как спрайт в Pygame.

    Атрибуты:
    image (pygame.Surface): Поверхность, представляющая изображение игрока.
    rect (pygame.Rect): Прямоугольник, определяющий размеры и положение игрока.
    speedx (int): Скорость перемещения игрока по оси X.
    """

    def __init__(self):
        """
        Инициализирует игрока, создавая его поверхность, задавая начальную позицию и скорость.
        """
        # Инициализация родительского класса
        pygame.sprite.Sprite.__init__(self)
        
        # Создание изображения игрока
        self.image = pygame.Surface((50, 40))
        self.image.fill(GREEN)
        
        # Получение прямоугольника изображения
        self.rect = self.image.get_rect()
        
        # Установка начальной позиции игрока
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 10
        
        # Установка начальной скорости
        self.speedx = 0
```

#### Пояснение:

1. **Класс `Player`**:
   * Наследует от `pygame.sprite.Sprite`, что позволяет использовать спрайты Pygame и их возможности(рендеринг, обновление и т.д.).
2. **Метод `__init__`**:
   * Инициализирует родительский класс с помощью `pygame.sprite.Sprite.__init__(self)`.
   * Создает поверхность для изображения игрока (`self.image`) и заполняет ее зеленым цветом (`GREEN`).
   * Определяет прямоугольник (`self.rect`) на основе изображения игрока.
   * Устанавливает начальную позицию игрока по центру по оси X и немного выше нижней границы экрана по оси Y.
   * Устанавливает начальную скорость перемещения игрока по оси X (`self.speedx`).

Метод update() спрайта будет вызываться на каждом кадре. Он перемещает спрайт с определенной скоростью:

```python
def update(self):
    self.rect.x += self.speedx
```

Теперь нужно отобразить спрайт, чтобы убедиться, что он появляется на экране:

```python
all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
```

Не забудьте, что каждый созданный спрайт должен быть добавлен в группу all\_sprites, чтобы он обновлялся и рисовался на экране.

Движение/управление:

В этой игре управление будет осуществляться с клавиатуры, поэтому игрок будет перемещаться при нажатии клавиш Влево или Вправо (например, a или d).

Есть два подхода к обработке нажатий клавиш:

1. Первый вариант: в этом подходе мы определяем два события (по одному для каждой кнопки), каждое из которых изменяет скорость игрока соответственно:

```python
for event in pygame.event.get():
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            player.speedx = -8
        if event.key == pygame.K_RIGHT:
            player.speedx = 8
```

Проблема этого метода в том, что после нажатия кнопки игрок продолжает двигаться, даже если кнопка отпущена. Чтобы исправить это, нужно добавить два события KEYUP, которые сбрасывают скорость обратно на 0.

2. Второй вариант: установка скорости спрайта по умолчанию в 0, за исключением случаев, когда нажимаются кнопки Влево или Вправо. Таким образом, движение будет более плавным, а код проще:

```python
def update(self):
    self.speedx = 0
    keystate = pygame.key.get_pressed()
    if keystate[pygame.K_LEFT]:
        self.speedx = -8
    if keystate[pygame.K_RIGHT]:
        self.speedx = 8
    self.rect.x += self.speedx
```

Этот код устанавливает скорость speedx на 0 для каждого кадра, а затем проверяет, не нажата ли кнопка. Метод pygame.key.get\_pressed() возвращает словарь со всеми клавишами клавиатуры и значениями True или False, указывающими, нажата ли какая-то из них. Если одна из кнопок нажата, скорость изменяется соответственно.

Ограничение движения в пределах экрана:

Наконец, чтобы спрайт не уходил за пределы экрана, мы добавляем следующий код в метод update() спрайта:

```python
if self.rect.right > WIDTH:
    self.rect.right = WIDTH
if self.rect.left < 0:
    self.rect.left = 0
```

Теперь, если спрайт попытается выйти за пределы экрана, его позиция будет ограничена. Предпочтительнее замедлять игрока, чем телепортировать его с одного края экрана на другой.

***

### Итог

Вот весь код этого шага:

```python
# Импорт библиотек и установка основных параметров окна и игры
import pygame
import random

WIDTH = 480  # Ширина окна игры
HEIGHT = 600  # Высота окна игры
FPS = 60  # Количество кадров в секунду

# Определение цветов
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)

# Инициализация Pygame
pygame.init()  # Инициализация всех модулей Pygame
pygame.mixer.init()  # Инициализация звука
screen = pygame.display.set_mode((WIDTH, HEIGHT))  # Создание окна
pygame.display.set_caption("Shmup!")  # Установка заголовка окна
clock = pygame.time.Clock()  # Создание объекта для отслеживания времени

# Класс игрока
class Player(pygame.sprite.Sprite):
    """
    Класс, представляющий игрока как спрайт в Pygame.

    Атрибуты:
    image (pygame.Surface): Поверхность, представляющая изображение игрока.
    rect (pygame.Rect): Прямоугольник, определяющий размеры и положение игрока.
    speedx (int): Скорость перемещения игрока по оси X.
    """
    def __init__(self):
        """
        Инициализирует игрока, создавая его поверхность, задавая начальную позицию и скорость.
        """
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((50, 40))  # Создание поверхности для отображения игрока
        self.image.fill(GREEN)  # Заливка поверхности зеленым цветом
        self.rect = self.image.get_rect()  # Получение прямоугольника, описывающего изображение
        self.rect.centerx = WIDTH / 2  # Установка позиции игрока по горизонтали
        self.rect.bottom = HEIGHT - 10  # Установка позиции игрока по вертикали
        self.speedx = 0  # Начальная скорость по горизонтали

    def update(self):
        """
       управление игроком по нажатию на стрелочки
        """
        self.speedx = 0  # Сброс скорости по горизонтали
        keystate = pygame.key.get_pressed()  # Получение состояния клавиш
        if keystate[pygame.K_LEFT]:  # Если нажата клавиша влево
            self.speedx = -8  # Установка отрицательной скорости по горизонтали
        if keystate[pygame.K_RIGHT]:  # Если нажата клавиша вправо
            self.speedx = 8  # Установка положительной скорости по горизонтали
        self.rect.x += self.speedx  # Перемещение игрока по горизонтали
        if self.rect.right > WIDTH:  # Если игрок достиг правой границы экрана
            self.rect.right = WIDTH  # Установка правой границы равной ширине экрана
        if self.rect.left < 0:  # Если игрок достиг левой границы экрана
            self.rect.left = 0  # Установка левой границы в нулевую позицию

# Создание всех спрайтов и добавление игрока
all_sprites = pygame.sprite.Group()  # Создание группы для всех спрайтов
player = Player()  # Создание объекта игрока
all_sprites.add(player)  # Добавление игрока в группу спрайтов

# Главный игровой цикл
running = True  # Флаг, определяющий состояние игры (выполняется или завершена)
while running:
    # Держим цикл на правильной скорости
    clock.tick(FPS)  # Установка FPS для определения скорости игры
    # Ввод процесса (события)
    for event in pygame.event.get():  # Обработка всех событий в очереди событий
        # Проверка для закрытия окна
        if event.type == pygame.QUIT:  # Если событие - запрос на закрытие окна
            running = False  # Установка флага "завершение игры" в True

    # Обновление
    all_sprites.update()  # Обновление всех спрайтов

    # Рендеринг
    screen.fill(BLACK)  # Заливка экрана черным цветом
    all_sprites.draw(screen)  # Отрисовка всех спрайтов на экране
    pygame.display.flip()  # Переключение буферов, отображение отрисованного на экране

pygame.quit()  # Завершение работы Pygame (выход из игры)

```

<br>

<br>
