Как создать 2D игру с Python и аркадной библиотекой
Как создать 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 и набрать:
pip install arcade
Или на MacOS и Linux типе:
pip3 install arcade
Для получения более подробной инструкции по установке, вы можете обратиться к Документация по установке аркады.
Простой рисунок
Вы можете открыть окно и создать простые рисунки с помощью всего лишь нескольких строк кода. Давайте создадим пример, который рисует смайлик, как показано на рисунке ниже:

Алгоритм ниже показывает, как вы можете использовать команды рисования Arcade для этого. Обратите внимание, что вам не нужно знать, как использовать классы или даже определять функции. Программирование с быстрой визуальной обратной связью отлично подходит для тех, кто хочет начать обучение программированию.
import arcade # Set constants for the screen size SCREEN_WIDTH = 600 SCREEN_HEIGHT = 600 # Open the window. Set the window title and dimensions (width and height) arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, "Drawing Example") # Set the background color to white. # For a list of named colors see: # http://arcade.academy/arcade.color.html # Colors can also be specified in (red, green, blue) format and # (red, green, blue, alpha) format. arcade.set_background_color( arcade.color.WHITE) # Start the render process. This must be done before any drawing commands. arcade.start_render() # Draw the face x = 300 y = 300 radius = 200 arcade.draw_circle_filled( x, y, radius, arcade.color.YELLOW) # Draw the right eye x = 370 y = 350 radius = 20 arcade.draw_circle_filled( x, y, radius, arcade.color.BLACK) # Draw the left eye x = 230 y = 350 radius = 20 arcade.draw_circle_filled( x, y, radius, arcade.color.BLACK) # Draw the smile x = 300 y = 280 width = 120 height = 100 start_angle = 190 end_angle = 350 arcade.draw_arc_outline( x, y, width, height, arcade.color.BLACK, start_angle, end_angle, 10) # Finish drawing and display the result arcade.finish_render() # Keep the window open until the user hits the 'close' button arcade.run()
Использование функции
Конечно, написание кода в глобальном контексте не очень хорошая форма. К счастью, улучшить вашу программу с помощью функций легко. Здесь мы можем увидеть пример рисования сосны в определенном (x, y) месте с использованием функции:
def draw_pine_tree(x, y) : """ This function draws a pine tree at the specified location. """ # Draw the triangle on top of the trunk. # We need three x, y points for the triangle. arcade.draw_triangle_filled( x + 40, y, # Point 1 x, y - 100, # Point 2 x + 80, y - 100, # Point 3 arcade.color.DARK_GREEN) # Draw the trunk arcade.draw_lrtb_rectangle_filled( x + 30, x + 50, y - 100, y - 140 , arcade.color.DARK_BROWN)
Полный пример см. в разделе рисование с функциями.

Более опытный программист будет знать, что современные графические программы сначала загружают графическую информацию на видеокарту, а затем просят видеокарту нарисовать ее позже в виде пакета. Аркада также поддерживает это. Рисование 10 000 прямоугольников по отдельности занимает около 0,800 секунды. Рисование их в виде пакета занимает менее 0,001 секунды.
класс Window
Более крупные программы обычно наследуются от класса Window или используют декораторы. Это позволяет программисту писать код для обработки рисования, обновления и обработки входных данных от пользователя. Шаблон для запуска оконной программы приведен ниже.
import arcade SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 class MyGame( arcade.Window): """ Main application class. """ def __init__(self, width, height) : super( ) .__init__(width, height) arcade.set_background_color( arcade.color.AMAZON) def setup( self) : # Set up your game here pass def on_draw(self) : """ Render the screen. """ arcade.start_render() # Your drawing code goes here def update(self, delta_time) : """ All the logic to move, and the game logic goes here. """ pass def main( ) : game = MyGame( SCREEN_WIDTH, SCREEN_HEIGHT) game.setup( ) arcade.run() if __name__ = = "__main__": main()
Класс Window имеет несколько методов, которые ваши программы могут переопределять для обеспечения функциональности программы. Вот некоторые из наиболее часто используемых:
on_draw: весь код для рисования экрана идет сюда.
Обновление: весь код для перемещения ваших предметов и выполнения игровой логики находится здесь. Это называется около 60 раз в секунду.
on_key_press: обрабатывать события при нажатии клавиши, например, давать игроку скорость.
on_key_release: обрабатывает при отпускании ключа, здесь вы можете остановить движение игрока.
on_mouse_motion: вызывается каждый раз, когда движется мышь.
on_mouse_press: вызывается при нажатии кнопки мыши.
set_viewport: эта функция используется в играх с прокруткой, когда ваш мир намного больше, чем то, что можно увидеть на одном экране. Вызов set_viewport позволяет программисту установить, какая часть этого мира видна в данный момент.
Спрайты
Спрайты-это простой способ создать двухмерный растровый объект в Arcade. В Arcade есть методы, которые облегчают рисование, перемещение и анимацию спрайтов. Вы также можете легко использовать спрайты для обнаружения столкновений между объектами.
Создание спрайта
Создать экземпляр класса Sprite Arcade из графики легко. Программисту нужно только имя файла изображения, чтобы спрайт был основан, и, необязательно, число, чтобы масштабировать изображение вверх или вниз. Например:
SPRITE_SCALING_COIN = 0,2 coin = arcade.Sprite("coin_01.png", SPRITE_SCALING_COIN)

Этот код создаст спрайт, используя изображение, хранящееся в coin_01.png. Изображение будет уменьшено до 20% от его первоначальной высоты и ширины.
Списки спрайтов
Спрайты обычно организованы в списки. Эти списки облегчают управление спрайтами. Спрайты в списке будут использовать OpenGL для пакетного рисования спрайтов как группы. Приведенный ниже код устанавливает игру с игроком и кучу монет, которые игрок собирает. Мы используем два списка, один для игрока и один для монет
def setup(self): """ Set up the game and initialize the variables. """ # Create the sprite lists self.player_list = arcade.SpriteList() self.coin_list = arcade.SpriteList() # Score self.score = 0 # Set up the player # Character image from kenney.nl self. player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER) self.player_sprite.center_x = 50 # Starting position self.player_sprite.center_y = 50 self.player_list.append(self.player_sprite) # Create the coins for i in range( COIN_COUNT): # Create the coin instance # Coin image from kenney.nl coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN) # Position the coin coin.center_x = random.randrange(SCREEN_WIDTH) coin.center_y = random.randrange(SCREEN_HEIGHT) # Add the coin to the lists self.coin_list.append(coin)
Мы можем легко нарисовать все монеты в списках монет:
def on_draw(self): """ Draw everything """ arcade.start_render() self.coin_list.draw() self.player_list.draw()
Обнаружение столкновений спрайтов
Обнаружение столкновений спрайтов
Функция check_for_collision_with_list позволяет нам увидеть, встречается ли спрайт с другим спрайтом в списке. Мы можем использовать это, чтобы увидеть все монеты, с которыми спрайт игрока соприкасается. Используя простой цикл for, мы можем избавиться от монеты из игры и увеличить наш счет.
def update(self, delta_time): # Generate a list of all coin sprites that collided with the player. coins_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list) # Loop through each colliding sprite, remove it, and add to the score. for coin in coins_hit_list: coin.kill() self.score += 1
Полный пример см. В разделе collect_coins.py.
Игровая физика
Многие игры включают в себя какую-то физику. Самыми простыми являются нисходящие программы, которые не позволяют игроку проходить сквозь стены. Платформеры добавляют больше сложности гравитации и движущимся платформам. В некоторых играх используется полноценный физический движок 2D с массой, трением, пружинами и многим другим.
Игры сверху вниз

Для простых игр сверху вниз аркадной программе нужен список стен, через которые игрок (или что-либо еще) не может пройти. Я обычно называю это wall_list. Затем физический движок создается в коде установки класса Window с помощью:
self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)
Player_sprite получает вектор движения с двумя атрибутами: change_x и change_y. Простым примером этого может быть перемещение игрока с помощью клавиатуры. Например, это может быть в настраиваемом дочернем элементе класса Window:
MOVEMENT_SPEED = 5 def on_key_press(self, key, modifiers) : """Called whenever a key is pressed. """ if key = = arcade.key.UP: self.player_sprite.change_y = MOVEMENT_SPEED elif key = = arcade.key.DOWN: self.player_sprite.change_y = -MOVEMENT_SPEED elif key = = arcade.key.LEFT: self.player_sprite.change_x = -MOVEMENT_SPEED elif key = = arcade.key.RIGHT: self.player_sprite.change_x = MOVEMENT_SPEED def on_key_release(self, key, modifiers) : """Called when the user releases a key. """ if key = = arcade.key.UP or key = = arcade.key.DOWN: self.player_sprite.change_y = 0 elif key = = arcade.key.LEFT or key = = arcade.key.RIGHT: selfplayer_sprite.change_x = 0
Хотя этот код устанавливает скорость игрока, он не перемещает игрока. В методе обновления класса Window при вызове Physics_engine.update () игрок будет перемещаться, но не через стены.
def update(self, delta_time): """ Movement and game logic """ self.physics_engine.update()
Полный пример см. В разделе sprite_move_walls.py.
Платформеры

Переход на платформер с боковым видом довольно прост. Программисту просто нужно переключить физический движок на PhysicsEnginePlatformer и добавить гравитационную постоянную.
self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite, self.wall_list, gravity_constant= GRAVITY)
Вы можете использовать такую программу, как Tiled чтобы заложить плитки / блоки, которые составляют ваш уровень.
Для примера, смотрите sprite_tiled_map.py.
Для полной 2D физики вы можете интегрировать библиотеку PyMunk.
Учись на примере
Один из лучших способов обучения — это пример. В библиотеке Аркад есть длинный список примеров программ, которые человек может использовать для создания игр. Каждый из этих примеров показывает концепцию игры, которую студенты просили на моих уроках или в Интернете на протяжении многих лет.
Запустить любую из этих демонстраций легко после установки Arcade. Каждый из примеров имеет комментарий в начале программы с командой, которую вы можете ввести в командной строке для запуска примера, например:
python -m arcade.examples.sprite_moving_platforms
Краткие сведения
Arcade позволяет начать программирование графики и игр с помощью простого для понимания кода. Многие новые программисты создали отличные игры вскоре после начала. Попробуйте!
Создаем 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 и написать:
pip install arcade
А в Linux и MacOS:
pip3 install arcade
Для более детализированной инструкции по установке, почитайте документацию по установке Arcade.
Простой рисунок
Вы можете открыть окно и нарисовать простой рисунок всего несколькими строчками кода. В качестве примера, нарисуем смайлик, как на картинке ниже:

Скрипт ниже показывает, как это сделать, используя команды рисования Arcade. Заметьте, что вам не обязательно знать, как использовать классы или определять функции. Программирование с быстрым визуальным фидбеком — хороший старт для тех, кто только учится.
import arcade # Задать константы для размеров экрана SCREEN_WIDTH = 600 SCREEN_HEIGHT = 600 # Открыть окно. Задать заголовок и размеры окна (ширина и высота) arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, "Drawing Example") # Задать белый цвет фона. # Для просмотра списка названий цветов прочитайте: # http://arcade.academy/arcade.color.html # Цвета также можно задавать в (красный, зеленый, синий) и # (красный, зеленый, синий, альфа) формате. arcade.set_background_color(arcade.color.WHITE) # Начать процесс рендера. Это нужно сделать до команд рисования arcade.start_render() # Нарисовать лицо x = 300 y = 300 radius = 200 arcade.draw_circle_filled(x, y, radius, arcade.color.YELLOW) # Нарисовать правый глаз x = 370 y = 350 radius = 20 arcade.draw_circle_filled(x, y, radius, arcade.color.BLACK) # Нарисовать левый глаз x = 230 y = 350 radius = 20 arcade.draw_circle_filled(x, y, radius, arcade.color.BLACK) # Нарисовать улыбку x = 300 y = 280 width = 120 height = 100 start_angle = 190 end_angle = 350 arcade.draw_arc_outline(x, y, width, height, arcade.color.BLACK, start_angle, end_angle, 10) # Завершить рисование и показать результат arcade.finish_render() # Держать окно открытым до тех пор, пока пользователь не нажмет кнопку “закрыть” arcade.run()
Использование функций
Конечно, писать код в глобальном контексте — не лучший способ. К счастью, использование функций поможет улучшить ваш код. Ниже приведен пример того, как нарисовать елку в заданных координатах (x, y), используя функцию:
def draw_pine_tree(x, y): """ Эта функция рисует елку в указанном месте""" # Нарисовать треугольник поверх ствола. # Необходимы три x, y точки для рисования треугольника. arcade.draw_triangle_filled(x + 40, y, # Point 1 x, y - 100, # Point 2 x + 80, y - 100, # Point 3 arcade.color.DARK_GREEN) # Нарисовать ствол arcade.draw_lrtb_rectangle_filled(x + 30, x + 50, y - 100, y - 140, arcade.color.DARK_BROWN)
Для полного примера, посмотрите рисунок с функциями.

Более опытные программисты знают, что современные программы сначала загружают графическую информацию на видеокарту, а затем просят ее отрисовать batch-файлом. Arcade это поддерживает. Индивидуальная отрисовка 10000 прямоугольников занимает 0.8 секунды. Отрисовка того же количества батником займет менее 0.001 секунды.
Класс Window
Большие программы обычно базируются на классе Window или используют декораторы. Это позволяет программисту писать код, контролирующий отрисовку, обновление и обработку входных данных пользователя. Ниже приведен шаблон для программы с Window-основой.
import arcade SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 class MyGame(arcade.Window): """ Главный класс приложения. """ def __init__(self, width, height): super().__init__(width, height) arcade.set_background_color(arcade.color.AMAZON) def setup(self): # Настроить игру здесь pass def on_draw(self): """ Отрендерить этот экран. """ arcade.start_render() # Здесь код рисунка def update(self, delta_time): """ Здесь вся игровая логика и логика перемещения.""" pass def main(): game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT) game.setup() arcade.run() if __name__ == "__main__": main()
В классе Window есть несколько методов, которые ваши программы могут переопределять для обеспечения функциональности. Вот список тех, что используются чаще всего:
- on_draw: Весь код для отрисовки экрана находится здесь.
- update: Весь код для перемещения объектов и отработки игровой логики находится здесь. Вызывается примерно 60 раз в секунду.
- on_key_press: Обрабатывает события при нажатии кнопки, например, движение персонажа.
- on_key_release: Обрабатывает события при отпускании кнопки, например, остановка персонажа.
- on_mouse_motion: Вызывается каждый раз при движении мышки.
- on_mouse_press: Вызывается при нажатии кнопки мыши.
- set_viewport: Эта функция используется в скроллерах, когда мир значительно больше, чем то что видно на одном экране. Вызов set_viewport позволяет программисту задать ту часть экрана, которая будет видна.
Спрайты
Спрайты — простой способ создания 2D bitmap объектов в Arcade. В нем есть методы, позволяющие с легкостью рисовать, перемещать и анимировать спрайты. Также можно использовать спрайты для отслеживания коллизий между объектами.
Создание спрайта
Создать инстанс Sprite класса Arcade очень легко. Программисту необходимо только название файла изображения, на котором будет основываться спрайт, и, опционально, число раз для увеличения или уменьшения изображения. Например:
SPRITE_SCALING_COIN = 0.2 coin = arcade.Sprite("coin_01.png", SPRITE_SCALING_COIN)
Этот код создает спрайт, используя изображение coin_01.png. Картинка уменьшится до 20% от исходной.
Список спрайтов
Спрайты обычно организуются в списки. Они помогают упростить их управление. Спрайты в списке будут использовать OpenGl для групповой batch-отрисовки. Нижеприведенный код настраивает игру, где есть игрок и множество монет, которые игрок должен собрать. Мы используем два списка — один для игрока и один для монеток.
def setup(self): """ Настроить игру и инициализировать переменные. """ # Создать список спрайтов self.player_list = arcade.SpriteList() self.coin_list = arcade.SpriteList() # Счет self.score = 0 # Задать игрока и # Его изображение из kenney.nl self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER) self.player_sprite.center_x = 50 # Стартовая позиция self.player_sprite.center_y = 50 self.player_list.append(self.player_sprite) # Создать монетки for i in range(COIN_COUNT): # Создать инстанс монеток # и их изображение из kenney.nl coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN) # Задать положение монеток coin.center_x = random.randrange(SCREEN_WIDTH) coin.center_y = random.randrange(SCREEN_HEIGHT) # Добавить монетку к списку self.coin_list.append(coin)
Мы с легкостью можем отрисовать все монетки в списке монеток:
def on_draw(self): """ Нарисовать все """ arcade.start_render() self.coin_list.draw() self.player_list.draw()
Отслеживание коллизий спрайтов
Функция check_for_collision_with_list позволяет увидеть, если спрайт наталкивается на другой спрайт из списка. Используем ее, чтобы увидеть все монетки, с которыми пересекается спрайт игрока. Применив простой for- цикл, можно избавиться от монетки в игре и увеличить счет.
def update(self, delta_time): # Сгенерировать список всех спрайтов монеток, которые пересекаются с игроком. coins_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list) # Пройтись циклом через все пересекаемые спрайты, удаляя их и увеличивая счет. for coin in coins_hit_list: coin.kill() self.score += 1
С полным примером можно ознакомиться в collect_coins.py.
Игровая физика
Во многих играх есть физика в том или ином виде. Самые простое, например, что top-down игры не позволяют игроку проходить сквозь стены. Платформеры добавляют сложности с гравитацией и движущимися платформами. Некоторые игры используют полноценные физические 2D движки с массами, трением, пружинами и тд.
Top-down игры

Для простых игр с видом сверху программе на Arcade необходим список стен (или чего-то подобного), через которые игрок не сможет проходить. Обычно я называю это wall_list. Затем создается физический движок в установочном коде класса Window:
self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)
player_sprite получает вектор движения с двумя атрибутами change_x и change_y. Просто пример использования — перемещение игрока с помощью клавиатуры.
MOVEMENT_SPEED = 5 def on_key_press(self, key, modifiers): """Вызывается при нажатии пользователем клавиши""" if key == arcade.key.UP: self.player_sprite.change_y = MOVEMENT_SPEED elif key == arcade.key.DOWN: self.player_sprite.change_y = -MOVEMENT_SPEED elif key == arcade.key.LEFT: self.player_sprite.change_x = -MOVEMENT_SPEED elif key == arcade.key.RIGHT: self.player_sprite.change_x = MOVEMENT_SPEED def on_key_release(self, key, modifiers): """Вызывается, когда пользователь отпускает клавишу""" if key == arcade.key.UP or key == arcade.key.DOWN: self.player_sprite.change_y = 0 elif key == arcade.key.LEFT or key == arcade.key.RIGHT: self.player_sprite.change_x = 0
Несмотря на то что этот код задает скорость игрока, он его не перемещает. Метод update в классе Window вызывает physics_engine.update(), что заставит игрока двигаться, но не через стены.
def update(self, delta_time): """ Передвижение и игровая логика """ self.physics_engine.update()
Пример полностью можно посмотреть в sprite_move_walls.py.
Платформеры

Переход к платформеру с видом сбоку достаточно прост. Программисту необходимо переключить физический движок на PhysicsEnginePlatformer и добавить гравитационную константу.
self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite, self.wall_list, gravity_constant=GRAVITY)
Для добавления тайлов и блоков, из которых будет состоять уровень, можно использовать программу вроде Tiled.
Учитесь на примере
Учиться на примере — один из лучших методов. В библиотеке Arcade есть большой список образцов программ, на которые можно ориентироваться при создании игры. Эти примеры раскрывают концепты игр, о которых спрашивали мои онлайн и оффлайн студенты в течение нескольких лет.
Запускать демки при установленной Arcade совсем не сложно. В начале программы каждого примера есть комментарий с командой, которую нужно ввести в командную строку для запуска этого примера. Например:
python -m arcade.examples.sprite_moving_platforms
Как всегда ждём ваши комментарии и вопросы, которые можно оставить тут или зайти к Стасу на день открытых дверей.
Создание 2D платформера на Python

Для многих Python — это язык для написания веб проектов, машинного обучения или для анализа данных. На самом деле он более функционален и в этой статье мы вам это докажем.
Для реализации игр на Питон мы можем выбрать одну из нескольких библиотек. Можно работать с: Kivy, Tkinter, PyQt или же с любой другой библиотекой, что обеспечивает построение графического интерфейса через Python. Таких библиотек много, но мы возьмем библиотеку PyGame , которая даже своим названием говорит о её предназначении.
PyGame появился в 2000 году. С тех пор на его основе было сделано много интересных проектов . К сожалению, PyGame не универсален и разработка на нём ведется лишь под Андроид устройства.
Настройка проекта
Перед использованием PyGame его нужно установить через терминал. Прописываем команду:
pip install pygame
Для создания базового окна игры, необходимо лишь импортировать библиотеку, инициализировать главный объект, указать размеры, а также название окна и создать основной цикл, что должен вызываться постоянно и тем самым проект будет запущен и работать все время.
import pygame pygame.init() win = pygame.display.set_mode((500, 500)) # размеры X и Y pygame.display.set_caption("Название игры") while(True): pass
Сюда же дописываем отслеживание действий пользователя. Если он закроет окно, то мы будем останавливать программу.
import pygame pygame.init() win = pygame.display.set_mode((500, 500)) # размеры X и Y pygame.display.set_caption("Название игры") run = True while(run): for event in pygame.event.get(): if event.type == pygame.QUIT: run = False pygame.quit()
Создание платформера
Для создания платформера потребуется написать куда больше строк кода. Мы прикрепляем весь код проекта ниже. В коде есть комментарии для лучшего понимания:
import pygame # Переменные для установки ширины и высоты окна SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 # Подключение фото для заднего фона # Здесь лишь создание переменной, вывод заднего фона ниже в коде bg = pygame.image.load('bg.jpg') # Класс, описывающий поведение главного игрока class Player(pygame.sprite.Sprite): # Изначально игрок смотрит вправо, поэтому эта переменная True right = True # Методы def __init__(self): # Стандартный конструктор класса # Нужно ещё вызывать конструктор родительского класса super().__init__() # Создаем изображение для игрока # Изображение находится в этой же папке проекта self.image = pygame.image.load('idle.png') # Установите ссылку на изображение прямоугольника self.rect = self.image.get_rect() # Задаем вектор скорости игрока self.change_x = 0 self.change_y = 0 def update(self): # В этой функции мы передвигаем игрока # Сперва устанавливаем для него гравитацию self.calc_grav() # Передвигаем его на право/лево # change_x будет меняться позже при нажатии на стрелочки клавиатуры self.rect.x += self.change_x # Следим ударяем ли мы какой-то другой объект, платформы, например block_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False) # Перебираем все возможные объекты, с которыми могли бы столкнуться for block in block_hit_list: # Если мы идем направо, # устанавливает нашу правую сторону на левой стороне предмета, которого мы ударили if self.change_x > 0: self.rect.right = block.rect.left elif self.change_x < 0: # В противном случае, если мы движемся влево, то делаем наоборот self.rect.left = block.rect.right # Передвигаемся вверх/вниз self.rect.y += self.change_y # То же самое, вот только уже для вверх/вниз block_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False) for block in block_hit_list: # Устанавливаем нашу позицию на основе верхней / нижней части объекта, на который мы попали if self.change_y >0: self.rect.bottom = block.rect.top elif self.change_y < 0: self.rect.top = block.rect.bottom # Останавливаем вертикальное движение self.change_y = 0 def calc_grav(self): # Здесь мы вычисляем как быстро объект будет # падать на землю под действием гравитации if self.change_y == 0: self.change_y = 1 else: self.change_y += .95 # Если уже на земле, то ставим позицию Y как 0 if self.rect.y >= SCREEN_HEIGHT - self.rect.height and self.change_y >= 0: self.change_y = 0 self.rect.y = SCREEN_HEIGHT - self.rect.height def jump(self): # Обработка прыжка # Нам нужно проверять здесь, контактируем ли мы с чем-либо # или другими словами, не находимся ли мы в полете. # Для этого опускаемся на 10 единиц, проверем соприкосновение и далее поднимаемся обратно self.rect.y += 10 platform_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False) self.rect.y -= 10 # Если все в порядке, прыгаем вверх if len(platform_hit_list) > 0 or self.rect.bottom >= SCREEN_HEIGHT: self.change_y = -16 # Передвижение игрока def go_left(self): # Сами функции будут вызваны позже из основного цикла self.change_x = -9 # Двигаем игрока по Х if(self.right): # Проверяем куда он смотрит и если что, то переворачиваем его self.flip() self.right = False def go_right(self): # то же самое, но вправо self.change_x = 9 if (not self.right): self.flip() self.right = True def stop(self): # вызываем этот метод, когда не нажимаем на клавиши self.change_x = 0 def flip(self): # переворот игрока (зеркальное отражение) self.image = pygame.transform.flip(self.image, True, False) # Класс для описания платформы class Platform(pygame.sprite.Sprite): def __init__(self, width, height): # Конструктор платформ super().__init__() # Также указываем фото платформы self.image = pygame.image.load('platform.png') # Установите ссылку на изображение прямоугольника self.rect = self.image.get_rect() # Класс для расстановки платформ на сцене class Level(object): def __init__(self, player): # Создаем группу спрайтов (поместим платформы различные сюда) self.platform_list = pygame.sprite.Group() # Ссылка на основного игрока self.player = player # Чтобы все рисовалось, то нужно обновлять экран # При вызове этого метода обновление будет происходить def update(self): self.platform_list.update() # Метод для рисования объектов на сцене def draw(self, screen): # Рисуем задний фон screen.blit(bg, (0, 0)) # Рисуем все платформы из группы спрайтов self.platform_list.draw(screen) # Класс, что описывает где будут находится все платформы # на определенном уровне игры class Level_01(Level): def __init__(self, player): # Вызываем родительский конструктор Level.__init__(self, player) # Массив с данными про платформы. Данные в таком формате: # ширина, высота, x и y позиция level = [ [210, 32, 500, 500], [210, 32, 200, 400], [210, 32, 600, 300], ] # Перебираем массив и добавляем каждую платформу в группу спрайтов - platform_list for platform in level: block = Platform(platform[0], platform[1]) block.rect.x = platform[2] block.rect.y = platform[3] block.player = self.player self.platform_list.add(block) # Основная функция прогарммы def main(): # Инициализация pygame.init() # Установка высоты и ширины size = [SCREEN_WIDTH, SCREEN_HEIGHT] screen = pygame.display.set_mode(size) # Название игры pygame.display.set_caption("Платформер") # Создаем игрока player = Player() # Создаем все уровни level_list = [] level_list.append(Level_01(player)) # Устанавливаем текущий уровень current_level_no = 0 current_level = level_list[current_level_no] active_sprite_list = pygame.sprite.Group() player.level = current_level player.rect.x = 340 player.rect.y = SCREEN_HEIGHT - player.rect.height active_sprite_list.add(player) # Цикл будет до тех пор, пока пользователь не нажмет кнопку закрытия done = False # Используется для управления скоростью обновления экрана clock = pygame.time.Clock() # Основной цикл программы while not done: # Отслеживание действий for event in pygame.event.get(): if event.type == pygame.QUIT: # Если закрыл программу, то останавливаем цикл done = True # Если нажали на стрелки клавиатуры, то двигаем объект if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: player.go_left() if event.key == pygame.K_RIGHT: player.go_right() if event.key == pygame.K_UP: player.jump() if event.type == pygame.KEYUP: if event.key == pygame.K_LEFT and player.change_x < 0: player.stop() if event.key == pygame.K_RIGHT and player.change_x > 0: player.stop() # Обновляем игрока active_sprite_list.update() # Обновляем объекты на сцене current_level.update() # Если игрок приблизится к правой стороне, то дальше его не двигаем if player.rect.right > SCREEN_WIDTH: player.rect.right = SCREEN_WIDTH # Если игрок приблизится к левой стороне, то дальше его не двигаем if player.rect.left < 0: player.rect.left = 0 # Рисуем объекты на окне current_level.draw(screen) active_sprite_list.draw(screen) # Устанавливаем количество фреймов clock.tick(30) # Обновляем экран после рисования объектов pygame.display.flip() # Корректное закртытие программы pygame.quit()
Также для игры вам потребуются картинки игрока и платформы. Вы можете их скачать ниже.



(фото на задний фон)
Создаем 2D игру на Python с библиотекой Arcade
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 уже установлен, скорее всего можно просто открыть терминал и написать:
pip install arcade
Для более детализированной инструкции по установке, почитайте документацию по установке Arcade.
Простой рисунок
Вы можете открыть окно и нарисовать простой рисунок всего несколькими строчками кода. В качестве примера, нарисуем смайлик, как на картинке ниже:
Скрипт ниже показывает, как это сделать, используя команды рисования Arcade. Заметьте, что вам не обязательно знать, как использовать классы или определять функции. Программирование с быстрым визуальным фидбеком — хороший старт для тех, кто только учится.
Более опытные программисты знают, что современные программы сначала загружают графическую информацию на видеокарту, а затем просят ее отрисовать batch-файлом. Arcade это поддерживает. Индивидуальная отрисовка 10000 прямоугольников занимает 0.8 секунды. Отрисовка того же количества батником займет менее 0.001 секунды.
Класс Window
Большие программы обычно базируются на классе Window или используют декораторы. Это позволяет программисту писать код, контролирующий отрисовку, обновление и обработку входных данных пользователя. Ниже приведен шаблон для программы с Window-основой.
Для простых игр с видом сверху программе на Arcade необходим список стен (или чего-то подобного), через которые игрок не сможет проходить. Обычно я называю это wall_list. Затем создается физический движок в установочном коде класса Window:
Переход к платформеру с видом сбоку достаточно прост. Программисту необходимо переключить физический движок на PhysicsEnginePlatformer и добавить гравитационную константу.
Для добавления тайлов и блоков, из которых будет состоять уровень, можно использовать программу вроде Tiled.
Учитесь на примере
Учиться на примере — один из лучших методов. В библиотеке Arcade есть большой список образцов программ, на которые можно ориентироваться при создании игры.
Запускать демки при установленной Arcade совсем не сложно. В начале программы каждого примера есть комментарий с командой, которую нужно ввести в командную строку для запуска этого примера. Например:
python -m arcade.examples.sprite_moving_platforms
