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

Игры можно писать не только на плюсах и C#. Конечно, это будут не крупные проекты с мощным движком и огромным количеством героев и NPC. Рассказываем, как создаются игры на Python и какие есть геймдев-библиотеки.

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

Когда речь заходит о разработке игр, многие сразу вспоминают языки программирования, такие как 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 для написания дополнительных инструментов или выполнения специфических задач. Вот здесь можно посмотреть игры, написанные на Годоте.

На 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 в целом поможет создать небольшой симпатичный проект или прототипы.

Здесь можно посмотреть 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 и другие библиотеки в геймдеве 1

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 и другие библиотеки в геймдеве 2
Разработка игр на Python остаётся популярной не только благодаря его простоте, но и потому, что он позволяет отделить игровую логику от сложных аспектов производительности, таких как графика и физика. А еще это отличный способ для новичков зайти в геймдев — C++ будет выучить гораздо сложнее, а код на Питоне дает базовые представления об игровой логике и, например, взаимодействии с персонажами.
А вы делали игры на Python?
Зачем, если есть плюсы?
Да, в самом начале тренировался на нем
Да, до сих пор делаю небольшие проекты
Следите за новыми постами
Следите за новыми постами по любимым темам
466 открытий4К показов