Пишем игру на Python. Создание шаблона
Python — мощный и быстрый язык, возможности которого позволяют использовать его во многих областях:
- веб-разработка
- машинное обучение
- создание прикладных программ
- мобильная разработка
- создание скриптов
Но кроме этого есть и дополнительные библиотеки, расширяющие его применение. Так, например, с помощью фреймворкаpygame можно создавать несложные аркадные игры. Именно об этой «игровой библиотеке» и пойдет речь.
В этой статье вы узнаете о том, как сделать шаблон для каждой игры, написанной на pygame. Наш шаблон — файл с расширением .py в котором будут все базовые параметры для нормальной работы будущей игры. Но сначала о применении самого языка в крупных играх.
Python в игровых проектах
Конечно, на самом языке python написано огромное количество аркадных игр, но это далеко не все его игровые возможности, поэтому стоит рассказать об крупных играх, в которых использовался данный язык.
Battlefield
Выпущена в 2005 году. Python использовался для серверной части игры, а также для внутренней логики.
EVE online
Выпущена в 2003 году. Это ролевая онлайн RPG, где также использовался python, а вернее его версия с названием Stackless.
Mount&Blade
Выпущена в 2008 году. События игры происходят в средневековой Европе, игра ролевого жанра. Создавалась, кстати, двумя людьми. Python в этой игре нужен был для создания скриптов.
Civilization IV
Выпущена в 2005 году. Игра жанра пошаговой стратегии, где нужно захватить весь мир, либо дипломатией, либо воинами. Игра была написана на питоне, но не полностью.
Конечно, это не все игры, но именно такие проекты использовали python. Но стоит заметить, что он использовался не как основной язык для создания всей игры, а лишь для некоторых моментов.
Теперь вы знаете об игровых возможностях python, а значит можно приступать к самому pygame.
О pygame
Pygame — фреймворк для программирования игр на python 3. Он был выпущен в 2000 году. Игры и программы написанные на нём смогут спокойно работать как на android, так и на PC, при этом иметь один код.
И у него есть немалое количество преимуществ:
- Легко изучить
- Хорошее комьюнити
- Подробная документация
- Открытый исходный код
- Кроссплатформенность
- Сама библиотека зрелая
Но для того, чтобы начать изучение pygame, необходимо знать сам язык python и его синтаксис. В интернете огромное количество уроков по основам python. Найти их не составит труда. Для установки библиотеки введите pipinstallpygame.
Дальше будет рассказано об игровом цикле, так как это важные момент в создании игр, и его также нужно знать при создании шаблона.
Игровой цикл
Абсолютно каждая игра содержит главный и важный элемент «Игровой цикл». Эта та вещь, которая заставляет игру загружаться снова и снова. Каждый такой цикл называется кадром.
В одном кадре происходит неистовое количество вещей, но всё это можно разложить на три полки.
1. Ввод данных
Это процессы со стороны пользователя. Нажатие клавиш клавиатуры, мыши. Всё это игровой цикл должен обработать и отправить эту информацию в игру. А игра, основываясь на полученной информации, выдает результат в виде движения, использования предметов и прочих игровых механик.
2. Обновление кадра
Каждое мгновение кадр должен обновляться для того, чтобы изменять некоторые игровые процессы, которые необходимо изменить, Например, игрок выстрелил в бочку со взрывоопасным веществом и она должна взорвать и деформировать объекты вокруг себя. Если кадр не будет перезагружаться, то ничего не произойдёт.
3. Визуализирование
Здесь происходит процесс вывод информации на экран. Происходит отрисовка объектов в том месте, в котором они должны быть. Локация, враги, интерфейс игрока — всё это игровые объекты и они появляются в определенно заданных местах.
Скорость игрового цикла
Не менее важным пунктом является скорость работы игрового цикла.
Скорость работы игрового цикла измеряют в FPS (Framespersecond/кадры в секунду). FPS показывает, сколько раз цикл должен повториться в секунду. Это важный аспект, ведь если слишком высокий показатель кадров в секунду, то игра получится быстрой, а если низкий показатель, то медленной.
Также важно и одинаковая работа на всех устройствах с разными экранами. То есть нельзя, чтобы на одном компьютере анимация прошла за 6 секунд, а на другом за 10. Время на выполнение действия должно быть одним и соблюдаться на любом десктопе.
Шаблон проекта
Теперь вы знаете о важном элементе игры — игровой цикл, а значит можно приступать к самому шаблону . Первая программа на pygame будет очень проста, но именно с неё начинается создание каждого проекта. Эта программа будет запускать окно вместе с игровым циклом.
Первое, стоит импортировать все нужные библиотеки, а также настроить базовые параметры игры:
# PygameTemplate — skeletonfor a newPygameproject
importpygame
importrandomWIDTH =360# gamewindowwidth
HEIGHT =480# gamewindowheightFPS =30# frameratepersecond
Следующей частью кода будет открываться окно игры:
# create a gameand a window
pygame.init()
pygame.mixer.init()# forsound
screen=pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption(«MyGame»)
clock=pygame.time.Clock()pygame.init() — запускает фреймворк
screen — Создает окно программы, но оно появится только в случае, если мы зададим его размеры
clock- нужна для проверки игры, работает ли та с заданными кадрами.
После всего этого нужно создать игровой цикл
# Gameloop
running=True
whilerunning:
# Process (event) input
# Update
# Visualization (assembly)
Цикл While в данном случае является игровым. Он контролируется переменной running. Когда переменная running имеет тип True, то игра работает, но если изменить его тип на False, то игра завершится с циклом. Когда цикл создан, можно начинать наполнять его различными процессами.
Часть визуализации
Теперь дело за визуализацией. Никаких игровых объектов сейчас нет, поэтому можно просто заполнить пространство лишь цветом. Но для начала необходимо разобраться в том, как компьютер работает с цветом.
Монитор любого компьютера состоит из пикселей. Каждый пиксель содержит три части: красный, зеленый, синий. Сам же цвет пикселя становится за счёт горения определённых частей.
Красный | Зеленый | Синий | Цвет |
0 | 0 | 0 | Черный |
255 | 0 | 0 | Красный |
0 | 255 | 0 | Зеленый |
0 | 0 | 255 | Синий |
0 | 255 | 255 | Голубой |
255 | 255 | 0 | Желтый |
255 | 0 | 255 | Пурпурный |
255 | 255 | 255 | Белый |
Части могут быть полностью отключены (код цвета со значением 0). А также быть со значением 255, это включение на 100%. Получается, что у каждого цвета есть целых 256 вариативностей.
Тогда общее количество цветов, которое может отображать 1 пиксель составляет 16.777.216
256*256*256 — способ нахождения
Вот так обрабатывает цвета компьютер, полученные знания можно применить в самом начале программы.
# Colors (R, G, B)
BLACK =(0,0,0)
WHITE =(255,255,255)
RED =(255,0,0)
GREEN =(0,255,0)
BLUE =(0,0,255)
Теперь зальём экран одним цветом с помощью рендеринга
# Rendering
screen.fill(BLACK)
Но это не всё. Изменение пикселя ведет за собой передачу команды видеокарте, чтобы та, в свою очередь, передала нужную информацию, но этот процесс относительно медленный. Стоит только представить, сколько потребуется времени, если в кадре будет несколько объектов. Но всё это можно легко решить с помощью двойной буферизации. Теперь стоит объяснить, что это такое.
Объяснить этот способ можно с помощью двусторонней доски. Такую доску можно вертеть как колесо показывая каждую сторону поочередно. Получается, что одна сторона доступна для игрока (роль стороны играет монитор), а другая сторона для компьютера. Каждый кадр рендериться на стороне компьютера. После окончания отрисовки сторона компьютера поворачивается к игроку.
Одна такая отрисовка = один кадр. Это куда эффективнее, нежели отрисовка каждого элемента по отдельности. В библиотеке это происходит автоматически, но необходимо дать команду доске поворачиваться к игроку при завершенной отрисовке, для этого нужна команда flip():
# Rendering
screen.fill(BLACK)
# afterdrawingeverything, flipthescreen
pygame.display.flip()
Кстати, важно написать это в конце программы, так как отрисованный кадр после этой функции не сможет вывестись на монитор. Это очень важно.
Ввод данных
Никаких игровых объектов, которыми можно управлять в этом шаблоне нет, поэтому настроить управление, связанное с объектами, пока не можем. Но есть одно игровое событие, которое присутствует всегда — закрытие игры. Конечно, сейчас возможности закрыть игру нет. Можно нажать на крестик окна, но и это действие игра должна воспринимать как игровое событие и, следственно, закрываться после нажатия.
Какие-либо игровые действия происходят всё время. Представим ситуацию, когда игрок бездумно нажимает клавиши клавиатуры, такие вещи тоже необходимо учитывать. Именно поэтому фреймворк сохраняет каждое событие, которое произошло с последнего кадра. Игрок может нажимать абсолютно любые кнопки и программой засчитается каждая.
И так, для начала нужно создать список с циклом for, который будет проверять каждое нажатие.
foreventinpygame.event.get():
# checkwindowclosing
ifevent.type==pygame.QUIT:
running=False
Как говорилось ранее, всё время происходят какие-то действия. Их довольно много, но pygame откликается на каждое событие.
Команда pygame.QUITпозволяет закрыть игру.
FPS
На этом этапе необходимо проверить, реагирует ли вообще игра на параметры FPS. Проверить можно таким способом:
whilerunning:
# keepthecycleatthecorrectspeed
clock.tick(FPS)
.tick() просит фреймворк понять время, на которое будет потрачен один цикл, а после сделать задержку, чтобы кадр длился определённое время. Например, если задать 50 FPS, то получается, что в одной секунде 50 кадров, а длительность одного кадра — 1/50, или же 0,02 секунды. Допустим, все игровые процессы займут 0,01 секунду, значит программа сделает паузу длительностью в 0,01 секунду.
Итог
Последнее, займемся проверкой, закрывает ли игра окно при завершении цикла. Используем функцию pygame.quit() в конце программы.
Ну и конечный вариант шаблона выглядит следующим образом:
# PygameTemplate — skeletonfor a newPygameproject
importpygame
importrandomWIDTH =360
HEIGHT =480
FPS =30# Settingcolors
WHITE =(255,255,255)
BLACK =(0,0,0)
RED =(255,0,0)
GREEN =(0,255,0)
BLUE =(0,0,255)# Create a gameand a window
pygame.init()
pygame.mixer.init()
screen=pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption(«MyGame»)
clock=pygame.time.Clock()# Gameloop
running=True
whilerunning:
# Keepingthecycleatthecorrectspeed
clock.tick(FPS)
# Process (event) input
foreventinpygame.event.get():
# checkforclosingwindow
ifevent.type==pygame.QUIT:
running=False# Update
# Rendering
screen.fill(BLACK)
# afterdrawingeverything, flipthescreen
pygame.display.flip()pygame.quit()
Готово, теперь этот шаблон можно использовать абсолютно для каждого проекта на pygame. Это базовая структура кода для каждой игры на этой библиотеке.