Как сделать мультиплеер в pygame

Обновлено: 07.07.2024

wikiHow работает по принципу вики, а это значит, что многие наши статьи написаны несколькими авторами. При создании этой статьи над ее редактированием и улучшением работали, в том числе анонимно, 9 человек(а).

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

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

Для реализации игр на Питон мы можем выбрать одну из нескольких библиотек. Можно работать с: Kivy, Tkinter, PyQt или же с любой другой библиотекой, что обеспечивает построение графического интерфейса через Python. Таких библиотек много, но мы возьмем библиотеку PyGame , которая даже своим названием говорит о её предназначении.

PyGame появился в 2000 году. С тех пор на его основе было сделано много интересных проектов . К сожалению, PyGame не универсален и разработка на нём ведется лишь под Андроид устройства.

Настройка проекта

Перед использованием PyGame его нужно установить через терминал. Прописываем команду:

Для создания базового окна игры, необходимо лишь импортировать библиотеку, инициализировать главный объект, указать размеры, а также название окна и создать основной цикл, что должен вызываться постоянно и тем самым проект будет запущен и работать все время.

Сюда же дописываем отслеживание действий пользователя. Если он закроет окно, то мы будем останавливать программу.

Создание платформера

Для создания платформера потребуется написать куда больше строк кода. Мы прикрепляем весь код проекта ниже. В коде есть комментарии для лучшего понимания:

Также для игры вам потребуются картинки игрока и платформы. Вы можете их скачать ниже.




(фото на задний фон)

Видео на эту тему

Также вы можете просмотреть детальное видео по разработке 2D платформера на Python + PyGame:


Дополнительный курс

На нашем сайте также есть углубленный курс по изучению языка Питон . В ходе огромной программы вы изучите не только язык Питон, но также научитесь создавать веб сайты за счёт веб технологий и фреймворка Джанго. За курс вы изучите массу нового и к концу программы будете уметь работать с языком Питон, создавать на нём полноценные ПК приложения на основе библиотеки Kivy, а также создавать веб сайты на основе библиотеки Джанго.

Больше интересных новостей

10 привычек, которые делают разработчика эффективным

10 привычек, которые делают разработчика эффективным

5 свежих языков программирования

5 свежих языков программирования

Рисуем героя из Among Us / Библиотека Python Turtle

Рисуем героя из Among Us / Библиотека Python Turtle

8 наиболее нашумевших программных багов

8 наиболее нашумевших программных багов

Это четвёртая из пяти частей туториала, посвящённого созданию игр с помощью Python 3 и Pygame. В третьей части мы углубились в сердце Breakout и узнали, как обрабатывать события, познакомились с основным классом Breakout и увидели, как перемещать разные игровые объекты.

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

Распознавание коллизий

В играх объекты сталкиваются друг с другом, и Breakout не является исключением. В основном с объектами сталкивается мяч. В методе handle_ball_collisions() есть встроенная функция под названием intersect() , которая используется для проверки того, ударился ли мяч об объект, и того, где он столкнулся с объектом.Она возвращает 'left', 'right', 'top', 'bottom' или None, если мяч не столкнулся с объектом.

Столкновение мяча с ракеткой

Когда мяч стукается об ракетку, он отскакивает. Если он ударяется о верхнюю часть ракетки, то отражается обратно вверх, но сохраняет тот же компонент горизонтальной скорости.

Но если он ударяется о боковую часть ракетки, то отскакивает в противоположную сторону (влево или вправо) и продолжает движение вниз, пока не столкнётся с полом. В коде используется функция intersect().

Столкновение с полом

Когда ракетка пропускает мяч на пути вниз (или мяч ударяется об ракетку сбоку), то мяч продолжает падать и затем ударяется об пол. В этот момент игрок теряет жизнь и мяч создаётся заново, чтобы игра могла продолжаться. Игра завершается, когда у игрока заканчиваются жизни.

Столкновение с потолком и стенами

Когда мяч ударяется об стены или потолок, он просто отскакивает от них.

Столкновение с кирпичами

Когда мяч ударяется об кирпич, это является основным событием игры Breakout — кирпич исчезает, игрок получает очко, мяч отражается назад и происходят ещё несколько событий (звуковой эффект, а иногда и спецэффект), которые я рассмотрю позже.

Чтобы определить, что мяч ударился об кирпич, код проверят, пересекается ли какой-нибудь из кирпичей с мячом:

Программирование игрового меню

В большинстве игр есть какой-нибудь UI. В Breakout есть простое меню с двумя кнопками, 'PLAY' и 'QUIT'. Меню отображается в начале игры и пропадает, когда игрок нажимает на 'PLAY'. Давайте посмотрим, как реализуются кнопки и меню, а также как они интегрируются в игру.

Создание кнопок

В Pygame нет встроенной библиотеки UI. Есть сторонние расширения, но для меню я решил создать свои кнопки. Кнопка — это игровой объект, имеющий три состояния: нормальное, выделенное и нажатое. Нормальное состояние — это когда мышь не находится над кнопкой, а выделенное состояние — когда мышь находится над кнопкой, но левая кнопка мыши ещё не нажата. Нажатое состояние — это когда мышь находится над кнопкой и игрок нажал на левую кнопку мыши.

Кнопка реализуется как прямоугольник с фоновым цветом и текст, отображаемый поверх него. Также кнопка получает функцию on_click (по умолчанию являющуюся пустой лямбда-функцией), которая вызывается при нажатии кнопки.

Кнопка обрабатывает собственные события мыши и изменяет своё внутреннее состояние на основании этих событий. Когда кнопка находится в нажатом состоянии и получает событие MOUSEBUTTONUP , это означает, что игрок нажал на кнопку, и вызывается функция on_click() .

Свойство back_color , используемое для отрисовки фонового прямоугольника, всегда возвращает цвет, соответствующий текущему состоянию кнопки, чтобы игроку было ясно, что кнопка активна:

Создание меню

Функция create_menu() создаёт меню с двумя кнопками с текстом 'PLAY' и 'QUIT'. Она имеет две встроенные функции, on_play() и on_quit() , которые она передаёт соответствующей кнопке. Каждая кнопка добавляется в список objects (для отрисовки), а также в поле menu_buttons .

При нажатии кнопки PLAY вызывается функция on_play(), удаляющая кнопки из списка objects , чтобы они больше не отрисовывались. Кроме того, значения булевых полей, которые запускают начало игры — is_game_running и start_level — становятся равными True.

При нажатии кнопки QUIT is_game_running принимает значение False (фактически ставя игру на паузу), а game_over присваивается значение True, что приводит к срабатыванию последовательности завершения игры.

Отображение и сокрытие игрового меню

Отображение и сокрытие меню выполняются неявным образом. Когда кнопки находятся в списке objects , меню видимо; когда они удаляются, оно скрывается. Всё очень просто.

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

Подводим итог

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

В последней части серии мы рассмотрим завершение игры, отслеживание очков и жизней, звуковые эффекты и музыку.

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

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

С помощью pygame можно контролировать логику и графику игр, не беспокоясь о сложностях бэкэнда, связанных с работой видео и аудио.

Этот мануал поможет установить модуль pygame в среду разработки Python и создать шаблон для разработки игр в Python 3.

Требования

Для работы вам понадобится локальная или удаленная среда разработки Python 3.

Кроме того, нужно ознакомиться со следующими руководствами:

Установка pygame

Разверните среду программирования Python 3:

Теперь установите pygame:

pip install pygame
Collecting pygame
Using cached pygame-1.9.3-cp35-cp35m-manylinux1_x86_64.whl
Installing collected packages: pygame
Successfully installed pygame-1.9.3

Если вы установили pygame в систему с доступным видео и аудио, вы можете проверить установку с помощью команды, которая запустит макет игры и продемонстрирует, что pygame может делать с графикой и звуком:

python -m pygame.examples.aliens

Если вы не хотите запускать макет или в установке нет аудио/видео, можно открыть интерактивную консоль Python и попробовать импортировать модуль pygame. Чтобы запустить консоль, введите:

Теперь можно импортировать модуль:

Если вы не получили ошибок после того как нажали Enter, значит, модуль pygame был успешно установлен. Вы можете выйти из интерактивной консоли Python с помощью команды quit().

Если во время импорта произошла ошибка, обратитесь к рекомендациям на сайте pygame.

Примечание: На последующих этапах для отображения графического интерфейса пользователя и проверки кода используется монитор.

Импортирование pygame

Создайте файл our_game.py.

Начиная работу над проектом pygame, нужно сначала импортировать модуль. Добавьте в начало файла строку:

Также можно использовать еще один оператор import, чтобы добавить константы и функции pygame в глобальное пространство имен файла:

import pygame
from pygame.locals import *

Модуль pygame импортирован в файл проекта. Теперь можно создать шаблон игры.

Инициализация pygame

Затем нужно инициализировать pygame с помощью функции init().

import pygame
from pygame.locals import *
pygame.init()

Функция init() автоматически запустит все модули pygame, которые нужно инициализировать.

Также можно инициализировать каждый из модулей pygame по отдельности:

Функция init() может возвращать кортежи. Кортеж будет сообщать о состоянии инициализации. Это можно сделать как в общем вызове init(), так и при инициализации определенных модулей (это позволит понять, доступны ли эти модули).

i = pygame.init()
print(i)
f = pygame.font.init()
print(f)

Запустив этот код, вы получите вывод:

В данном случае переменная i вернула кортеж (6, 0): было выполнено 6 успешных инициализаций pygame и получено 0 ошибок. Переменная f вернула None, что значит, что модуль недоступен в этой среде.

Настройка отображения

Затем нужно настроить отображение игры. Используйте pygame.display.set_mode() для инициализации окна или экрана отображения и передайте функции переменную. В функции нужно передать аргумент разрешения экрана; это пара чисел, которые выражают ширину и высоту в кортеже. Добавьте функцию в программу:

import pygame
from pygame.locals import *
pygame.init()
game_display = pygame.display.set_mode((800, 600))

В качестве аргумента функции set_mode () был передан кортеж, который определяет высоту (600 пикселей) и ширину (800 пикселей). Обратите внимание: кортеж содержится в круглых скобках функции, поэтому в приведенной выше функции указаны двойные скобки.

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

Ширину экрана игры можно присвоить переменной display_width, а высоту – переменной display_height. Переменные можно передать функции set_mode().

import pygame
from pygame.locals import *
pygame.init()
display_width = 800
display_height = 600
game_display = pygame.display.set_mode((display_width, display_height))

Обновление экрана

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

По сути анимация – это просто смена кадров во времени. Хорошим примером тут будет кинеограф – сшитая в блокнот серия картинок, при быстром перелистывании которой получается анимированное изображение.

Для обновления поверхности игры можно использовать функцию flip(). Вызовите ее:

Эта функция обновляет всю поверхность отображения.

Чаще вместо flip() используется функция update(), которая обновляет только часть изображения, что экономит память.

Добавьте update() в конец файла our_game.py:

import pygame
from pygame.locals import *
pygame.init()
display_width = 800
display_height = 600
game_display = pygame.display.set_mode((display_width, display_height))
pygame.display.update()

Программа будет работать без ошибок, но экран игры просто откроется и сразу закроется.

Создание цикла игры

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

Создайте цикл while, который будет запускать игру. Цикл будет вызывать логическое значение True, потому он будет работать непрерывно, пока его не остановит пользователь.

В главном цикле игры нужно построить цикл for для итерации очереди пользовательских событий, которые будут вызваны функцией pygame.event.get().

На данный момент в цикле for ничего нет, но в него можно добавить оператор print() и убедиться, что программа работает правильно. Передать события для итерации можно как print(event).

Добавьте в файл циклы и print().

import pygame
from pygame.locals import *
pygame.init()
display_width = 800
display_height = 600
game_display = pygame.display.set_mode((display_width, display_height))
pygame.display.update()
while True:
for event in pygame.event.get():
print(event)

Теперь убедитесь, что код работает:

После запуска файла на экране появится окно 800×600. Чтобы проверить события, вы можете навести курсор мыши на окно, щелкнуть по окну и нажать клавиши на клавиатуре. Эти события будут распечатываться в окне консоли.

Вывод выглядит примерно так:

Этот вывод отображает пользовательские события. Такие события будут контролировать игру, поскольку они генерируются пользователем. Всякий раз, когда вы запускаете функцию pygame.event.get (), код будет принимать эти события.

Остановите программу (CTRL + C).

На данном этапе print() можно удалить или закомментировать.

Выход из игры

Чтобы выйти из программы pygame, можно сначала объявить соответствующие модули неинициализированными, а затем просто выйти из Python с помощью функции quit().

Добавьте в цикл for выражение if.

import pygame
from pygame.locals import *
pygame.init()
display_width = 800
display_height = 600
game_display = pygame.display.set_mode((display_width, display_height))
pygame.display.update()
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
quit()

Новый код говорит программе, что если пользователь нажал Х, программа должна прекратить работу с помощью функций pygame.quit() и quit().

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

Событие KEYDOWN значит, что пользователь нажал клавишу на клавиатуре. К примеру, это может быть клавиша Q или ESC. Добавьте код в цикл for.

import pygame
from pygame.locals import *
pygame.init()
display_width = 800
display_height = 600
game_display = pygame.display.set_mode((display_width, display_height))
pygame.display.update()
while True:
for event in pygame.event.get():
if event.type == QUIT or (
event.type == KEYDOWN and (
event.key == K_ESCAPE or
event.key == K_q
)):
pygame.quit()
quit()

На этом этапе можно протестировать функциональность игры и затем выйти из нее, либо с помощью значка Х, либо нажав Q или ESC.

Улучшение кода

Теперь у вас есть полностью рабочая программа, однако код еще можно усовершенствовать.

К примеру, код цикла while можно поместить в определение функции.

def event_handler():
for event in pygame.event.get():
if event.type == QUIT or (
event.type == KEYDOWN and (
event.key == K_ESCAPE or
event.key == K_q
)):
pygame.quit()
quit()

Это сократит цикл while, что особенно важно для удобочитаемости кода.

Также можно добавить заголовок окна (в настоящее время здесь указано pygame window). Для этого используйте:

Функцию pygame.display.update() можно переместить в основной цикл игры.

В итоге код программы выглядит так:

import pygame
from pygame.locals import *
pygame.init()
display_width = 800
display_height = 600
game_display = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('Our Game')
def event_handler():
for event in pygame.event.get():
if event.type == QUIT or (
event.type == KEYDOWN and (
event.key == K_ESCAPE or
event.key == K_q
)):
pygame.quit()
quit()
while True:
event_handler()
pygame.display.update()

Этот код еще можно улучшить, например, добавить оператор break.

Теперь вы можете приступать к изучению анимации, спрайтовой графики и управления кадрами. Больше информации о pygame можно найти в документации pygame.


Заинтересованы в создании игр, но не знаете с чего начать? Этот пост для вас.

В этом посте предполагается, что вы хоть немного знакомы с Python (такими понятиями, как классы, циклы, функции и методы).

Что такое Pygame?

Pygame – это библиотека для python, которая позволяет нам создавать 2D игры. На самом деле это оболочка для мультимедийной библиотеки SDL (Simple DirectMedia Layer). Он может обрабатывать опросы событий, вставлять изображения в окно, звук и т.д. Вы можете получить это здесь .

Что в игре?

При создании 2D-игры используется очень простой скелет. Основная большая часть игры – это основной цикл. Как следует из названия, mainloop – это фрагмент кода, который выполняется многократно во время выполнения игры. Основной цикл имеет следующую структуру:

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

Начинем

Создайте любой рабочий каталог, например, игру. Затем поместите любое понравившееся вам изображение и назовите его player.jpg.

Следующее изображение предоставляется для вас:

Теперь введите следующую команду в любом текстовом редакторе по вашему выбору и сохранить его как game.py.

Игра выглядит примерно так:

Как все это сочетается

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

Во-вторых, под pygame цвета понимаются как кортежи значений RGB (красный, зеленый, синий). Для белого все значения максимально 255.

Сам код легко понять. Во- первых, мы создали игрока класс, который наследуется от Sprite класса Pygame (Это будет объяснено позже). Объект player является экземпляром этого класса. Мы дали ему атрибут изображения и два атрибута позиции. Затем мы добавили метод перемещения, который принимает кортеж из двух значений и добавляет их к позициям. Таким образом, изменения в позициях добавляются к соответствующим позициям игрока, чтобы он мог перейти на новую позицию.

Затем наступает интересная часть. В mainloop есть цикл for, который перебирает все события, записанные Pygame. Он проверяет, нажал ли пользователь какой-либо из W, A, S или D. В зависимости от нажатой клавиши значение mov_tuple изменяется.

Метод move объекта player вызывается во время каждой итерации цикла. Он просто сдвигает атрибуты x и y объекта. Метод блитов рисует игрока в соответствии с заданными координатами. Поэтому наш мяч находится в постоянном движении, пока мы не намеренно изменим его направление.

После обработки всего этого, мы просто обновляем дисплей. Это та часть, которая заставляет изображения действительно рисоваться на экране. Наконец, clock.tick просто говорит pygame перекрашивать экран 60 раз в секунду.

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

А сейчас нечто совершенно другое

Выше была простая демонстрация, чтобы проиллюстрировать основные идеи о Pygame и создании игр. В следующий раз мы узнаем, как создать полноценную игру. Я надеюсь, что вы узнали что-то полезное из этого поста.

Читайте также: