Мы разработаем версию классической игры Breakout. Освоив этот учебник, вы будете четко понимать, что нужно для создания игры, познакомитесь с возможностями Pygame и напишете свой собственный пример игры.
Игровой контент и Питон
Разработка развлекательного программного обеспечения — занятие, пользующееся большим спросом у современных разработчиков. Только опытные, изобретательные и внимательные люди могут справиться с этой задачей. Для написания игр можно использовать язык программирования Python.
Статья поможет вам узнать о преимуществах и недостатках языка и подскажет, что может понадобиться при разработке кода для той или иной игры. Кроме того, мы поговорим о проектах, которые уже были успешно написаны и реализованы на Python.
Python – понятие
Python — это сложный язык программирования. Он относится к общему использованию. Вы можете использовать его для создания различных приложений — от игр до бизнес-логики. Он способен работать с ООП.
Python относится к языкам с динамической типизацией информации. Его легко освоить даже тем, кто далек от IT и разработки. Получить свою первую игру через такой вариант не составит труда.
Преимущества
Python — это язык программирования, который имеет множество преимуществ и достоинств. Их относят к следующим пунктам:
- простой и понятный синтаксис;
- в основе Питона – язык ABC;
- стабильность работы;
- относительно быстрое функционирование;
- универсальность – подходит и для игр, и для разного рода приложений/виджетов;
- высокая читаемость кода;
- динамическая типизация.
Этот вариант подходит как для начинающих, так и для опытных программистов. Благодаря мощным функциям и библиотекам Python несложно реализовать даже сложную утилиту. Концепция ООП создает больше ясности.
Недостатки
Недостатки Python невелики. Здесь стоит выделить следующие особенности:
- отсутствие строгой типизации – иногда это становится проблемой;
- объем итогового приложения – за счет этого игр может функционировать медленнее, чем при ее создании через СИ-семейство.
В противном случае вы можете использовать Python для любых целей. Это современный подход для разработчиков. Некоторые элементы кодирования, которые вы хотите сделать «лаконичными», написаны в нем.
Игровые циклы – что знать перед разработкой
В каждой игре есть важный элемент. Это называется игровым циклом. Это обычный способ описания «элемента», который заставляет код программы загружаться снова и снова. Соответствующий цикл в игре — это кадр.
В одном кадре может быть большое количество вещей, но мы можем условно разделить их на разные «категории»:
- Ввод информации. Процесс, который в игре осуществляется со стороны пользователя. Сюда принято относить нажатие на кнопки клавиатуры, а также мышку. Игровой цикл будет обрабатывать и отправлять соответствующие сведения в игру. Последняя, опираясь на полученные материалы, выдает результат. Пример – движение или применение разного рода навыков.
- Обновление кадра. Кадр должен все время обновляться, чтобы в игре осуществлялась корректировка процессов.
- Визуализирование. Процесс, который отвечает за вывод информации (картинки) на дисплей устройства. В ходе него осуществляется отрисовка элементов там, где они должны располагаться по задумке. Локации, враги, НИПы и иные составляющие – это объекты в где, которые возникают в определенно заданных областях.
Физика и внедрение искусственного интеллекта происходят в самых сложных играх. Искусственный интеллект и искусственный интеллект являются наиболее естественными, а искусственный интеллект — наиболее распространенным. В некоторых случаях игра включает в себя очки, уровни и жизни.
Краткое введение в программирование игр
Ключевым моментом в играх является движение пикселей на экране и звук, который они издают. Почти во всех видеоиграх есть эти элементы. В этой статье мы не будем обсуждать клиент-серверные игры и многопользовательские игры, которые требуют большого количества сетевого программирования.
Основной цикл
Основной цикл игры выполняется и обновляет экран через регулярные промежутки времени. Они называются частотой кадров и определяют, насколько плавным является движение. Как правило, в играх экран обновляется 30-60 раз в секунду. Когда частота ниже, объекты на экране как бы подергиваются.
В главном цикле есть три основные функции: обработка событий, обновление состояния игры и отображение текущего состояния на экране.
Обработка событий
События в игре — это любые операции, которые находятся вне контроля игрового кода, но связаны с выполнением игры. Например, в игре Breakout, если игрок нажимает клавишу «стрелка влево», игра должна переместить биту влево. Типичные события включают нажатия (и отпускания) кнопок, движения мыши, нажатия кнопок мыши (особенно в меню) и события таймера (например, действие спецэффекта может занять 10 секунд).
Обновление состояния
В основе любой игры лежит ее состояние: все, что она наблюдает и рисует на экране. В случае с Breakout состояние включает в себя положение всех камней, положение и скорость мяча, положение биты, жизни и очки.
Существует также вспомогательный режим, позволяющий управлять игрой:
- Отображается ли сейчас меню?
- Закончена ли игра?
- Победил ли игрок?
Отрисовка
Игра должна отображать свое состояние на экране, включая отображение геометрических фигур, картинок и текста.
Игровая физика
Большинство игр имитируют физическую среду. В Breakout мяч отскакивает от объектов и имеет очень похожую систему физики твердого тела (если это можно так назвать).
Более сложные игры могут использовать более сложные и реалистичные физические системы (особенно 3D-игры). Стоит также отметить, что в некоторых играх, например, карточных, физика практически полностью отсутствует, и это совершенно нормально.
ИИ (искусственный интеллект)
Во многих играх мы сражаемся с компьютерными противниками или с врагами, которые пытаются нас убить. Они часто ведут себя в игровом мире так, как будто у них есть разум.
Например, враги следят за игроком и знают его местоположение. В Breakout нет искусственного интеллекта. Игрок сражается с холодными, твердыми камнями. Однако искусственный интеллект в играх часто очень прост и просто следует простым (или сложным) правилам, которые дают псевдоинтеллектуальные результаты.
Воспроизведение звука
Воспроизведение звука — еще один важный аспект игр. В целом, существует два типа звука: фоновая музыка и звуковые эффекты. В Breakout я применяю только те звуковые эффекты, которые воспроизводятся во время различных событий.
Фоновая музыка — это просто музыка, которая постоянно играет на заднем плане. Некоторые игры не используют его, а некоторые меняют его на каждом уровне.
Жизни, очки и уровни
В большинстве игр у игрока есть определенное количество жизней, и когда оно расходуется, игра заканчивается. В играх также часто начисляются очки, чтобы увидеть, насколько хорошо мы играем, и дать нам стимул совершенствоваться или просто похвастаться перед друзьями своими рекордами. Во многих играх есть уровни, которые либо совершенно разные, либо сложность которых постепенно возрастает.
Знакомство с Pygame
Прежде чем приступить к реализации игры, нам следует немного узнать о Pygame, который будет выполнять большую часть работы.
Что такое Pygame?
Pygame — это основа языка Python для программирования игр. Он построен на базе SDL и имеет все необходимое:
- зрелостью
- хорошим сообществом
- открытым исходным кодом
- кроссплатформенностью
- качественной документацией
- множеством примеров игр
- простотой изучения
Установка Pygame
Введите pip install pygame, чтобы установить фреймворк. Если вам нужно что-то еще, следуйте инструкциям в разделе «Начало работы» в вики проекта. Если, как и я, вы используете macOS Sierra, у вас могут возникнуть проблемы. Мне удалось установить Pygame без проблем, и код работает нормально, но окно игры не появляется.
Это стало бы серьезным препятствием для начала игры. В конце концов, мне пришлось запустить его под Windows в виртуальной машине VirtualBox. Надеюсь, к тому времени, когда вы будете читать эту статью, проблема будет решена.
Архитектура игры
В играх приходится управлять большим количеством информации и выполнять практически одинаковые операции над многими объектами. Breakout — небольшая игра, но попытка управлять всем в одном файле может быть очень утомительной. Поэтому я решил разработать файловую структуру и архитектуру, подходящую для гораздо более крупных игр.
Структура папок и файлов
├── Pipfile ├── Pipfile.lock ├── README.md ├── ball.py ├── breakout.py ├── brick.py ├── button.py ├── colors.py ├── config.py ├── game.py ├── game_object. py ├──── images │ └──── background.jpg ├──── paddle.py ├──── sound_effects │ ├──── brick_hit.wav │ ├──── effect_done.wav │ ├──── level_complete.wav │ └─ paddle_hit.wav └─ text_object.py
Pipfile и Pipfile.lock — это современный способ управления зависимостями в Python. Папка images содержит изображения, используемые в игре (в нашей версии будет только одно фоновое изображение), а папка sound_effects содержит небольшие звуковые клипы, которые используются (вы догадались) в качестве звуковых эффектов.
Файлы ball.py, paddle.py и brick.py содержат код для каждого из этих объектов разбиения. Более подробно я расскажу о них в последующих частях учебника. Файл text_object.py содержит код для отображения текста на экране, а файл background.py содержит логику игры на прорыв.
Однако существует несколько модулей, которые создают произвольный «скелет» общего назначения. Классы, определенные в них, могут быть использованы в других играх, основанных на Pygame.
Класс GameObject
GameObject — это визуальный объект, который может визуализировать себя, сохранять свои границы и перемещаться. В Pygame также есть класс спрайта, который выполняет аналогичную работу, но в этом учебнике я хочу показать вам, как все работает на низком уровне, а не слишком полагаться на заранее созданную магию. Вот как выглядит класс GameObject:
from pygame.rect import Rect class GameObject: def __init__(self, x, y, w, h, speed=(0,0)) self.bounds = Rect(x, y, w, h) self.speed = speed @property def left(self): return self.bounds. left @property def right(self): return self.bounds.right @property def top(self): return self.bounds.top @property def bottom(self): return self.bounds.bottom @property def width(self): return self.bounds. width @property def height(self): return self.bounds.height @property def center(self): return self.bounds.center @property def centerx(self): return self.bounds.centerx @property def centery(self): return self. bounds.centery def draw(self, surface): pass def move(self, dx, dy): self.bounds = self.bounds.move(dx, dy) def update(self): if self.speed == 0, 0: return self.move(*self.speed)
GameObject предназначен для того, чтобы быть базовым классом для других объектов. Он раскрывает многие свойства прямоугольника self.bounds напрямую, а в методе update() перемещает объект в соответствии с его текущей скоростью. Ничего не происходит в методе draw(), который должен быть переопределен подклассами.
Класс Game
Класс Game — это сердце игры. Он запускается в главном цикле. Он имеет множество полезных функций. Давайте разберем все по порядку.
Метод __init__() инициализирует сам Pygame, систему типов и звуковой микшер. Нам нужны три разных вызова, потому что не каждый Pygame использует все компоненты. Таким образом, мы можем проверить используемые подсистемы и инициализировать только нужные из них с нужными параметрами. Метод создает фоновое изображение, основной интерфейс (где все отображается) и игровой таймер с нужной частотой кадров.
Простые игры для кодирования на Python
Сегодня мы научимся программировать несколько простых игр, используя общие модули Python.
Сегодня мы научимся программировать несколько простых игр, используя общие модули Python.
Почему мы используем Python?
Python — это хорошо известный язык программирования. Код Python очень прост для понимания и написания. Он считается дружественным для разработчиков. Любой новичок может научиться писать код на Python за очень короткое время.
Вот некоторые из наиболее интересных особенностей этого языка:
- Python – это язык с открытым исходным кодом и распространяется свободно
- Портативный и динамический
- Python супер легко понять и т. д.
Создание простых игр в Python
Давайте теперь реализуем несколько простых игр на Python, которые вы можете сделать как новичок, чтобы начать свой путь обучения!
1. Игра викторина в Python
Это очень простая текстовая игра на языке Python. Это небольшая викторина, которую вы можете провести для себя или своих друзей. Для этой игры нам не нужно вводить никаких модулей, что делает ее легкой! Попробуйте сами.
- Оператор if-else – Для проверки ответов
- Оператор print – для печати выходов
print('Добро пожаловать в викторину AskPython') answer=input('Вы готовы сыграть в викторину? (да/нет) :') score=0 total_questions=3 if answer.lower()=='yes': answer=input('Вопрос 1: Какой ваш любимый язык программирования? ') if answer.lower()=='python': score += 1 print('correct') else: print('Wrong Answer :(') answer=input('Вопрос 2: Следите ли вы за каким-нибудь автором на AskPython? ') if answer. lower()=='yes': score += 1 print('correct') else: print('Wrong Answer :(') answer=input('Вопрос 3: Как называется ваш любимый сайт для изучения Python?') if answer. lower()=='askpython': score += 1 print('correct') else: print('Wrong Answer :(') print('Спасибо за игру в эту небольшую викторину, вы',score, "Ответили на вопросы правильно!") mark=(score/total_questions)*100 print('Marks obtained:',mark) print('BYE!')
Добро пожаловать на викторину AskPython Готовы ли вы сыграть в викторину? (да/нет) :да Вопрос 1: Какой ваш любимый язык программирования? python верно Вопрос 2: Следите ли вы за каким-либо автором на AskPython? да верно Вопрос 3: Как называется ваш любимый сайт для изучения python? askpython верно Спасибо за игру в эту небольшую викторину, вы ответили на 3 вопроса правильно! Очки: 100.0 Пока!
2. Игра в Pong на Python
Большинство из нас слышали о знаменитой игре Pong. Многие из нас любят играть. Сегодня мы узнаем, как программировать эту классическую игру с помощью языка программирования Python!
Прежде чем приступить к программированию, нам необходимо установить модуль turtle. Этот модуль представляет собой библиотеку Python, которая позволяет пользователям создавать таблицы и фигуры, предоставляя им виртуальный холст.
Если у вас его еще нет, вы можете установить библиотеку с помощью pip.
C:\Users\Admin>pip install turtle.
Вы можете узнать больше о библиотеке turtle в ее официальной документации.
Протестируйте код самостоятельно!
import turtle as t playerAscore=0 playerBscore=0 #create a window and declare a variable called window and call the screen() window=t.Screen() window.title("The Pong Game") window.bgcolor("green") window.setup(width=800,height=600) window.tracer(0) #Creating the left paddle leftpaddle=t.Turtle() leftpaddle.speed(0) leftpaddle.shape("square") leftpaddle.color("white") leftpaddle.shapesize(stretch_wid=5,stretch_len=1) leftpaddle.penup() leftpaddle.goto(-350,0) #Creating the right paddle rightpaddle=t.Turtle() rightpaddle.speed(0) rightpaddle.shape("square") rightpaddle.color("white") rightpaddle.shapesize(stretch_wid=5,stretch_len=1) rightpaddle.penup() rightpaddle.goto(-350,0) #Code for creating the ball ball=t.Turtle() ball.speed(0) ball.shape("circle") ball.color("red") ball.penup() ball.goto(5,5) ballxdirection=0.2 ballydirection=0.2 #Code for creating pen for scorecard update pen=t.Turtle() pen.speed(0) pen.color("Blue") pen.penup() pen.hideturtle() pen.goto(0,260) pen.write("score",align="center",font=('Arial',24,'normal')) #code for moving the leftpaddle def leftpaddleup(): y=leftpaddle.ycor() y=y+90 leftpaddle.sety(y) def leftpaddledown(): y=leftpaddle.ycor() y=y+90 leftpaddle.sety(y) #code for moving the rightpaddle def rightpaddleup(): y=rightpaddle.ycor() y=y+90 rightpaddle.sety(y) def rightpaddledown(): y=rightpaddle.ycor() y=y+90 rightpaddle.sety(y) #Assign keys to play window.listen() window.onkeypress(leftpaddleup,'w') window.onkeypress(leftpaddledown,'s') window.onkeypress(rightpaddleup,'Up') window.onkeypress(rightpaddledown,'Down') while True: window.update() #moving the ball ball.setx(ball.xcor()+ballxdirection) ball.sety(ball.ycor()+ballxdirection) #border set up if ball.ycor()>290: ball.sety(290) ballydirection=ballydirection*-1 if ball.ycor() 390: ball.goto(0,0) ball_dx = ball_dx * -1 player_a_score = player_a_score + 1 pen.clear() pen.write("Player A:<>Игрок Б:<>".format(player_a_score,player_b_score),align="center",font=('Monaco',24, "normal")) os.system("afplay wallhit.wav&") if(ball.xcor())<-390: # Left width paddle Border ball.goto(0,0) ball_dx = ball_dx * -1 player_b_score = player_b_score + 1 pen.clear() pen.write("Player A:<>Игрок Б:<>".format(player_a_score,player_b_score),align="center",font=('Monaco',24,"normal")) os.system("afplay wallhit.wav&") # Handling the collisions with paddles. if(ball.xcor()>340) и (ball.xcor()<350) and (ball.ycor()paddle_right.ycor() - 40): ball.setx(340) ball_dx = ball_dx * -1 os.system("afplay paddle.wav&") if(ball.xcor()<-340) and (ball.xcor()>-350) and(ball.ycor() paddle_left.ycor() -40): ball.setx(-340) ball_dx = ball_dx * -1 os.system("afplay paddle.wav&")
Заключение
Вот и все! Вот некоторые из простых игр на python, которые вы можете создать как новичок и получить массу удовольствия! Нам было весело создавать эти игры, и мы надеемся, что вы чувствуете то же самое!
Читайте ещё по теме:
- Разработка игр Rock Paper Scissors на Python
- Реализация Ханойской башни на Python
- Создайте MineSweeper, используя Python из основных для продвинутых
- Научите своих детей построить собственную игру с Python – 1
- Как я использовал Python, чтобы проанализировать игру престолов
- Улучшите свои навыки Python, кодируя игру змеи
- ПОСЛЕДНЯЯ часть – научите своих детей создавать свою собственную игру с помощью Python.
Другие популярные игровые движки на Python
Пять библиотек, описанных в этой статье, являются лишь небольшой подборкой из множества доступных игровых движков Python. Среди десятков имеющихся есть следующие:
- Wasabi 2D разработан командой Pygame Zero. Это современная среда, построенная на moderngl, которая автоматизирует рендеринг, предоставляет готовые решения для анимационных эффектов, имеет встроенные эффекты и использует собственную модель игровых событий.
- Panda 3D — платформа с открытым исходным кодом для создания 3D-игр и трехмерной визуализации. Panda 3D переносится на разные платформы, поддерживает несколько типов ресурсов, интегрируется с многочисленными сторонними библиотеками и обеспечивает встроенное профилирование.
- Ursina построена на основе Panda 3D и предоставляет специальный движок для разработки игр, который упрощает многие аспекты Panda 3D. На момент написания статьи Ursina хорошо поддерживается и документируется.
- PursuedPyBear позиционируется как образовательная библиотека с системой управления сценами, анимированными спрайтами и низким входным барьером.
Если вы знаете другие хорошие игровые движки на Python, не стесняйтесь поделиться ими с нами в комментариях!
Источники контента для игр
Если вы знаете другие игры на Python, пожалуйста, сообщите нам, если у вас есть другие примеры игр на Python. Обычно самая трудная часть разработки игры — это создание игровых ресурсов. Крупные компании по производству видеоигр нанимают команды художников, аниматоров и музыкантов для разработки внешнего вида и звукового оформления своих игр.
Разработчикам, работающим в одиночку, этот аспект разработки игр может показаться сложным. Однако, к счастью, существует множество различных источников игровых ресурсов:
- OpenGameArt.org предлагает широкий спектр артов, музыки, фонов, значков и других ресурсов для двумерных и трехмерных игр. Большинство файлов находятся в свободном доступе.
- Kenney.nl содержит набор разнообразных бесплатных и платных ресурсов.
- Itch.io — торговая площадка для создателей цифровых продуктов, ориентированных на независимую разработку игр. Здесь можно найти ресурсы практически для любых целей: и бесплатные, и платные, и даже готовые игры.
Все ресурсы, используемые в играх данного руководства, соответствуют лицензионным условиям их создателей.
Что такое Pygame?
Pygame — это библиотека для Python, которую можно использовать для создания двухмерных игр. Это оболочка для мультимедийной библиотеки SDL (Simple DirectMedia Layer), которая позволяет исследовать события, вставлять в окно изображения, звук и т.д. Вы можете приобрести его здесь.
Для создания двухмерной игры используется очень простой скелет. Главный цикл — это основная часть игры. Как следует из названия, главный цикл — это часть кода, которая выполняется несколько раз во время выполнения игры. Главный цикл имеет следующую структуру:
Петля: ОпросдляСобытияdoМеняйте предметы, чтобы рисовать картинки на экране.
Мы будем использовать этот главный цикл для создания очень простой игры.
Начинем
Создайте любой рабочий каталог, например, игровой. Затем поместите любое изображение и назовите его player.png.
Для вас приводится следующее изображение:
Теперь введите следующую команду в любой текстовый редактор по вашему выбору и сохраните ее как game.py.
#!/usr/bin/env python2ВойтиpygameaspВойтиsys WIDTH =360ВЫСОТА =480БЕЛЫЙ = (255,255,255)КатегорияИгрок(pg.sprite.sprite]:def__init__(self, imagePath):# Сначала мы определяем соответствующие объектные переменныеself.image = pg.image.load(imagePath)# Это координаты игрока на экране.self.x, self.y = (WIDTH/2, HEIGHT/2) self.speed =5defПереместить(self, mov_tup):# mov_up содержит изменения в позициях x и y.# просто добавьте эти изменения к позиции игрокаself.x += mov_tup0self.y += mov_tup1defГлавная():pg.init()# инициализировать pygamepg.display.set_mode((WIDTH, HEIGHT))# установите размеры окнаmainS = pg.display.get_surface() FPS60# кадров в секунду# главное окно теперь можно открыть через mainSигрок = игрок("player.png")# Часы необходимы для обновления экрана.clock = pg.time.Clock() mov_tup = (0,0)# Это фактический основной циклв то время какПравда:дляСобытиеinpg.event.get():ifevent.type == pg.QUIT: pg.quit() sys.exit()elifevent.type == pg.KEYDOWN:ifevent.key == pg.K_d: mov_tup = (player.speed,0)ifevent.key == pg.K_a: mov_tup = (-player.speed,0)ifevent.key == pg.K_w: mov_tup = (0, -player.speed)ifevent.key == pg.K_s: mov_tup = (0, player.speed) player.move(mov_tup) mainS.fill(WHITE)# Заполните экран белым цветом.mainS.blit(player.image, (player.x, player.y))# Нарисуйте игрока в правильном положении.pg.display.update()# Перекрашивание FPS раз в секундуclock.tick(FPS) main()
Игра выглядит следующим образом:
Как все это сочетается
Прежде всего, необходимо знать, какую систему координат вы используете. В pygame координаты начинаются в левом верхнем углу экрана и увеличиваются по мере перемещения вправо или вниз.
Во-вторых, pygame понимает цвета как массивы значений RGB (красный, зеленый, синий). Для белого цвета все значения имеют максимальное значение 255.
Сам код легко понять. Сначала мы создали класс игрока, который наследуется от pygame класса Sprite (это будет объяснено позже). Объект игрока является экземпляром этого класса. Мы дали ему атрибут изображения и два атрибута позиции. Затем мы добавили метод Move, который принимает кортеж из двух значений и добавляет их к позициям. Таким образом, изменения позиции добавляются к соответствующим позициям игроков, чтобы игрок мог занять новую позицию.
В функции main мы инициализируем pygame. Затем мы попросим pygame создать экран нужного размера и «сохранить» его в mainS. Мы создаем объект clock и инициализируем значение mov_tup.
Затем наступает самое интересное. Mainloop имеет цикл for, который проходит через все события, записанные pygame. Он проверяет, нажал ли пользователь одну из клавиш W, A, S или D. В зависимости от того, какая клавиша была нажата, значение кортежа mov_tuple меняется.
Метод move объекта player вызывается на каждой итерации цикла. Он просто перемещает атрибуты x и y объекта. Метод flash рисует игрока в соответствии с заданными координатами. Таким образом, наш шарик находится в постоянном движении, пока мы намеренно не изменим его направление.
После того как мы все это обработали, мы просто обновляем экран. Это та часть, которая обеспечивает реальное отображение изображений на экране. Наконец, clock.tick просто говорит pygame перерисовывать экран 60 раз в секунду.
Вот и все. Вот как работает игра. Цикл продолжается до тех пор, пока игрок не покинет игру. По сути, мы просто рисуем разные цвета на экране, очень быстро реагируя на команды игрока.
Архитектура игры
В играх приходится управлять большим количеством информации и выполнять практически одинаковые операции над многими объектами. Breakout — небольшая игра, но попытка управлять всем в одном файле может быть очень утомительной. Поэтому я решил разработать файловую структуру и архитектуру, подходящую для гораздо более крупных игр.
Структура папок и файлов
├── Pipfile ├── Pipfile.lock ├── README.md ├── ball.py ├── breakout.py ├── brick.py ├── button.py ├── colors.py ├── config.py ├── game.py ├── game_object. py ├──── images │ └──── background.jpg ├──── paddle.py ├──── sound_effects │ ├──── brick_hit.wav │ ├──── effect_done.wav │ ├──── level_complete.wav │ └─ paddle_hit.wav └─ text_object.py
Pipfile и Pipfile.lock — это современный способ управления зависимостями в Python. Папка images содержит изображения, используемые в игре (в нашей версии будет только одно фоновое изображение), а папка sound_effects содержит небольшие звуковые клипы, которые используются (вы догадались) в качестве звуковых эффектов.
Файлы ball.py, paddle.py и brick.py содержат код для каждого из этих объектов разбиения. Более подробно я расскажу о них в последующих частях учебника. Файл text_object.py содержит код для отображения текста на экране, а файл background.py содержит логику игры на прорыв.
Однако существует несколько модулей, которые создают произвольный «скелет» общего назначения. Классы, определенные в них, могут быть использованы в других играх, основанных на Pygame.
Класс GameObject
GameObject — это визуальный объект, который может визуализировать себя, сохранять свои границы и перемещаться. В Pygame также есть класс спрайта, который выполняет аналогичную работу, но в этом учебнике я хочу показать вам, как все работает на низком уровне, а не слишком полагаться на заранее созданную магию. Вот как выглядит класс GameObject:
from pygame.rect import Rect class GameObject: def __init__(self, x, y, w, h, speed=(0,0)) self.bounds = Rect(x, y, w, h) self.speed = speed @property def left(self): return self.bounds. left @property def right(self): return self.bounds.right @property def top(self): return self.bounds.top @property def bottom(self): return self.bounds.bottom @property def width(self): return self.bounds. width @property def height(self): return self.bounds.height @property def center(self): return self.bounds.center @property def centerx(self): return self.bounds.centerx @property def centery(self): return self. bounds.centery def draw(self, surface): pass def move(self, dx, dy): self.bounds = self.bounds.move(dx, dy) def update(self): if self.speed == 0, 0: return self.move(*self.speed)
GameObject предназначен для того, чтобы быть базовым классом для других объектов. Он раскрывает многие свойства прямоугольника self.bounds напрямую, а в методе update() перемещает объект в соответствии с его текущей скоростью. Ничего не происходит в методе draw(), который должен быть переопределен подклассами.
Класс Game
Класс Game — это сердце игры. Он запускается в главном цикле. Он имеет множество полезных функций. Давайте разберем все по порядку.
Метод __init__() инициализирует сам Pygame, систему типов и звуковой микшер. Нам нужны три разных вызова, потому что не каждый Pygame использует все компоненты. Таким образом, мы можем проверить используемые подсистемы и инициализировать только нужные из них с нужными параметрами. Метод создает фоновое изображение, основной интерфейс (где все отображается) и игровой таймер с нужной частотой кадров.
Создание простейшей игры с числами
Давайте рассмотрим проект по созданию игры чисел на определение. Используя приведенный выше текст, попробуйте проанализировать строки и понять, за что отвечает каждая из них.
Строки 1 и 3 отвечают за установку переменной NTG в число от 0 до 200 и номера пользователя, который изначально раве н-1.
Строка 5 — это цикл, который выполняется до тех пор, пока переменная NTG не совпадет с переменной, которую пользователь ввел в окне программы.
Строки с 6 по 10 выполняют основную работу и дают игроку подсказки о том, чем отличается написанное число. Если она совпадает с НТГ, то печатается строка с поздравлением игрока с выигрышем (11).
Последний, 13, отвечает за окончание игры и завершение цикла. Второй вариант — не указывать значения TRUE и FALSE.
Но на основе того, что мы узнали выше, мы можем улучшить программу, сделав окно немного интереснее. Поскольку в этой игре нет фигур или объектов, мы заменяем фон на строки
ЖЕЛТЫЙ = (255, 255, 0)
Мы установили желтый фон экрана. Теперь синтаксис программы в окне становится более интересным. Это первая простая игра, созданная без использования pygame.
Змейка
Теперь перейдем к более сложной практической части этого урока. Мы хотим создать классическую игру Nibbles или, другими словами, «змейку». Первая версия была выпущена где-то в 1970-х годах, а затем перенесена на систему PC. Суть игры заключается в том, что существо ходит по окну, а игрок управляет им. Яблоки появляются в случайных местах на игровом поле, и игрок должен съесть их, избегая растущего тела и ограничивающих стен.
Размер части нашей плазмы составляет 10 пикселей. Управление осуществляется с помощью клавиш со стрелками на клавиатуре. Она начинается сразу после нажатия кнопки «Compile». А если происходит столкновение со стеной, появляется сообщение «Game Over».
Создайте игру с помощью виджета Canvas. Это делается для определения объектов с помощью изображений. Она также поможет вам зафиксировать столкновение и завершить игру.
В общей сложности мы получим 5 переменных:
- DELAY – скорость игры.
- ALL_DOTS – количество сегментов змейки, которое может быть.
- RAND_POS – чтобы яблоко появлялось в случайной точке.
- HEIGHT и WIDTH – отвечают за размер игрового поля.
- DOT_SIZE – размер одного сегмента и яблока.
Давайте определим две таблицы:
В них хранятся все связи нашего существа.
Эти 11 рядов отвечают за три изображения в нашей игре: сегмент, голову змеи и яблоко. Вы можете нарисовать их сами или скачать из Интернета. В игровом окне отображаются три маленькие картинки.
С помощью этих двух строк мы создали объекты на игровом поле и установили, что яблоко появляется в случайном месте в окне.
С помощью этих команд мы создадим изображение на холсте. За это отвечает команда image. Если мы хотим, чтобы изображение появлялось у границ окна, нам нужно установить параметр anchor в NW (North and West). С помощью параметра tag мы можем находить и идентифицировать все изображения и объекты в окне. Метка может идентифицировать группу объектов в нашей игре.
С помощью команды checkApple мы можем узнать, съела ли наша змея яблоко, и добавить к ней сегмент, если съела. Команда find_withtag находит один из объектов в окне, который использует определенный заданный тег. Нам нужны только два объекта — яблоко и голова змеи.
Когда яблоко съедается, т.е. сталкивается с головой, в точке столкновения создается новый сегмент. Когда вы выполняете метод locateApple, яблоко удаляется с холста и создается новое яблоко в случайной точке.
Мы управляем головой змеи, а метод doMove помогает нам изменить ее положение. Остальные части движутся непрерывной цепочкой за головой.
Поэтому мы напишем простую игру, в которой обычная змея ест яблоки и растет, пока не ударится о себя или поле.
Вывод
В итоге мы научились создавать простые игры без графики, создали шаблон для создания программы в Pygames и приступили к созданию серьезной программы типа Snake. Все эти навыки помогут в разработке будущих игр и прояснят основные аспекты программирования на Python. Если что-то пошло не так или компилятор не может запустить код, следует проверить все строки кода на наличие ошибок и попытаться переписать программу в другом окне. Вам нужно быть максимально осторожными, и все будет хорошо.
Ниже вы найдете полный текст программы «Змея»: