Как сделать управление pygame
Создание игр – перспективная и прибыльная сфера разработки приложений, в которой можно заработать много денег. Но это не так просто, поскольку необходимо разбираться в основах игровой механики, а также понимать, что надо для их создания с помощью Python. И с помощью библиотеки Pygame вы получите все необходимые для этого инструменты. Весь код, который будет приведен в этой статье, был написан в Python версии 3.7 и модификации Pygame 1.9.6.
Что такое Pygame?
Это библиотека, с помощью которой разработчики могут создавать игры. Она включает компоненты для программирования следующих элементов:
- Графики и анимации.
- Звука. Сюда же входит музыка, которая есть в играх.
- Управление. Сюда входит мышь, клавиатура, геймпад и так далее.
Этих компонентов достаточно для того, чтобы создать игру любой сложности. Конечно, надо понимать нюансы их использования, но все это приходит с опытом, по мере обучения и тренировки на реальных проектах.
Что такое игровой цикл и как его использовать?
Игровой цикл – это логика, заложенная в игру и какая работает постоянно. Каждый цикл в игре называется кадром. В каждом из них бывает огромное количество вещей, но все они могут быть разделены на три категории:
- Обработка ввода. Это все события, которые происходят вне игры. Таковыми могут быть клики мышью, нажатия каких-то клавиш на клавиатуре, и так далее.
- Обновление игры. Сюда входит изменение всего, что должно в рамках одного кадра. Например, если персонаж оказался в воздухе, он должен упасть вниз с помощью силы гравитации. Или же, если в игре два автомобиля на большой скорости встречаются, они должны взорваться.
- Рендеринг. На этом этапе осуществляется прорисовка всего того, что выводится на экран: фоны, персонажи, меню. Это приводит к тому, что на экране в нужном месте появляется то, что игрок должен видеть.
Параллельно со всеми этими компонентами, есть время. Этот аспект игрового цикла также очень важен. Многие игроки знают такой термин, как FPS. Означает он Frames Per Second. То есть, количество кадров в секунду. От FPS зависит то, какое количество раз цикл должен повторяться за секунду. Это позволяет не допустить того, чтобы игра была слишком медленной или быстрой.
Также нужно стараться поддерживать одинаковый FPS на разных компьютерах. Например, если персонажу для перемещения с левой части экрана к правой нужно 10 секунд, то такое же количество времени он должен потратить на всех компьютерах.
Что такое шаблон Pygame и как его создать?
Теперь, когда пользователь понимает, из чего состоит игра, теперь пора обучаться тому, как ее создавать. Для начала давайте попробуем создать самую простую программу Pygame, которая просто запускает игровой цикл. Именно с этого начинается любой проект, который создается в этой библиотеке.
Сначала надо импортировать требуемые компоненты и задать базовые переменные настроек игры.
pygame.init() – это команда, запускающая библиотеку. screen – это окно приложения, в котором будет работать игровой цикл. И, наконец, для задания частоты кадров используется clock .
Давайте приступим к созданию игрового цикла, для начала.
Игровой цикл – это цикл while, контроль которого лежит в области переменной running . Если необходимо закончить игру, достаточно лишь изменить значение этой переменной на False . Это приведет к окончанию цикла. Теперь можно заполнить каждый раздел базовым кодом.
Раздел рендеринга (отрисовки)
Начнем с рендеринга. Поскольку персонажи отсутствуют, вы можете заполнить экран сплошным цветом. Для этого вам нужно понимать, как ваш компьютер обрабатывает цвет.
Компьютерные экраны состоят из пикселей, каждый из которых содержит 3 элемента: красный, зеленый и синий. Цвет пикселя зависит от того, как горит каждый элемент:
Каждый из трех базовых цветов может иметь значения в диапазоне от 0 до 255. В первом случае он полностью отсутствует, а во втором он имеется в наличии. Таким образом, каждый элемент имеет 256 вариантов.
Чтобы узнать общее число цветов, которые могут быть показаны дисплеем компьютера, необходимо возвести это число в третью степень (поскольку всего базовых цветов).
Итого, получится 16 777 216 цветов.
Теперь, когда мы поняли принцип работы цветов, мы можем их задавать в начале приложения.
А это означает, что отрисовка осуществляется один раз за кадр, а не при добавлении каждого элемента. В Pygame этот процесс – автоматический. Достаточно лишь оповестить доску, чтобы она перевернулась после окончания отрисовки. Это реализуется с помощью команды flip() .
Главная задача – сделать так, чтобы функция flip() располагалась в конце. Если попробовать нарисовать что-либо после поворота, эта картинка не будет показываться на экране.
Раздел ввода (событий)
Поскольку игра еще не создана, сказать о том, какие кнопки или элементы управления могут быть нужными, не получится. Но необходимо настроить одно важное событие. Если попробовать прямо сейчас запустить программу, то станет понятно, что нет возможности закрыть окно. Причем недостаточно просто нажать на крестик. Ведь необходимо сообщить программе, чтобы она тоже закрыла игру.
События происходят всегда. Например, если во время отрисовки игрок решит нажать на кнопку прыжка, как это обрабатывать? Если игнорировать это, то игрок будет разочарован.
Чтобы была возможность обрабатывать такие события, Pygame сохраняет все события, которые произошли с момента последнего кадра. Даже если игрок будет бить по кнопкам хаотично, ни одна из них не будет пропущена. В этом случае создается список, и с использованием цикла for можно пройтись по всем этим событиям.
В нашем случае было использовано событие pygame.QUIT. После того, как пользователь нажимает на кнопку завершения приложения, оно запускается. В нашем случае игровой цикл завершается. Но можно задать другие действия, например, вопрос о том, сохранять ли игровой прогресс.
Контроль частоты кадров в секунду
В нашем случае пока нет информации, которая могла бы быть помещена в раздел Update . Тем не менее, настройка FPS должна контролировать скорость игры, и нам нужно быть уверенным в том, что это происходит. Это делается таким образом.
С помощью команды tick() Pygame позволяет определить продолжительность цикла, а потом сделать паузу, чтобы кадр длился столько времени, сколько нужно. Если задать значение FPS 30, то тогда длина кадра будет 1/30. То есть, он будет длиться 0,03 секунды. Если цикл кода (обновление, рендеринг и прочее) занимает 0,01 секунды, то тогда будет пауза на 0,02 секунды.
Выводы
После всего этого, необходимо убедиться в том, что окно игры закрывается после завершения игрового цикла. Для этого используется функция pygame.quit() в конце кода. Финальный шаблон Pygame тогда будет выглядеть следующим образом.
Все, теперь есть окончательный шаблон Pygame. Далее его осталось сохранить в файле с понятным названием. Например, pygame_template.py , чтобы в дальнейшем его можно было использовать для создания новых проектов pygame.
Далее мы продолжим использовать этот шаблон для изучения процесса отрисовки объектов на экране и их движения.
Этот модуль содержит функции для работы с клавиатурой.
pygame.event queue gets pygame.KEYDOWN and pygame.KEYUP events when the keyboard buttons are pressed and released. Both events have key and mod attributes. --> pygame.event очередь получает pygame.KEYDOWN и pygame.KEYUP события , когда кнопки на клавиатуре нажата и отпущена. Оба события имеют атрибуты key и mod .
- key : an integer ID representing every key on the keyboard --> key : целочисленный идентификатор, представляющий каждую клавишу на клавиатуре
- mod : a bitmask of all the modifier keys that were in a pressed state when the event occurred --> mod : битовая маска всех клавиш-модификаторов, которые были в нажатом состоянии, когда произошло событие
pygame.KEYDOWN event has the additional attributes unicode and scancode . --> pygame.KEYDOWN событие имеет дополнительные атрибуты unicode и scancode .
- unicode : a single character string that is the fully translated character entered, this takes into account the shift and composition keys --> unicode : односимвольная строка, которая является полностью переведенным введенным символом, при этом учитываются клавиши сдвига и композиции
- scancode : the platform-specific key code, which could be different from keyboard to keyboard, but is useful for key selection of weird keys like the multimedia keys --> scancode : код клавиши, зависящий от платформы, который может отличаться от клавиатуры к клавиатуре, но полезен для выбора необычных клавиш, таких как мультимедийные клавиши.
pygame.TEXTINPUT event is preferred to the unicode attribute of pygame.KEYDOWN . The attribute text contains the input. --> Новое в pygame 2.0.0: событие pygame.TEXTINPUT предпочтительнее атрибута unicode для pygame.KEYDOWN . Атрибут text содержит ввод.
pygame.locals ) used to represent keyboard keys. --> Ниже приведен список всех констант (из pygame.locals ), используемых для представления клавиш клавиатуры.
K_a ) rather than integers directly ( 97 ) so that your key handling code works well on both pygame 1 and pygame 2. --> Примечание о переносимости: целые числа для ключевых констант различаются между pygame 1 и 2. Всегда используйте ключевые константы ( K_a ), а не целые числа напрямую ( 97 ), чтобы ваш код обработки ключей хорошо работал как в pygame 1, так и в pygame 2.
pygame.locals ) that can be assembled by bitwise-ORing them together. --> На клавиатуре также есть список состояний модификаторов (из pygame.locals ), которые могут быть собраны путем побитового ИЛИ их вместе.
mod attribute of the pygame.KEYDOWN and pygame.KEYUP events. The mod attribute is a bitmask of all the modifier keys that were in a pressed state when the event occurred. The modifier information can be decoded using a bitwise AND (except for KMOD_NONE , which should be compared using equals == ). For example: --> Информация о модификаторе содержится в атрибуте mod событий pygame.KEYDOWN и pygame.KEYUP . mod атрибут представляет собой битовую маску всех клавиш - модификаторов , которые были в прижатом состоянии , когда произошло событие. Информация о модификаторе может быть декодирована с помощью побитового И (за исключением KMOD_NONE , который следует сравнивать с помощью equals == ). Например:
True when the display window has keyboard focus from the system. If the display needs to ensure it does not lose keyboard focus, it can use pygame.event.set_grab() to grab all input. --> Возвращает True , если в окне дисплея находится системный фокус клавиатуры. Если дисплею необходимо убедиться, что он не теряет фокус клавиатуры, он может использовать pygame.event.set_grab() для захвата всего ввода.
True value means the that button is pressed. --> Возвращает последовательность логических значений, представляющих состояние каждой клавиши на клавиатуре. Используйте значения ключевых констант для индексации массива. Значение True означает, что эта кнопка нажата.
pygame.key.get_pressed() . There is also no way to translate these pushed keys into a fully translated character value. See the pygame.KEYDOWN events on the pygame.event queue for this functionality. --> Получение списка нажатых кнопок с помощью этой функции - неправильный способ обработки ввода текста от пользователя. Невозможно узнать порядок нажатия клавиш, а быстро нажимаемые клавиши могут быть совершенно незамеченными между двумя вызовами pygame.key.get_pressed() . Также невозможно преобразовать эти нажатые клавиши в полностью переведенное символьное значение. См pygame.KEYDOWN события на pygame.event очереди для этой функции.
Возвращает одно целое число, представляющее битовую маску всех удерживаемых ключей-модификаторов. Используя побитовые операторы, вы можете проверить , нажаты ли определенные клавиши-модификаторы .
Создайте битовую маску констант клавиш-модификаторов, которые вы хотите наложить на свою программу.
pygame.KEYDOWN events. The delay parameter is the number of milliseconds before the first repeated pygame.KEYDOWN event will be sent. After that, another pygame.KEYDOWN event will be sent every interval milliseconds. If a delay value is provided and an interval value is not provided or is 0, then the interval will be set to the same value as delay . --> Когда повторение клавиатуры включено, удерживаемые клавиши будут генерировать несколько событий pygame.KEYDOWN . Параметр delay - это количество миллисекунд до того, pygame.KEYDOWN будет отправлено первое повторяющееся событие pygame.KEYDOWN . После этого, еще pygame.KEYDOWN событие будет отправляться каждые interval миллисекунд. Если указано значение delay значение interval не указано или равно 0, то для interval будет установлено то же значение, что и для delay .
delay set to 0. --> Чтобы отключить повторение клавиш, вызовите эту функцию без аргументов или с delay установленной на 0.
При инициализации pygame повтор нажатия клавиш отключается.
Raises: | delay or interval is ValueError - если delay или interval |
---|
ValueError is now raised (instead of a pygame.error ) if delay or interval is Изменено в pygame 2.0.0: теперь возникает pygame.error ValueError (вместо pygame.error ), если delay или interval
delay and interval keyboard repeat values. Refer to pygame.key.set_repeat() for a description of these values. --> Получите значения delay и interval повтора клавиатуры. Обратитесь к pygame.key.set_repeat() для описания этих значений.
Новое в пигаме 1.8.
Получите описательное имя кнопки с помощью константы идентификатора кнопки клавиатуры.
Получение кода идентификатора ключа из описательного имени ключа.Возвращается целое число,соответствующее одному из ключевых кодов K_*.Например:
Новое в пигаме 2.0.0.
pygame.TEXTEDITING and pygame.TEXTINPUT events. --> Начните получать pygame.TEXTEDITING и pygame.TEXTINPUT .
pygame.TEXTEDITING event is received when an IME composition is started or changed. It contains the composition text , length , and editing start position within the composition (attributes text , length , and start , respectively). When the composition is committed (or non-IME input is received), a pygame.TEXTINPUT event is generated. --> pygame.TEXTEDITING событие получено , когда IME композиция запускается или изменена. Он содержит text композиции , length и позицию start редактирования в композиции (атрибуты text , length и start , соответственно). Когда композиция зафиксирована (или получен ввод, pygame.TEXTINPUT IME), генерируется событие pygame.TEXTINPUT .
Обработка событий ввода текста включена по умолчанию.
Новое в пигаме 2.0.0.
pygame.TEXTEDITING and pygame.TEXTINPUT events. --> Прекратить получать pygame.TEXTEDITING и pygame.TEXTINPUT .
Обработка событий ввода текста включена по умолчанию
Новое в пигаме 2.0.0.
Это устанавливает прямоугольник,используемый для набора текста с помощью IME.Он управляет тем,где будет открыт список кандидатов,если он поддерживается.
Заинтересованы в создании игр, но не знаете с чего начать? Этот пост для вас.
В этом посте предполагается, что вы хоть немного знакомы с 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 и создании игр. В следующий раз мы узнаем, как создать полноценную игру. Я надеюсь, что вы узнали что-то полезное из этого поста.
Python – самый универсальный язык, и он присутствует почти во всех областях, включая веб-разработку, машинное обучение, искусственный интеллект, приложения с графическим интерфейсом, а также разработку игр.
Python предоставляет встроенную библиотеку под названием pygame, которая использовалась для разработки игр. Как только мы поймем базовые концепции языка программирования, мы сможем разработать игру на Python с библиотекой Pygame с привлекательной графикой, подходящей анимацией и звуком.
Pygame – это кроссплатформенная библиотека, которая используется для разработки видеоигр. Она включает компьютерную графику и звуковые библиотеки. Она разработана Питом Шиннерсом для замены PySDL.
Установка Pygame
Откройте терминал командной строки и введите следующую команду, чтобы установить pygame.
Простой пример Pygame
Вот следующий пример создания простого окна pygame.
Вся графика будет отображаться в окне pygame.
Давайте разберемся с основным синтаксисом вышеуказанной программы.
import pygame – это модуль, который позволяет нам работать со всеми функциями pygame.
pygame.init() – используется для инициализации всех необходимых модулей pygame.
pygame.display.set_mode((ширина, высота)) – используется для изменения размера окна. Он вернет объект поверхности. Объект поверхности используется для выполнения графических операций.
pygame.QUIT – используется для закрытия события, когда мы нажимаем крестик в углу окна.
pygame.display.flip() – используется для отображения любого обновления игры. Если мы внесем какие-либо изменения, нам нужно будет вызвать функцию display.flip().
Мы можем нарисовать любую форму на поверхности pygame, включая добавление изображений, привлекательный шрифт. Pygame предоставляет множество встроенных функций для рисования геометрической формы на экране. Эти формы – начальный этап разработки игры.
Давайте разберемся со следующим примером рисования фигуры на экране.
В приведенном выше примере мы нарисовали различные формы, такие как треугольник, прямая линия, прямоугольник, эллипс, круг, дуга, закрашенный круг и овал. Мы использовали функцию pygame.draw в соответствии с формой с подходящими аргументами.
Пример – разработка игры Snake с использованием Pygame
Мы можем играть снова, нажав кнопку ОК. Мы можем увидеть наш результат в терминале Pycharm(мы использовали Pycharm IDE; вы можете использовать любую Python IDE).
Скопируйте приведенный выше код и вставьте его в свою среду IDE и получайте удовольствие. Чтобы понять концепции Pygame, посетите наш полный учебник по Pygame.
Читайте также: