maxresdefault.jpg (1280×720)

Как создать игру на Pygame

Создание собственной игры — мечта многих начинающих разработчиков. Библиотека Pygame для языка Python предоставляет удобные инструменты для разработки 2D-игр, делая процесс доступным и понятным даже для новичков. В этой статье мы рассмотрим базовые шаги по созданию простой игры на Pygame, познакомимся с её основными возможностями и построим простой проект от начала до конца.

Что такое Pygame?

Pygame — это набор модулей Python, разработанных для написания видеоигр. Он предоставляет функции для работы с графикой, звуком, вводом с клавиатуры и мыши, а также другие инструменты, необходимые для разработки интерактивных приложений. Pygame основан на библиотеке SDL, что обеспечивает кроссплатформенность и высокую производительность.

Установка Pygame

Перед началом разработки необходимо установить Pygame. Убедитесь, что у вас установлена актуальная версия Python (рекомендуется 3.6 или выше). Для установки Pygame воспользуйтесь менеджером пакетов pip:

pip install pygame

Проверьте успешность установки, импортировав Pygame в Python:

import pygame
print(pygame.__version__)

Если версия Pygame отображается без ошибок, установка прошла успешно.

Основы работы с Pygame

Начнём с создания простого окна с заголовком и задания размера экрана. Это основа любой игры.


Первый пример: создание окна

Python

import pygame
import sys

# Инициализация Pygame
pygame.init()

# Задаём размеры окна
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Моя первая игра на Pygame")

# Основной игровой цикл
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # Заливаем экран белым цветом
    screen.fill((255, 255, 255))

    # Обновляем отображение
    pygame.display.flip()

# Завершение Pygame
pygame.quit()
sys.exit()

-- Объяснение кода:

1. Инициализация Pygame: Вызов pygame.init() подготавливает все модули Pygame к использованию.
2. Создание окна: pygame.display.set_mode задаёт размеры окна, а pygame.display.set_caption устанавливает заголовок.
3. Игровой цикл: Цикл while running постоянно проверяет события (например, закрытие окна) и обновляет экран.
4. Заливка экрана: Метод fill заливает экран указанным цветом (в формате RGB).
5. Обновление дисплея: pygame.display.flip() обновляет весь экран, отображая изменения.

Добавление персонажа

Теперь добавим в игру персонажа, которым можно будет управлять с клавиатуры.

-- Пример с перемещающимся квадратом

import pygame
import sys

# Инициализация Pygame
pygame.init()

# Задаём размеры окна
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Управляемый персонаж")

# Цвета
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)

# Позиция и размер персонажа
player_size = 50
player_x = WIDTH // 2
player_y = HEIGHT // 2
player_speed = 5

# Основной игровой цикл
running = True
clock = pygame.time.Clock()

while running:
    clock.tick(60)  # Ограничение до 60 FPS
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # Обработка нажатий клавиш
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] or keys[pygame.K_a]:
        player_x -= player_speed
    if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
        player_x += player_speed
    if keys[pygame.K_UP] or keys[pygame.K_w]:
        player_y -= player_speed
    if keys[pygame.K_DOWN] or keys[pygame.K_s]:
        player_y += player_speed

    # Ограничение персонажа границами окна
    player_x = max(0, min(WIDTH - player_size, player_x))
    player_y = max(0, min(HEIGHT - player_size, player_y))

    # Заливка экрана
    screen.fill(WHITE)

    # Рисуем персонажа
    pygame.draw.rect(screen, BLUE, (player_x, player_y, player_size, player_size))

    # Обновление дисплея
    pygame.display.flip()

# Завершение Pygame
pygame.quit()
sys.exit()

Объяснение кода:

1. *Параметры персонажа*: Определяем размер, начальную позицию и скорость перемещения персонажа.

2. *Ограничение FPS*: `clock.tick(60)` ограничивает цикл до 60 кадров в секунду, предотвращая чрезмерное использование ресурсов.

3. *Обработка ввода*: Метод `pygame.key.get_pressed()` позволяет отслеживать нажатые клавиши и изменять позицию персонажа соответственно.

4. *Рисование персонажа*: Используем `pygame.draw.rect` для отображения квадрата на экране.

5. *Ограничение границ*: Обеспечиваем, чтобы персонаж не выходил за пределы окна.

Добавление изображения персонажа

Использование графических элементов делает игру более привлекательной. Вместо квадрата добавим изображение персонажа.


Пример с изображением персонажа

1. *Подготовка изображения*: Сохраните изображение персонажа (например, `player.png`) в той же папке, что и скрипт.

2. *Код игры:*

import pygame
import sys

# Инициализация Pygame
import pygame
import sys

# Инициализация Pygame
pygame.init()

# Задаём размеры окна
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Игра с изображением персонажа")

# Загрузка изображения персонажа
player_image = pygame.image.load('player.png')
player_rect = player_image.get_rect()
player_rect.center = (WIDTH // 2, HEIGHT // 2)
player_speed = 5



# Основной игровой цикл
running = True
clock = pygame.time.Clock()

while running:
    clock.tick(60)  # Ограничение до 60 FPS
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # Обработка нажатий клавиш
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] or keys[pygame.K_a]:
        player_rect.x -= player_speed
    if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
        player_rect.x += player_speed
    if keys[pygame.K_UP] or keys[pygame.K_w]:
        player_rect.y -= player_speed
    if keys[pygame.K_DOWN] or keys[pygame.K_s]:
        player_rect.y += player_speed
  
    # Ограничение персонажа границами окна
    player_rect.x = max(0, min(WIDTH - (player_rect.width), player_rect.x))
    player_rect.y = max(0, min(HEIGHT - (player_rect.height), player_rect.y))

    # Заливка экрана
    screen.fill((255, 255, 255))
  
    # Рисуем персонажа
    screen.blit(player_image, player_rect)
  
    # Обновление дисплея
    pygame.display.flip()

# Завершение Pygame
pygame.quit()
sys.exit()

Объяснение изменений:

1. Загрузка изображения: `pygame.image.load('player.png')` загружает изображение персонажа.
2. Получение прямоугольника: `get_rect()` позволяет управлять позицией изображения на экране.
3. Отображение изображения: `screen.blit(player_image, player_rect)` рисует изображение на экране в указанной позиции.

Добавление столкновений и целей

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

Пример: сбор предметов

Добавим в игру предметы, которые персонаж должен собирать. За каждую собранную цель будет начисляться очко.

import pygame
import sys
import random

# Инициализация Pygame
pygame.init()

# Задаём размеры окна
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Сбор предметов")

# Цвета
WHITE = (255, 255, 255);BLUE = (0, 0, 255);RED = (255, 0, 0);

# Параметры персонажа
player_size = 50
player_x = WIDTH // 2
player_y = HEIGHT // 2
player_speed = 5

# Параметры цели
target_size = 30;target_x = random.randint(0, WIDTH - target_size);target_y = random.randint(0, HEIGHT - target_size)

# Счёт
score = 0
font = pygame.font.SysFont(None, 36)

# Основной игровой цикл
running = True
clock = pygame.time.Clock()

while running:
    clock.tick(60)  # Ограничение до 60 FPS
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_UP]:
        player_y -= player_speed
    if keys[pygame.K_DOWN] or keys[pygame.K_s]:
        player_y += player_speed
    if keys[pygame.K_LEFT]:
        player_x -= player_speed
    if keys[pygame.K_RIGHT] or keys[pygame.K_s]:
        player_x += player_speed

    # Ограничение персонажа границами окна
    player_x = max(0, min(WIDTH - player_size, player_x))
    player_y = max(0, min(HEIGHT - player_size, player_y))

    # Создание прямоугольников для столкновений
    playerrect = pygame.Rect(player_x, player_y, player_size, player_size)
    targetrect = pygame.Rect(target_x, target_y, target_size, target_size)

    # Проверка столкновения
    if playerrect.colliderect(targetrect):
        score += 1
        # Перемещаем цель в новую случайную позицию
        target_x = random.randint(0, WIDTH - target_size)
        target_y = random.randint(0, HEIGHT - target_size)

    # Заливка экрана
    screen.fill(WHITE)

    # Рисуем цель
    pygame.draw.rect(screen, RED, targetrect)

    # Рисуем персонажа
    pygame.draw.rect(screen, BLUE, playerrect)

    # Отображаем счёт
    scoretext = font.render(f"Счёт: {score}", True, (0, 0, 0))
    
    screen.blit(scoretext, (10, 10))

    # Обновление дисплея
    pygame.display.flip()

# Завершение Pygame
pygame.quit()
sys.exit()

-- Объяснение кода:

  1. Параметры цели: Определяем размер и начальную позицию цели, используя random.randint для случайного размещения.

  2. Счёт: Вводим переменную score для подсчёта собранных предметов и используем pygame.font для отображения счёта на экране.

  3. Столкновение: Используем метод colliderect для проверки пересечения прямоугольников персонажа и цели.

  4. Перемещение цели: При столкновении цель перемещается на новую случайную позицию, а счёт увеличивается на единицу.

  5. Отображение: Рисуем персонажа и цель, а также отображаем текущий счёт в верхнем углу экрана.

Дополнительные функции и улучшения

Создание игры не ограничивается базовыми элементами. Вот несколько идей для расширения функционала:

  1. Добавление анимации: Используйте спрайты и анимацию для более живого отображения персонажа и других игровых объектов.

  2. Звуковые эффекты и музыка: Добавьте фоновую музыку и звуковые эффекты для взаимодействий (например, сбор предметов).

  3. Различные уровни сложности: Введите уровни с увеличивающейся сложностью, например, увеличением скорости персонажа или появлением препятствий.

  4. Пользовательский интерфейс: Создайте меню, окна настроек и другие элементы интерфейса для улучшения пользовательского опыта.

  5. Сохранение прогресса: Реализуйте сохранение и загрузку результатов игры.

Организация проекта

Для поддержания кода в порядке по мере усложнения игры рекомендуется организовать проект с использованием модулей и классов.

-- Пример структуры проекта:

mygame/├── assets/│ ├── images/│ │ └── player.png│ └── sounds/│ └── collect.wav├── main.py├── player.py└── target.py```

- *assets/*: Папка для хранения изображений, звуков и других ресурсов.- *main.py*: Главный скрипт игры, содержащий игровой цикл и основную логику.- *player.py*: Модуль, описывающий класс игрока.- *target.py*: Модуль, описывающий класс цели.

Пример класса Player:

player.py

import pygame

class Player(pygame.sprite.Sprite):    def init(self, imagepath, pos, speed):
        super().init()
        self.image = pygame.image.load(imagepath).convertalpha()
        self.rect = self.image.getrect(center=pos)        self.speed = speed

    def update(self, keys):        if keys[pygame.KLEFT] or keyspygame.K_a:
            self.rect.x -= self.speed
        if keyspygame.K_RIGHT or keyspygame.K_d:
            self.rect.x += self.speed
        if keyspygame.K_UP or keyspygame.K_w:
            self.rect.y -= self.speed
        if keyspygame.K_DOWN or keyspygame.K_s:
            self.rect.y += self.speed

        # Ограничение границ экрана
        self.rect.x = max(0, min(800 - self.rect.width, self.rect.x))
        self.rect.y = max(0, min(600 - self.rect.height, self.rect.y))

#Пример использования класса Player в главном скрипте:

import pygame

import sys
import random

from player import Player

# Инициализация Pygame
pygame.init()

# Задаём размеры окна
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Сбор предметов с классами")

# Загрузка изображения цели
TARGET_COLOR = (255, 0, 0)TARGET_SIZE = 30

# Счёт
score = 0font = pygame.font.SysFont(None, 36)

# Создание спрайтов
player = Player('assets/images/player.png', (WIDTH // 2, HEIGHT // 2), 5)all_sprites = pygame.sprite.Group()all_sprites.add(player)

target = pygame.sprite.Sprite()target.image = pygame.Surface((TARGET_SIZE, TARGET_SIZE))target.image.fill(TARGET_COLOR)target.rect = target.image.get_rect()target.rect.x = random.randint(0, WIDTH - TARGET_SIZE)target.rect.y = random.randint(0, HEIGHT - TARGET_SIZE)all_sprites.add(target)

# Основной игровой цикл
running = Trueclock = pygame.time.Clock()

while running:
    clock.tick(60)  # Ограничение до 60 FPS    
    for event in pygame.event.get():        
      if event.type == pygame.QUIT:            
        running = False

    # Обработка нажатий клавиш    
    keys = pygame.key.get_pressed()    player.update(keys)

    # Проверка столкновения    
    if player.rect.colliderect(target.rect):        
      score += 1        
      target.rect.x = random.randint(0, WIDTH - TARGET_SIZE)        target.rect.y = random.randint(0, HEIGHT - TARGET_SIZE)

    # Заливка экрана    
    screen.fill((255, 255, 255))

    # Рисуем все спрайты    
    all_sprites.draw(screen)

    # Отображаем счёт    
    score_text = font.render(f"Счёт: {score}", True, (0, 0, 0))    screen.blit(score_text, (10, 10))

    # Обновление дисплея    
    pygame.display.flip()

# Завершение Pygame
pygame.quit()
sys.exit()

Преимущества использования классов и спрайтов:

- Организация кода: Разделение функционала на классы повышает читаемость и поддержку кода.
- Повторное использование: Легче добавлять новые элементы, наследуя существующие классы.
- Оптимизация: `pygame.sprite.Group` позволяет эффективно управлять и рисовать множество спрайтов одновременно.

Заключение

Библиотека Pygame предоставляет мощные инструменты для создания 2D-игр на языке Python. Мы рассмотрели основные шаги по созданию простой игры с управляемым персонажем и сбором предметов. Однако возможности Pygame гораздо шире: вы можете реализовать сложную физику, добавить искусственный интеллект, создавать уровни и многое другое.

Рекомендуемые ресурсы для дальнейшего изучения:

- [Официальная документация Pygame](https://www.pygame.org/docs/)
- [Учебник по Pygame на русском языке](https://pythonworld.ru/moduli/modul-pygame.html)
- [Курс по разработке игр на Pygame](https://stepik.org/course/51652/promo)
- [Сообщество Pygame на GitHub](https://github.com/pygame/pygame)

Полезные советы:

1. Планируйте игру: Перед началом разработки продумайте концепцию, механику и дизайн вашей игры.
2. Используйте спрайты: Они упрощают управление графическими элементами и их взаимодействиями.
3. Оптимизируйте цикл игры: Следите за производительностью, особенно при добавлении множества объектов.
4. Документируйте код: Это облегчит поддержку и развитие проекта в будущем.
5. Обучайтесь на примерах: Изучайте существующие проекты и участвуйте в сообществах разработчиков игр на Pygame.

Создание игры на Pygame — увлекательный процесс, который помогает развивать навыки программирования и творчества. Начните с простых проектов, постепенно усложняя задачи, и вскоре вы сможете реализовать свои собственные игровые идеи. Удачи в разработке!

Комментарии (0)