Главная Веб-разработка Почему разработка игр на Python не умерла: Godot и другие библиотеки в геймдеве

Почему разработка игр на Python не умерла: Godot и другие библиотеки в геймдеве

от admin

Игры можно писать не только на плюсах и 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  		

Почему разработка игр на Python не умерла: Godot и другие библиотеки в геймдеве

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 не умерла: Godot и другие библиотеки в геймдеве

Разработка игр на Python остаётся популярной не только благодаря его простоте, но и потому, что он позволяет отделить игровую логику от сложных аспектов производительности, таких как графика и физика. А еще это отличный способ для новичков зайти в геймдев — C++ будет выучить гораздо сложнее, а код на Питоне дает базовые представления об игровой логике и, например, взаимодействии с персонажами.

А вы делали игры на Python?Зачем, если есть плюсы?Да, в самом начале тренировался на немДа, до сих пор делаю небольшие проектыОтветить

Похожие статьи