Как сделать игру аркаду
Создаем 2D игру на Python с библиотекой Arcade
Мы продолжаем делится с вами интересными найденными вещами про питончик. Сегодня вот решили разобраться с 2D играми. Это, конечно, немного попроще, чем то, что проходят у нас на курсе «Разработчик Python», но не менее интересно это уж точно.
Python — выдающийся язык для начинающих изучать программирование. Он также идеально подходит тем, кто хочет “просто взять и сделать”, а не тратить кучу времени на шаблонный код. Arcade — библиотека Python для создания 2D игр, с низким порогом вхождения, но очень функциональная в опытных руках. В этом статье я объясню, как начать использовать Python и Arcade для программирования игр.
Я начал разрабатывать на Arcade после преподавания азов библиотеки PyGame студентам. Я очно преподавал PyGames в течение почти 10 лет, а также разработал ProgramArcadeGames.com для обучения онлайн. PyGames отличная, но в какой-то момент я понял, что устал тратить время на оправдание багов, которые никогда не фиксятся.
Меня беспокоило преподавание таких вещей, как событийный цикл, которым уже почти не пользовались. И был целый раздел, в котором я объяснял, почему y-координаты повернуты в противоположном направлении. PyGames обновлялась редко и базировалась на старой библиотеке SDL 1, а не чем-то более современном вроде OpenGL. На светлое будущее я не рассчитывал.
В моих мечтах была простая и мощная библиотека, которая бы использовала новые фичи Python 3, например, декораторы и тайп-хинтинг. Ей оказалась Arcade. Посмотрим, как начать ее использовать.
Установка
Arcade, как и многие другие пакеты, доступна на PyPi, а значит, можно установить Arcade при помощи команды pip (или pipenv). Если Python уже установлен, скорее всего можно просто открыть командную строку Windows и написать:
Для более детализированной инструкции по установке, почитайте документацию по установке Arcade.
Простой рисунок
Вы можете открыть окно и нарисовать простой рисунок всего несколькими строчками кода. В качестве примера, нарисуем смайлик, как на картинке ниже:
Скрипт ниже показывает, как это сделать, используя команды рисования Arcade. Заметьте, что вам не обязательно знать, как использовать классы или определять функции. Программирование с быстрым визуальным фидбеком — хороший старт для тех, кто только учится.
Использование функций
Конечно, писать код в глобальном контексте — не лучший способ. К счастью, использование функций поможет улучшить ваш код. Ниже приведен пример того, как нарисовать елку в заданных координатах (x, y), используя функцию:
Для полного примера, посмотрите рисунок с функциями.
Более опытные программисты знают, что современные программы сначала загружают графическую информацию на видеокарту, а затем просят ее отрисовать batch-файлом. Arcade это поддерживает. Индивидуальная отрисовка 10000 прямоугольников занимает 0.8 секунды. Отрисовка того же количества батником займет менее 0.001 секунды.
Класс Window
Большие программы обычно базируются на классе Window или используют декораторы. Это позволяет программисту писать код, контролирующий отрисовку, обновление и обработку входных данных пользователя. Ниже приведен шаблон для программы с Window-основой.
В классе Window есть несколько методов, которые ваши программы могут переопределять для обеспечения функциональности. Вот список тех, что используются чаще всего:
Спрайты
Спрайты — простой способ создания 2D bitmap объектов в Arcade. В нем есть методы, позволяющие с легкостью рисовать, перемещать и анимировать спрайты. Также можно использовать спрайты для отслеживания коллизий между объектами.
Создание спрайта
Создать инстанс Sprite класса Arcade очень легко. Программисту необходимо только название файла изображения, на котором будет основываться спрайт, и, опционально, число раз для увеличения или уменьшения изображения. Например:
Этот код создает спрайт, используя изображение coin_01.png. Картинка уменьшится до 20% от исходной.
Список спрайтов
Спрайты обычно организуются в списки. Они помогают упростить их управление. Спрайты в списке будут использовать OpenGl для групповой batch-отрисовки. Нижеприведенный код настраивает игру, где есть игрок и множество монет, которые игрок должен собрать. Мы используем два списка — один для игрока и один для монеток.
Мы с легкостью можем отрисовать все монетки в списке монеток:
Отслеживание коллизий спрайтов
Функция check_for_collision_with_list позволяет увидеть, если спрайт наталкивается на другой спрайт из списка. Используем ее, чтобы увидеть все монетки, с которыми пересекается спрайт игрока. Применив простой for- цикл, можно избавиться от монетки в игре и увеличить счет.
С полным примером можно ознакомиться в collect_coins.py.
Игровая физика
Во многих играх есть физика в том или ином виде. Самые простое, например, что top-down игры не позволяют игроку проходить сквозь стены. Платформеры добавляют сложности с гравитацией и движущимися платформами. Некоторые игры используют полноценные физические 2D движки с массами, трением, пружинами и тд.
Top-down игры
Для простых игр с видом сверху программе на Arcade необходим список стен (или чего-то подобного), через которые игрок не сможет проходить. Обычно я называю это wall_list. Затем создается физический движок в установочном коде класса Window:
player_sprite получает вектор движения с двумя атрибутами change_x и change_y. Просто пример использования — перемещение игрока с помощью клавиатуры.
Несмотря на то что этот код задает скорость игрока, он его не перемещает. Метод update в классе Window вызывает physics_engine.update(), что заставит игрока двигаться, но не через стены.
Пример полностью можно посмотреть в sprite_move_walls.py.
Платформеры
Переход к платформеру с видом сбоку достаточно прост. Программисту необходимо переключить физический движок на PhysicsEnginePlatformer и добавить гравитационную константу.
Для добавления тайлов и блоков, из которых будет состоять уровень, можно использовать программу вроде Tiled.
Учитесь на примере
Учиться на примере — один из лучших методов. В библиотеке Arcade есть большой список образцов программ, на которые можно ориентироваться при создании игры. Эти примеры раскрывают концепты игр, о которых спрашивали мои онлайн и оффлайн студенты в течение нескольких лет.
Запускать демки при установленной Arcade совсем не сложно. В начале программы каждого примера есть комментарий с командой, которую нужно ввести в командную строку для запуска этого примера. Например:
Как всегда ждём ваши комментарии и вопросы, которые можно оставить тут или зайти к Стасу на день открытых дверей.
Как создать 2D игру с Python и аркадной библиотекой
Привет, Хабр! представляю вашему вниманию перевод статьи How to create a 2D game with Python and the Arcade library автора Paul Vincent Craven
Как создать 2D игру с Python и аркадной библиотекой
Узнайте, как начать работу с Arcade, простой в использовании библиотеки Python для создания 2D-видеоигр.
Phython это отличный язык для людей, обучающихся программированию, и идеально подходит для тех, кто хочет «сделать что-то» а не тратить кучу времени на шаблонный код. Arcade это библиотека Python для создания 2D-видеоигр, которая проста в использовании и очень эффективна, когда вы набираетесь опыта. В этой статье я объясню, как начать использовать Python и Arcade для программирования видеоигр.
Я начал разработку на Arcade после обучения студентов с помощью библиотеки PyGame. Я преподавал лично, используя PyGame в течение почти 10 лет, и я разработал ProgramArcadeGames.com чтобы преподавать онлайн. PyGame-это здорово, но в конце концов я почувствовал, что трачу время на то, чтобы покрывать ошибки, которые никогда не исправлялись.
Я беспокоился о преподавании таких вещей, как цикл событий, который больше не был тем, как мы кодируем. У меня был целый раздел, в котором я объяснил, почему координаты Y были перевернуты. Поскольку PyGame редко обновлялся, и он основан на старой библиотеке SDL 1, а не на чем-то вроде более современного, такого как OpenGL, у меня не было большой надежды на будущее.
Я хотел создать библиотеку, которая была бы проще в использовании, более мощной и использовал некоторые из новых функций Python 3, такие как декораторы и подсказки типов. Это Аркада. И вот как надо начинать.
Установка
Arcade, как и многие другие пакеты, доступна через PyPi, что означает, что вы можете установить Arcade с помощью pip команды (или команды pipenv). Если у вас уже установлен Python, вы, вероятно, можете просто открыть командную строку в Windows и набрать:
Или на MacOS и Linux типе:
Для получения более подробной инструкции по установке, вы можете обратиться к Документация по установке аркады.
Простой рисунок
Вы можете открыть окно и создать простые рисунки с помощью всего лишь нескольких строк кода. Давайте создадим пример, который рисует смайлик, как показано на рисунке ниже:
Алгоритм ниже показывает, как вы можете использовать команды рисования Arcade для этого. Обратите внимание, что вам не нужно знать, как использовать классы или даже определять функции. Программирование с быстрой визуальной обратной связью отлично подходит для тех, кто хочет начать обучение программированию.
Использование функции
Конечно, написание кода в глобальном контексте не очень хорошая форма. К счастью, улучшить вашу программу с помощью функций легко. Здесь мы можем увидеть пример рисования сосны в определенном (x, y) месте с использованием функции:
Полный пример см. в разделе рисование с функциями.
Более опытный программист будет знать, что современные графические программы сначала загружают графическую информацию на видеокарту, а затем просят видеокарту нарисовать ее позже в виде пакета. Аркада также поддерживает это. Рисование 10 000 прямоугольников по отдельности занимает около 0,800 секунды. Рисование их в виде пакета занимает менее 0,001 секунды.
класс Window
Более крупные программы обычно наследуются от класса Window или используют декораторы. Это позволяет программисту писать код для обработки рисования, обновления и обработки входных данных от пользователя. Шаблон для запуска оконной программы приведен ниже.
Класс Window имеет несколько методов, которые ваши программы могут переопределять для обеспечения функциональности программы. Вот некоторые из наиболее часто используемых:
on_draw: весь код для рисования экрана идет сюда.
Обновление: весь код для перемещения ваших предметов и выполнения игровой логики находится здесь. Это называется около 60 раз в секунду.
on_key_press: обрабатывать события при нажатии клавиши, например, давать игроку скорость.
on_key_release: обрабатывает при отпускании ключа, здесь вы можете остановить движение игрока.
on_mouse_motion: вызывается каждый раз, когда движется мышь.
on_mouse_press: вызывается при нажатии кнопки мыши.
set_viewport: эта функция используется в играх с прокруткой, когда ваш мир намного больше, чем то, что можно увидеть на одном экране. Вызов set_viewport позволяет программисту установить, какая часть этого мира видна в данный момент.
Спрайты
Спрайты-это простой способ создать двухмерный растровый объект в Arcade. В Arcade есть методы, которые облегчают рисование, перемещение и анимацию спрайтов. Вы также можете легко использовать спрайты для обнаружения столкновений между объектами.
Создание спрайта
Создать экземпляр класса Sprite Arcade из графики легко. Программисту нужно только имя файла изображения, чтобы спрайт был основан, и, необязательно, число, чтобы масштабировать изображение вверх или вниз. Например:
Этот код создаст спрайт, используя изображение, хранящееся в coin_01.png. Изображение будет уменьшено до 20% от его первоначальной высоты и ширины.
Списки спрайтов
Спрайты обычно организованы в списки. Эти списки облегчают управление спрайтами. Спрайты в списке будут использовать OpenGL для пакетного рисования спрайтов как группы. Приведенный ниже код устанавливает игру с игроком и кучу монет, которые игрок собирает. Мы используем два списка, один для игрока и один для монет
Мы можем легко нарисовать все монеты в списках монет:
Обнаружение столкновений спрайтов
Обнаружение столкновений спрайтов
Функция check_for_collision_with_list позволяет нам увидеть, встречается ли спрайт с другим спрайтом в списке. Мы можем использовать это, чтобы увидеть все монеты, с которыми спрайт игрока соприкасается. Используя простой цикл for, мы можем избавиться от монеты из игры и увеличить наш счет.
Полный пример см. В разделе collect_coins.py.
Игровая физика
Многие игры включают в себя какую-то физику. Самыми простыми являются нисходящие программы, которые не позволяют игроку проходить сквозь стены. Платформеры добавляют больше сложности гравитации и движущимся платформам. В некоторых играх используется полноценный физический движок 2D с массой, трением, пружинами и многим другим.
Игры сверху вниз
Для простых игр сверху вниз аркадной программе нужен список стен, через которые игрок (или что-либо еще) не может пройти. Я обычно называю это wall_list. Затем физический движок создается в коде установки класса Window с помощью:
Player_sprite получает вектор движения с двумя атрибутами: change_x и change_y. Простым примером этого может быть перемещение игрока с помощью клавиатуры. Например, это может быть в настраиваемом дочернем элементе класса Window:
Хотя этот код устанавливает скорость игрока, он не перемещает игрока. В методе обновления класса Window при вызове Physics_engine.update () игрок будет перемещаться, но не через стены.
Полный пример см. В разделе sprite_move_walls.py.
Платформеры
Переход на платформер с боковым видом довольно прост. Программисту просто нужно переключить физический движок на PhysicsEnginePlatformer и добавить гравитационную постоянную.
Вы можете использовать такую программу, как Tiled чтобы заложить плитки / блоки, которые составляют ваш уровень.
Для полной 2D физики вы можете интегрировать библиотеку PyMunk.
Учись на примере
Один из лучших способов обучения — это пример. В библиотеке Аркад есть длинный список примеров программ, которые человек может использовать для создания игр. Каждый из этих примеров показывает концепцию игры, которую студенты просили на моих уроках или в Интернете на протяжении многих лет.
Запустить любую из этих демонстраций легко после установки Arcade. Каждый из примеров имеет комментарий в начале программы с командой, которую вы можете ввести в командной строке для запуска примера, например:
Краткие сведения
Arcade позволяет начать программирование графики и игр с помощью простого для понимания кода. Многие новые программисты создали отличные игры вскоре после начала. Попробуйте!
Как создать аркадную игру с помощью Phaser 3
Введение
Создайте свою первую игру
Цели обучения
Требования к учебнику
Среда разработки
Минимальная среда разработки, необходимая нам состоит из редактора кода, веб-браузера и локального веб-сервера. Первые два требования тривиальны, но последний требует немного большего объяснения. Почему нам нужен локальный веб-сервер?
Когда вы загружаете обычный веб-сайт, часто содержимое страницы загружается перед изображениями, верно? Ну, представьте, если это произошло в игре. Это действительно выглядело бы ужасно, если бы игра загружалась, но изображение игрока не было готово.
Phaser должен предварительно загрузить все изображения и ресурсы перед началом игры. Это означает, что игре потребуется доступ к файлам после загрузки страницы. Это приводит нас к необходимости веб-сервера.
По умолчанию браузеры не позволяют веб-сайтам получать доступ к файлам с вашего локального диска. Это сделано в целях безопасности. Если просто двойным щелчком открыть файл index.html нашей игры, то вы увидите, что ваш браузер не позволяет игре загружать ресурсы.
Настройка локального веб-сервера
Первая программа в Paser 3
Более продвинутые разработчики могут захотеть отклониться от данных инструкций и использовать более сложную настройку среды разработки и рабочий процесс. Охват этих тем выходит за рамки данного руководства, но вы можете найти отличную отправную точку здесь, где используются Webpack и Babel.
В нашей папке проекта создайте файл index.html со следующим содержимым:
Что мы здесь делаем:
Жизненный цикл сцены
Чтобы добавить первые изображения в нашу игру, нам необходимо выработать базовое понимание жизненного цикла сцены:
В жизненном цикле сцены есть больше методов (рендеринг, выключение, уничтожение), но мы не будем использовать их в этом уроке.
Добавление спрайтов
Координаты
Это означает, что, когда мы поместили фон по координатам (0,0), мы фактически сказали Phaser: поместите центр спрайта в (0,0). Отсюда и результат, который мы получили.
Чтобы поместить верхний левый угол нашего спрайта в верхний левый угол экрана, мы можем изменить начальную точку спрайта, чтобы она была в верхнем левом углу:
Фон теперь будет отображаться правильно:
Игрок
Затем мы добавим спрайт player и уменьшим его размер на 50% в методе create :
Наша Валькирия готова к действиям! Теперь нам нужно добавить ей способность перемещаться с помощью мыши или сенсорного экрана.
Пользовательский ввод
Phaser 3 предоставляет множество способов работы с пользовательским вводом и событиями. В этой игре мы не будем использовать события, а просто проверим, включен ли «активный ввод» (по умолчанию, левая кнопка мыши или касание экрана).
Если игрок щелкает мышью и касается в любом месте игры, наша Валькирия будет идти вперед.
Чтобы проверить ввод таким способом, нам нужно добавить метод update к нашему объекту сцены, который обычно вызывается 60 раз в секунду (он основан на методе requestAnimationFrame, в менее производительных устройствах он будет вызываться реже, поэтому не используйте 60 в вашей игровой логике):
Перемещение игрока
Когда вход активен, мы увеличим позицию X игрока:
Теперь мы можем управлять нашим игроком и перемещать его до конца видимой области!
Охота за сокровищами
Что хорошего в игре без четкой цели (например, как в Minecraft!). Давайте добавим сундук с сокровищами в конце уровня. Когда игрок коснется сокровища, мы перезапустим сцену.
Поскольку мы уже предварительно загрузили все ресурсы, перейдем прямо к части создания спрайта. Обратите внимание, как мы размещаем сундук по оси X на 80 пикселей слева от края экрана:
В этом уроке мы не используем физическую систему, такую как Arcade (которая поставляется с Phaser). Вместо этого мы проверяем столкновение с помощью служебного метода, который входит в Phaser и позволяет нам определить, перекрываются ли два прямоугольника.
Группа драконов
Жизнь не легка, и если наша Валькирия хочет получить ее золото, ей придется бороться за него. Что может быть лучше в качестве врагов, чем злые желтые драконы!
Далее мы создадим группу движущихся драконов. У наших врагов будет движение вверх-вниз: то, что вы ожидаете увидеть в клоне игры Frogger.
Драконы слишком большие. Давайте уменьшим их:
Так выглядит лучше:
Прыжки врагов
При создании игр и реализации механики, на мой взгляд, всегда стоит хорошо обрисовывать их и понимать задолго до попытки реализации. Движение драконов вверх и вниз будет следовать логике:
Поскольку у нас есть массив врагов, мы будем обновлять этот массив в update и применять эту логику движения к каждому врагу.
Этот код заставит драконов двигаться вверх и вниз при условии, что скорость была установлена. Давайте позаботимся об этом сейчас. В методе create после масштабирования наших драконов, давайте зададим каждому врагу случайную скорость между 1 и 2:
Метод Phaser.Actions.Call позволяет нам вызывать анонимную функцию для каждого элемента массива. Мы передаем его как контекст (хотя и не используем его в качестве контекста). Теперь наше движение вверх и вниз завершено!
Столкновение с врагами
Эффект дрожания камеры
Существует проблема в этой реализации, вы можете догадаться какая?
После столкновения с врагом метод gameOver будет вызываться много раз в течение 500 мс. Нам нужен какой-то переключатель, чтобы при столкновении с драконом игровой процесс зависал.
Добавьте следующее в конце create :
Наш новый метод gameOver :
Теперь метод не будет активирован много раз подряд.
Затухание
Прежде чем попрощаться, мы добавим эффект затухания, который начнется в середине тряски камеры:
Вот и все для этого урока! Надеюсь, вы нашли этот урок полезным.