Artean

Создание игры на Python с нуля для Android и iOS

Зачем писать мобильные игры на Python и где это реально работает

Создание игры на Python традиционно считается не самым очевидным выбором для разработки мобильных игр. Однако у него есть важные преимущества — скорость прототипирования, понятный синтаксис и огромное количество библиотек. Это делает его уместным в ряде случаев, особенно для начинающих разработчиков или инди-команд, создающих 2D-проекты с несложной логикой. Кроме того, Python отлично подходит для разработки игровых сценариев и вспомогательных инструментов, если игровой движок поддерживает интеграцию с внешними скриптами.

Создаём игру на Python с нуля под Android и iOS

Мобильная игра на Python может быть также реализована с помощью обёрток, таких как Kivy или Ren’Py. Используя Kivy с дальнейшей сборкой Buildozer внутри Linux-контейнера, можно собрать полноценное Android-приложение. Для iOS тоже существует возможность компиляции — с помощью Briefcase и Xcode.

Реальные примеры здесь важны. Ряд визуальных новелл, попавших в Google Play, создан с помощью Ren’Py. Например, «The Nonary Games» начали как проекты на Python c элементами визуального повествования. Kivy, в свою очередь, применяется для создания утилит и мини-игр, вроде карточных аркад или пошаговых квестов, рассчитанных на Android.

Но есть и ограничения. Без подключения C-модулей или нативного кода вы не сможете использовать возможности графических движков уровня Unreal или Unity: аппаратное ускорение, физика, освещение, реальные 3D-движения — всё это потребует слишком высокой производительности, которой Python «из коробки» дать не может.

Кроме того, «чисто на Python» вы не добьётесь встроенной поддержки Bluetooth, камер высокого разрешения или системных API Android и iOS, если не подключать дополнительные инструменты вроде PyJNIus для Java-интеграции. Поэтому Python в мобильной разработке отлично чувствует себя на стыке — где важен быстрый вывод, понятный код, небольшой размер игры и минимум зависимостей.

Это формат:

  • Мини-игры с простой графикой
  • Визуальные новеллы или текстовые квесты
  • Прототипы и демо-концепты
  • Обучающие и интерактивные приложения

Если цель — сделать первую игру для Android или iOS, проверить идею, научиться основам цикла разработки — Python даёт быстрый вход без сложной установки SDK и написания XML. Но если задача — высоконагруженная 3D-игра с толпами NPC, звуковым движком и синхронизацией сетевой игры — даже промежуточные решения на Python быстро упрётся в потолок производительности.

Что понадобится: инструменты, библиотеки и окружение

Ядро: Kivy, Ren’Py, BeeWare — какой инструмент для какой игры

Kivy — это основная библиотека для создания мультимедийных мобильных приложений на Python. На практике для игр она подходит, когда нужен кастомный UI, 2D-графика со слоями, поддержка касаний, свайпов, адаптация под разные размеры экранов. Kivy даёт доступ к Canvas, где можно делать draw-примитивы, анимации и отрисовку поверх экрана. Идеально подходит для:

  • Аркадных 2D-игр
  • Казуальных приложений
  • Интерактивных словарей и курсов

Ren’Py строится вокруг логики сцены-диалог-решение и предназначен для визуальных новелл. Здесь сила не в отрисовке или API, а в управлении сценами, переходами, событием, музыкой и скриптами. Отличный выбор, если вы:

  • Создаете игру с сильным повествованием
  • Нуждаетесь в мощном диалоговом движке
  • Хотите побыстрее собрать MVP с минимальным кодингом

Ren’Py сложен для аркад: он не рассчитан на постоянную перерисовку экрана, управление объектами по координатам и отлов движения пальцев на экране. В отличие от него BeeWare — это набор инструментов, ориентированных больше на создание приложений (не обязательно игр), и включает Briefcase для упаковки Python-приложений в нативные пакеты под Android и iOS.

Buildozer и PyJNIus: сборка под Android

Buildozer — это тул, который умеет собирать приложение на Python в .apk под Android. Работает поверх Python-for-Android и использует заранее подготовленные зависимости. Настройка проводится в файле buildozer.spec, где вы описываете, какие модули и библиотеки должен включить билд.

В типичном проекте будет строка импорта вида:

import kivy
from kivy.app import App

PyJNIus используется внутри Buildozer для вызова Java-методов, если вам нужно достучаться до самих Android API — например, для запроса разрешений на камеру, работы с контактами, отправки push-уведомлений. Это уже уровень более сложной интеграции, но зачастую необходимой для продвинутых проектов.

Briefcase и поддержка iOS

Сборка под iOS с Python сложнее. Briefcase от BeeWare позволяет упаковать Python-код в Xcode-проект, а дальше — уже стандартный путь через Mac и Xcode CLI. Проблема в том, что без Mac невозможно подключить настоящие инструменты компиляции iOS SDK. Хотя некоторые разработчики используют отдалённые виртуалки с macOS (по подписке), такой путь нетривиален.

Briefcase хорошо годится для проектов, написанных с использованием Toga (кросс-платформенный UI-фреймворк от BeeWare), но при добавлении Kivy — возникает несовместимость. Поэтому если ваша игра рассчитана на iOS, вполне возможно, придётся пойти по обходным путям — например, перекомпилировать Python через Cython и внедрить куски нативного Swift-кода.

IDE и окружение: как удобно всё собрать

Рекомендуется работать в среде Linux (Ubuntu, Debian) или через Docker. Buildozer не работает стабильно на Windows, а даже на macOS возникает много конфликтов с зависимостями. Лучший вариант:

  1. Создать виртуальную машину Ubuntu с доступом к build-essential
  2. Установить Python 3.10+, pip, git, Cython
  3. Установить Buildozer через pip
  4. Создать и протестировать проект локально
  5. Запускать сборку через buildozer android debug

Альтернативно, если хотите гарантированную изоляцию окружения, поставьте Docker и используйте официальный Docker-образ Buildozer — он избавляет от множества ошибок при установке зависимостей.

Планируем игру: жанр, механика, управление, формат

Начинать с кода — соблазн, но именно от плана зависит успех. Вы должны чётко понимать: кто игрок, когда он играет (пешком, в метро, в кровати или на уроке), как он играет (пальцем, касанием, по кнопкам), и чего вы добиваетесь: вовлеченности, эмоции, реакции, знаний?

Формат имеет значение

Альбомная или портретная ориентация — это не мелочь. Портретное положение удобно для одиночных казуалок и головоломок; альбомное — для аркад, управления двумя руками и сложных меню. Также сразу решите:

  • Сколько кнопок управления, где расположены
  • Будет ли свайп, мультитач
  • Нужен ли split-режим экрана

Kivy автоматически адаптирует элементы UI под изменение размера окна и dpi, но вы должны заложить эти механизмы в дизайн сцен.

2D против псевдо-3D

Создать полноценную 3D-игру на Python для смартфона — задача неблагодарная. Но псевдо-3D (рендеринг с параллаксом, обман перспективы, масштабирование слоёв) реально реализовать по средствам Kivy. Можно добиться анимации движения объектов по псевдо-Z-оси, иллюзии объёмности, изменяя их scale или позицию на слое Canvas. Кроме того, библиотека kivymd добавляет готовые UI-компоненты.

Правильные вопросы в начале

  • Ваша игра рассчитана на быстрые сессии (1–2 минуты) или длительный геймплей?
  • Есть ли сюжет и как он развивается: линейно, через выбор, случайные события?
  • Нужны ли звуки? Откуда вы их возьмёте?
  • Допустим ли оффлайн-режим или планируется сетевой функционал?

Всё это влияет не только на архитектуру, но и на выбор библиотек. Например, в Ren’Py вы легко подключите картинку и музыку, но привязать движение объекта по координатам с обработкой касаний — уже сложность. Kivy требует больше кода, но даёт гибкость.

Управление, сценография, события

В Kivy вы можете управлять переключением экранов с помощью ScreenManager. Важно предусмотреть чёткую иерархию: главное меню → настройки → игровая сцена → экран проигрыша → рестарт. События (например, касания, свайпы) обрабатываются через on_touch_down и on_touch_move.

Простейший цикл игры формата MVP можно собрать следующим образом:

from kivy.app import App
from kivy.uix.widget import Widget

class GameWidget(Widget):
    def on_touch_down(self, touch):
        print("Касание в:", touch.pos)

class MainApp(App):
    def build(self):
        return GameWidget()

С этого начинается прототип: одно игровое окно, один объект, одно событие, одна реакция. Дальше — итерации с добавлением таймеров, отрисовкой объектов, уровней.

Пишем прототип: как не увязнуть на старте

Первый рабочий прототип должен решать одну простую задачу: отображать начальный экран, реагировать на действия игрока и позволять завершить раунд игры. Не пытайтесь на старте реализовать всё — инвентарь, музыку, переходы между уровнями. Достаточно, если работает базовый цикл:

  • Запуск → вывод игрового окна
  • Реакция на касания или нажатия
  • Финал (победа/поражение) или кнопка «рестарт»

Такой минимальный игровой скелет называется MVP — минимально жизнеспособный продукт. Он позволяет показать механику, протестировать восприятие и получить первый фидбэк. Даже если ваша конечная цель — большая игра, всё начинается с MVP. Kivy даёт возможность собрать его в десятке строк.

Что лучше сделать вручную, а что взять из библиотеки

Ручной подход полезен, если вы:

  • Хотите понять механику обработки касаний
  • Создаёте уникальную игровую логику
  • Планируете в дальнейшем оптимизировать производительность

Например, генерацию игрового поля, движение персонажа по касанию, смену сцены — разумно писать самому. А вот готовые UI-элементы, такие как кнопки, ползунки, текстовые сообщения, можно брать из KivyMD или других библиотек.

Например, отрисовка прямоугольника по нажатию:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle, Color

class MyGame(Widget):
    def on_touch_down(self, touch):
        with self.canvas:
            Color(1, 0, 0, 1)  # Красный
            Rectangle(pos=touch.pos, size=(50, 50))

class GameApp(App):
    def build(self):
        return MyGame()

if __name__ == '__main__':
    GameApp().run()

Этот код делает не что иное, как добавляет новый прямоугольник в точке касания. Пока нет логики врагов или победы — но уже есть импорт, функция запуска, draw, fill — и это точка входа.

Структура проекта в Kivy

В продакшене важно держать структуру проекта чистой. Обычная схема:

/mygame/
├── main.py
├── game.kv
├── assets/
│   ├── images/
│   └── sounds/
├── screens/
│   ├── menu.py
│   └── game_scene.py
├── data/
└── buildozer.spec

Проект делится на логические блоки (сцены), для каждого экранного состояния — отдельный модуль. Файлы .kv позволяют описывать интерфейс без нагромождения Python-кода. Buildozer.spec — файл сборки, описывающий зависимости, название пакета, требуемые библиотеки и разрешения Android.

Важно:

  • Разграничивать UI-код и игровую логику
  • Выдерживать интерфейс функций: изменение позиции, запуск перезапуска, завершение сцены
  • Сразу закладывать возможность масштабирования — позже вы это оцените

Особенности сборки под Android и iOS: подводные камни

Android: Buildozer и его «капризы»

Buildozer стал стандартом для сборки Python-проектов под Android. Но у него есть особенности, и одна из них — крайне высокая чувствительность к зависимостям. Ошибки могут появиться уже при попытке собрать даже «пустой» проект. Вот что нужно знать:

  • Buildozer требует Linux-среду. Установка на Windows через WSL может работать, но нестабильно.
  • Рекомендуется использовать Python версии 3.10 или 3.9. Более свежие версии могут не поддерживаться.
  • Обязательно установите Java JDK 8. С более новой версией Buildozer может не увидеть Android SDK.
  • Перед первой сборкой вызовите buildozer init, затем отредактируйте buildozer.spec.

Частые ошибки и их решения:

  • ImportError во время сборки: Проверьте наличие библиотек Cython, Pillow и pyjnius — они должны быть явно указаны в buildozer.spec.
  • «Python-for-Android не нашёл target»: Укажите точную версию Android API (например, android.api=31) и убедитесь, что SDK загружен.
  • Сборка замирает на этапе компиляции: Убедитесь, что у вас достаточно оперативной памяти (⩾4 ГБ для Docker-контейнера), или ограничьте количество потоков компиляции.

На этапе теста можно использовать:

buildozer android debug deploy run logcat

Это одновременно собирает, заливает игру на подключённое Android-устройство и выводит лог. Очень удобно для отладки событий, таймингов, ошибок import’а.

Сборка под iOS: другая история

Поддержка iOS намного более капризна. Вам обязательно понадобится:

  • Mac или облачный macOS-сервер
  • Xcode — полный, с CLI Tools
  • C Python, собранный под arm64 (iOS)

Briefcase упаковывает ваш Python-проект как нативный app-bundle для iOS. Но путь к результату неблизкий:

  1. Установить Xcode и связать его с CLI через xcode-select
  2. Создать проект Briefcase: briefcase new
  3. Перенести ваш game-код в шаблон Briefcase
  4. Собрать проект: briefcase build iOS
  5. Запустить на устройстве или симуляторе: briefcase run iOS

Возникают системные ограничения — iOS ограничивает использование интерпретаторов в рантайме, поэтому вам потребуется прокомпилированный Python как часть .app. Кроме того, попасть в App Store с такими приложениями не так просто: Apple проверяет, что ваше приложение не исполняет внешний код, а Py-библиотеки могут быть восприняты как таковые.

Эти особенности обуславливают, почему Python под iOS — это чаще инструмент для демонстрации или экспериментальных проектов, а не для массового релиза. Многие разработчики создают игру на Python, проверяют её working-поведение на Android, и только затем портируют core на другие технологии для выхода в App Store.

Разница в API и разрешениях

Помимо сборки, между Android и iOS есть отличия в API, особенно в доступе к системе:

  • Android требует в buildozer.spec явно прописать разрешения: Internet, Camera, Vibration
  • iOS требует plist-конфигурации с обоснованием каждого системного доступа
  • Размер экрана, плотность пикселей, safe area (у iOS) — всё это влияет на отрисовку

У многих начинающих разработчиков игра не запускается просто из-за недостающего разрешения. Старайтесь вести список всех используемых системных функций и проверяйте, как они разрешаются в API обоих платформ.

Графика и звук: откуда брать, как встраивать, как оптимизировать

Даже самая продуманная игровая механика разваливается без визуального и звукового сопровождения. Особенно в мобильной разработке: здесь нет времени «разобраться», всё должно быть интуитивно и ясно с первого же экрана. Если картинка не цепляет, а звук раздражает — пользователь просто закроет игру. Поэтому графика и звук — не вторичная задача, а часть геймплейного опыта.

Где искать бесплатные ассеты

Для начинающих и инди-разработчиков есть десятки ресурсов, предлагающих спрайты, интерфейсы, фоны и эффекты под свободной лицензией:

  • Kenney.nl — мощная база спрайтов с лицензией на любое коммерческое использование
  • OpenGameArt — ассеты под Creative Commons, есть и музыка, и UI
  • Freesound — для озвучек, звуковых эффектов, шагов, кликов, взрывов

Важно: перед использованием убедитесь, что лицензия позволяет включать ассет в мобильное приложение. Лучше выбирать лицензии CC0 (public domain) или CC-BY с требованием указания автора.

Форматы и подключение в код

Kivy поддерживает следующие форматы изображений:

  • PNG — предпочтительный, прозрачность, без потери качества
  • JPG — подходит для фонов, но не для UI или героев
  • WEBP — для оптимизации весов, но с поддержкой не всегда всё гладко

Пример подключения изображения в Kivy:

from kivy.uix.image import Image

hero = Image(source='assets/images/hero.png', size_hint=(None, None), size=(64, 64))
self.add_widget(hero)

Для звука используется модуль SoundLoader:

from kivy.core.audio import SoundLoader

sound = SoundLoader.load('assets/sounds/hit.wav')
if sound:
    sound.play()

Оптимизация: как не «перекормить» игрока мегабайтами

Реалия мобильной платформы — ограниченная скорость интернета и ёмкость памяти. Даже Android-игры сегодня должны стараться укладываться в 100–200 МБ итогового объёма. Вот почему нужна оптимизация:

  • Спрайт-атласы: вместо десятков PNG — один atlas.png и atlas.json с координатами спрайтов
  • Ресайз под разрешение экрана: не грузите 4K-фоны, если игра работает в 720p
  • Конвертация звука: MP3 или OGG для фонов, WAV — только для коротких кликов

Если вы используете Buildozer, то лучший момент для оптимизации — до сборки. Проведите анализ веса ассетов, удалите дубли, уменьшите разрешения. Запуск через buildozer android deploy run logcat покажет время загрузки аудио-файлов — бывает, музыка грузится 2–3 секунды, замораживая окно. Обрежьте silent-паузы, конвертните в OGG — и проблема уйдёт.

Проблемы с Android API и звуком

Иногда вы получаете, казалось бы, «невидимую» ошибку: игра запускается, но звуков нет. Это может быть:

  • Нет разрешения на чтение хранилища
  • Файл звука не попал в .apk (Buildozer не включил каталог)
  • Формат не поддерживается текущим Android SDK

Решение:

  1. Проверьте путь и формат звука
  2. Убедитесь, что каталог с ассетами добавлен в buildozer.spec: source.include_exts = py,png,jpg,ogg,wav
  3. Используйте логкат после запуска — любые ошибки ивентов audio или loading будут отображены

Fast tip: если музыка играет «рывками» — скорее всего, ошибка в частоте дискретизации. Переконвертируйте в 44100 Hz.

Релиз и публикация: как выложить игру и что учитывать

Когда прототип готов, геймплей протестирован, графика на месте — пора готовить релиз. И тут начинается реальность маркетов: форматы, подписи, сертификаты, иконки, требования по безопасности. Публикация мобильной игры на Python требует не только кода, но и административной подготовки.

Подготовка билдов к Google Play

Для размещения игры в Google Play, нужен файл .aab (Android App Bundle) или .apk с подписью. Buildozer стандартно генерирует debug-билды, но для релиза нужно:

  • Создать ключ: keytool -genkey -v -keystore myreleasekey.jks -keyalg RSA -keysize 2048 -validity 10000 -alias myalias
  • Указать подпись в buildozer.spec:
android.release = 1
android.archs = armeabi-v7a, arm64-v8a
android.keystore = myreleasekey.jks
android.keyalias = myalias
  • Команда сборки: buildozer android release

После этого можно выгрузить файл в консоль Google Play. Придётся также настроить иконки (512×512), скриншоты (разных разрешений), описания на нескольких языках и пройти модерацию.

Особенности Google Play:

  • Проверяет доступ к чувствительным функциям: интернет, микрофон, местоположение
  • Требует заполнения декларации безопасности данных
  • Анализирует вес APK: предупреждает, если превышает 150 МБ
  • Жёсткая политика против кликбейта, насилия, эротики

Путь в App Store

Если вы всё-таки собираетесь на iOS — готовьтесь к более строгим требованиям:

  • Нужен аккаунт разработчика Apple ($99/год)
  • Поддержка всех моделей iPhone (включая старые и iPad)
  • Соблюдение требований Human Interface Guidelines от Apple

Необходимо собрать .ipa пакет, подписать его через Xcode и загрузить в App Store Connect. Уровень допуска к API здесь крайне жёсткий. Приложение на Python может быть отклонено, если содержит интерпретатор, изменяющийся код (sandbox restrictions).

Вместе с игрой нужно загрузить:

  • 5 скриншотов под разные устройства
  • Иконку (1024×1024)
  • Краткое и полное описание
  • Возрастную маркировку и ответы на опросы модерации

Apple, в отличие от Google, проводит ручную проверку и требует иногда 2–3 итераций. Советуем перед релизом посмотреть примеры хороших пайплайнов публикации (или взять шаблон игры, прошедший модерацию).

Полезные ресурсы для релиза

  • Android Studio — для анализа финального .apk
  • Google Play Console — управление релизами
  • App Store Connect — для iOS
  • AppFigures — аналитика установок и отзывов

Вывести игру для смартфона на Python в релиз — абсолютно реально. Но придётся не только программировать, но и выполнить десятки «хозяйственных» задач: сжать картинки, правильно назвать пакеты, сделать читаемые описания. Всё это влияет на ваш успех так же сильно, как и игровой сценарий.