Игры можно писать не только на плюсах и C#. Конечно, это будут не крупные проекты с мощным движком и огромным количеством героев и NPC. Рассказываем, как создаются игры на Python и какие есть геймдев-библиотеки.
111 открытий58 показов
Когда речь заходит о разработке игр, многие сразу вспоминают языки программирования, такие как C++ или C#, которые считаются стандартом в крупных студиях. Однако Python, несмотря на свою репутацию как инструмента для скриптинга и быстрого прототипирования, продолжает оставаться актуальным и используется в разработке игр. Конечно, если речь идет о движке в условном Ведьмаке, никто не будет писать его на питоне — язык для этого слишком медленный. Но даже если он не подходит для AAA-проектов с высокой производительностью, питон активно используется на инди-сцене и любительских проектах.
Разбираемся, почему игры на Python живут и развиваются, а также рассмотрим движки и библиотеки, которые помогают разработчикам создавать проекты на этом языке.
Как и почему Python используется в геймдеве
Движок — очень важная часть игры, но есть и периферийные сервисы, поддерживающие работу игры. В общем, геймдев — не только про Unreal Engine, Unity и Source, поэтому питон не стоит сбрасывать со счетов. Вот что он может в разработке игр:
- Быстрое прототипирование. Python идеально подходит для того, чтобы создавать тестовые версии игры. Это позволяет разработчикам быстро проверять идеи и тестировать механику без необходимости погружаться в более сложные и производительные языки вроде C++ или C#.
- Создание игровой логики. В больших проектах Python может использоваться для написания игровых скриптов или логики поведения персонажей. Например, известный игровой движок Unreal Engine использует Python для управления различными инструментами редактора и задач автоматизации.
- Написание внутриигровых скриптов. Питон не может работать с графикой, поэтому внутриигровые скрипты — те, где нет рендеринга. Например, взаимодействие NPC, обработка событий и статистика противников. Эти скрипты могут вызывать методы движка и наоборот — движок вызывает функции в скриптах для обработки событий. Это позволяет разработчикам изменять игровую логику без перекомпиляции всего кода, что значительно ускоряет процесс разработки.
- Широкая экосистема библиотек. Python предлагает множество библиотек и фреймворков для разработки игр. Это позволяет создавать как 2D-игры с Pygame, так и более сложные проекты с помощью движков, таких как Godot, поддерживающих Python или его аналоги.
Удивительно, но факт: Python используется во многих знакомых нам играх — Battlefield 2, The Sims 4 и World of Tanks. Например, в WoT сервер работает на движке BigWorld, который написан на C++ и Python. Все, что важно для скорости и производительности, написано на C++, а остальное сделано на Python.
Что такое Godot и как Python интегрируется в современный игровой движок
Godot Engine — популярный движок для создания как 2D-, так и 3D-игр, который предлагает простой в освоении язык GDScript. Этот язык синтаксически напоминает Python, что делает его удобным для разработчиков, знакомых с Python. Хотя Godot больше ориентирован на GDScript, он поддерживает Python для написания дополнительных инструментов или выполнения специфических задач. Вот здесь можно посмотреть игры, написанные на Годоте.
Язык программирования Mojo — стал ли он лучше Pythontproger.ru
На GitHub лежит плагин, который позволяет использовать Python, подобный GDScript. В таком случае разработчик одновременно получает доступ к функциям движка Godot и пишет на знакомом и любимом питоне.
Вот пример скрипта на py4godot:
# file: node3d.py from py4godot.methods import private from py4godot.signals import signal, SignalArg from py4godot.classes import gdclass from py4godot.classes.core import Vector3 from py4godot.constants.constants import VECTOR3_UP from py4godot.classes.Node3D.Node3D import Node3D @gdclass class node3d(Node3D): # define properties like this test_int: int = 5 test_float: float = 5.2 test_bool: bool = True test_vector: Vector3 = Vector3.new3(1,2,3) # define signals like this test_signal = signal([SignalArg("test_arg", int)]) def _ready(self) -> None: pass # put initialization code here def _process(self, delta:float) -> None: pass # put dynamic code here # Hide the method in the godot editor @private def test_method(self): pass
Другой способ — установить godot-python. Сейчас разработчики готовят огромное обновление под Godot 4. Подробнее про установку, интеграцию и активацию плагина можно почитать в документации.
Вот пример простого скрипта, который отвечает за передвижение персонажей:
# Импортируем необходимые классы from godot import exposed, export from godot import * @exposed class Player(Sprite): # Экспортируемое свойство скорости speed = export(int, default=200) def _ready(self): # Эта функция вызывается при запуске игры print("Player is ready!") def _process(self, delta): # Вектор скорости (по умолчанию он равен нулю) velocity = Vector2() # Проверяем нажатие клавиш и изменяем вектор скорости if Input.is_action_pressed("ui_right"): velocity.x += 1 if Input.is_action_pressed("ui_left"): velocity.x -= 1 if Input.is_action_pressed("ui_down"): velocity.y += 1 if Input.is_action_pressed("ui_up"): velocity.y -= 1 # Если есть движение, нормализуем вектор и изменяем позицию персонажа if velocity.length() > 0: velocity = velocity.normalized() * self.speed * delta self.position += velocity
Что делает код:
Player(Sprite)
— класс персонажа, который расширяет Sprite._ready()
— вызывается при запуске сцены и выводит сообщение в консоль._process(delta)
— функция, которая вызывается каждый кадр (игровой цикл), где персонаж движется в зависимости от нажатых клавиш.- Вектор
velocity
— используется для управления направлением движения персонажа. - Настройка ввода (Input Map): В разделе Project -> Project Settings -> Input Map добавьте действия
ui_right
,ui_left
,ui_up
,ui_down
и назначьте им клавиши (например, стрелки или WASD).
Благодаря модульной архитектуре, Godot можно легко адаптировать к проектам любой сложности. Например, в инди-играх он часто используется для прототипирования и разработки конечных продуктов, включая мобильные платформы.
Что по библиотекам
Но помимо движка есть еще и библиотеки для геймдева — о некоторых из них ниже.
Pygame: классика для 2D-игр
Одной из самых популярных библиотек для разработки игр на Python остаётся Pygame. С помощью Pygame разработчики могут легко создавать 2D-игры. Эта библиотека предоставляет доступ к основным функциям, таким как графика, звуки, ввод от пользователя и обработка событий.
На Pygame пишут самую классику — змейку, сапера, пинг-понг. Здесь можно посмотреть код Flappy Bird, вот небольшой кусочек из него:
class Bird: def __init__(self): self.x = 50 # bird x-pos self.y = width/2 # bird y-pos self.gravity = 1 # Gravity Constant self.lift = 25 # Lifting Force self.velocity = 0 # Initial Velocity def show(self): angle = degrees(atan(-self.velocity/15)+pi/18) # get the horizontal angle (Based on velocity) pic = pygame.transform.rotate(img, angle) # rotate the image to the angle # 因為是以圖片左上角座標黏貼 故把鳥的位置定在圖片的中心點去做調整 # Adjust the coordinate to top-left of the image and blit playSurface.blit(pic, (int(self.x-img_width/2), int(self.y-img_hieght/2))) def update(self): self.velocity += self.gravity # Gravity change velocity self.velocity *= 0.9 # damping (same as air resistance) self.y += self.velocity # velocity change y-pos if (self.y > height): # Top boundary self.y = height self.velocity = 0 if (self.y < 0): # Low boundary self.y = 0 self.velocity = 0 def up(self): self.velocity += -self.lift # Lift the bird
Из плюсов pygame — производительность (за счет языков C и ассемблера), модульная структура, а еще можно програть прямо из командной строки.
PyOnenGL: библиотека для 3D
Библиотека дает доступ к мощным возможностям OpenGL для создания 3D-графики. Да, мы уже говорили, что питон — далеко не самый оптимальный выбор для сложных 3D-игр, но PyOpenGL в целом поможет создать небольшой симпатичный проект или прототипы.
PyTorch или TensorFlow — что выбратьtproger.ru
Здесь можно посмотреть 3D-игру про мумий, написанную с помощью PyOpenGL и Pygame (в ней даже есть читы!), а здесь — геймплей. Выглядит код примерно так:
def specialPressedKey(key, x, y): if not rec.playing: mod = glutGetModifiers() if mod == GLUT_ACTIVE_SHIFT: game.player.running = True if mod == GLUT_ACTIVE_CTRL: game.modifiers["CTRL"] = True if mod == GLUT_ACTIVE_ALT: game.modifiers["ALT"] = True if key == GLUT_KEY_F1: if rec.isRecording(): rec.stopRec() else: rec.startRec() # game.modifiers["F1"] = True if key == GLUT_KEY_F2: if not rec.isPlaying(): rec.playFromList() # game.modifiers["F2"] = True
Pyglet: инди-минимализм
Это лёгкая библиотека для создания игр и мультимедийных приложений. Она поддерживает работу с графикой через OpenGL и предоставляет инструменты для отображения текста, работы со звуком и анимациями. Подходит для 2D и небольших 3D-игр, а также для инди-проектов.
Вот кусочек кода с pyglet из Змейки — здесь прописывается, как генерируется еда:
def generate_food(): global food food_flag = True while food_flag: x_coord = randint(0, 49) * 10 food[0] = x_coord y_coord = randint(0, 28) * 10 food[1] = y_coord for n in range(0, len(sn.sprites)): if sn.sprites[n].x == x_coord and sn.sprites[n].y == y_coord: break elif n == len(sn.sprites) - 1: food_flag = False
Выглядит примерно вот так:
Разработка игр на Python остаётся популярной не только благодаря его простоте, но и потому, что он позволяет отделить игровую логику от сложных аспектов производительности, таких как графика и физика. А еще это отличный способ для новичков зайти в геймдев — C++ будет выучить гораздо сложнее, а код на Питоне дает базовые представления об игровой логике и, например, взаимодействии с персонажами.
А вы делали игры на Python?Зачем, если есть плюсы?Да, в самом начале тренировался на немДа, до сих пор делаю небольшие проектыОтветить