Разработка игр для андроид на языке С++?
Мне 13 лет и я уже интересуюсь разработкой игр на андроид. У меня уже возникли некоторые вопросы:
1. Можно ли делать простые 2д игры на андроид на языке С++?
2. (Если это все же возможно) какое программное обеспечение мне для этого необходимо.
3. И последнее, все же интересно, поддерживает ли Unity язык программирования С++?
Всем заранее спасибо за ответ!
- Вопрос задан более двух лет назад
- 899 просмотров
Комментировать
Решения вопроса 1
Евгений Шатунов @MarkusD Куратор тега C++
все время мелю чепуху 🙂
C++ не является полноценно «родным» языком для Android. Но для этой платформы можно вести разработку на C++.
Такие движки, как cocos2d-x [?], Urho 3D [?], Unreal Engine 4 [?], Godot Engine [?] и, буквально, море менее известных проектов, позволяют вести разработку игр с использованием языка C++.
Для старта своего проекта тебе потребуется среда разработки, рабочая и исходная части выбранного тобой движка и море времени чтобы читать необходимую литературу, без которой у тебя мало что получится. Требования к среде разработки у каждого движка разные, поэтому сперва стоит выбрать движок.
Если использование C++ для тебя является важным, о Unity можно забыть. Это взаимоисключающие инструменты.
И это не важно. Тот же Urho 3D позиционируется как Open Source Unity. Godot Engine обладает не меньшей свободой и гибкостью, но предлагает больше.
Ответ написан более двух лет назад

Необходимую литературу, которая сплошь на английском.
А ТС даже такую базовую информацию нагуглить не смог, так что, полагаю, это последний гвоздь в его планы.
Евгений Шатунов @MarkusD Куратор тега C++
Adamos, или это — финальный толчок к осознанию того, что для разработки игр нужно образование, в которое надо вложить свои время и усилия? 🙂
Все верно. Требуемая литература вся сплошь на английском и одним ее чтением не обойтись. Требуется еще и общение с сообществом, которое, внезапно, тоже англоговорящее. На наш геймдев надежды особой нет.

Евгений Шатунов, умение гуглить и читать может сильно сократить общение с сообществом. И наоборот 😉
Ответы на вопрос 2
Денис Загаевский @zagayevskiy Куратор тега Android
Android developer at Yandex
Делать можно, но это слишком сложно, неоправданно. Юнити не поддерживает С++. С# используй.
Ответ написан более двух лет назад
Комментировать
Нравится Комментировать
android это зоопарк железа (и не только процессоры), к сожалению красивого фреймворка именно для c++ нет, отсюда разработка даже простейшего приложения (особенно если нужен доступ к перифирии и графическому ускорителю) очень сложны, хотя разрабатывать библиотеку, выполняющую критичную к скорости часть — почему нет
зы. лучше всего на android функционал покрыт java фреймоврками, соответственно и разрабатывать лучше/легче на java а точнее под виртуальную машину dalvik virtual machine (это машина исполнения скомпилированного кода java, можно найти компиляторы из других языков но красивая поддержка только у java)
Ответ написан более двух лет назад
Денис Загаевский @zagayevskiy Куратор тега Android
Но. Как же. Котлин.
Евгений Шатунов @MarkusD Куратор тега C++
к сожалению красивого фреймворка именно для c++ нет, отсюда разработка даже простейшего приложения (особенно если нужен доступ к перифирии и графическому ускорителю) очень сложны
Периферия доступна как стандартное низкоуровневое устройство. Проблем доступа к ней нет. Для работы с сетью есть сокеты Беркли. Для работы со звуком есть OpenSL и упрощающие надстройки. Для работы с пресловутым графическим ускорителем есть Vulkan и OpenGL. Все это напрямую доступно из библиотек C/C++ и никак не касается рантайма виртуальной машины. На JNI писать нет никаких проблем при наличии достаточной прослойки для JNI.
соответственно и разрабатывать лучше/легче на java
Легче — на Kotlin. Привычнее — на Java. Это — разные вещи.
точнее под виртуальную машину dalvik virtual machine
DVM в последний раз был замечен еще в Android 4. Далее DVM был вытеснен ART. Сегодня DVM в Android, в явном виде, больше нет. DEX на современных устройствах больше не выполняется.
это машина исполнения скомпилированного кода java
Это — неправда. DEX представляет собой пакет исполняемого кода для DVM, а не JVM. DVM никогда не исполнял опкоды JVM. Иначе Oracle засудил бы Google к чертям, а не жалко пытался бы подлезть к родству между JVM и DVM через написание кода на Java.
Трансляторы других языков выполняют трансляцию кода во все тот же DEX.
Создание игры на Android

Представляем вам курс по созданию мобильной 2D игры на Андроид. Игра будет создана на движке Unity. В игре мы реализуем множество концепций игрового движка и познакомимся с разработкой игр на нем.
Видеоурок
Ссылки из видео:
- Скачать игру на Android ;
- Скачать игру на IOS .
Unity – это движок, на котором строится большая часть современных игр на разных платформах. Посредством движка реально создавать игры, ориентированные на запуск на компьютерах (Windows, Linux, MacOS), мобильных телефонах, планшетных компьютерах (Android, iOS) и даже игровых приставках PlayStation, Xbox, Nintendo.
Как создавать игры в Unity?
В основе Unity лежит компонентно-ориентированная концепция. По сути, любая игра состоит из массы объектов, разбавленных дополнительными компонентами. Для примера, во время создания платформера мы создаём GameObject, к нему дополнительно прикрепляем графическую составляющую, что отвечает за отображение персонажа, и управляющий компонент, он обеспечивает управление персонажем за счёт мыши, клавиатуры, джойстика или тачскрина. Движок не накладывает ограничения на количество подобных модулей. К GameObject можем добавить столько компонентов, сколько будет необходимо. Вся работа на движке строится на том самом создании GameObject и применение к ним подходящих компонентов.

Новичков может ввести в заблуждение видимая простота процесса, хотя это не так. Для создания уникальной и популярной игры придётся с нуля писать массу компонентов. Если точнее, в среде Юнити это называется скриптом. Родной язык создания скриптов – C#, но ещё частично используется JavaScript и Boo (обрезанный вариант Python). Создать собственные компоненты нелегко, можно даже сказать – это сложная процедура, напрямую завязанная на классическом программировании. Без наличия достаточного уровня знаний в программировании придётся несладко.
Поддерживаемые платформы
Многие крупные проекты предпочитают Unity из-за огромного списка платформ совместимых с движком. Готовое приложение реально запустить на любой компьютерной операционной системе, популярных мобильных платформах и SmartTV. Что уж говорить, даже браузерные игры и приложения для специфических платформ (вроде Tizen OS) преимущественно разрабатываются на Юнити.
Однако, здесь не всё так гладко. При необходимости можно писать специфические алгоритмы, основанные на низкоуровневом коде, под тот же самый Андроид нужно иметь доскональные знания Java.

То же самое справедливо и в отношении iOS. Ещё одна особенность iOS, что под неё разрабатывать возможно только с компьютера или планшета от Apple. При отсутствии Macbook или аналогичного устройства выпуск игры быстро застопорится и Unity здесь вовсе не причём, Apple сама накладывает подобное ограничение. Вывод прост: если в планах есть iOS-разработка, заранее следует подобрать подходящее устройство для сборки.
Как и где разработать игру на движке?
Длительный процесс разработки игр можем проводить как в рамках Windows, так и Mac OS X. Уже существуют версии редактора под Linux, но рассчитывать на стабильную их работу пока что не приходится. Большую часть времени по созданию игры разработчик проводит внутри редактора Unity. Ещё приходится много времени писать код скриптов, его создавать можем либо в стандартном MonoDevelop, либо в любом редакторе стороннего разработчика. Сейчас активно пользуются Visual Studio, а также Sublime Text, но только при должной настройке.
Как создать игру на андроид с использованием C++ и OpenGl ES?
У меня есть опыт в создании игр на различных движках. Сейчас захотелось углубиться в познания разработки игр без движков. Но утанул в различных высказываниях и методах разработки. Нужно именно C++ и OpenGl ES (ну под Андроид) , так как хочю получить опыт в этих направлениях. Какие ide использовать как что подключить и тп. , может статьи книги.
- Вопрос задан более трёх лет назад
- 5716 просмотров
1 комментарий
Средний 1 комментарий
alterEgoChaos @alterEgoChaos
Заколебаешься без движков делать) На одной анимации перематеришься)
Решения вопроса 1

Скачиваем Qt Creator, Android NDK. Устанавливаем. Создаем проект из темплейта.
Подключаем в хидерах и pro файле opengl. И вперед. Я использую для игр QOpenGLFramebufferObject. Ну конечно нужно немного в шейдеры, немного в вертексы и нормали. Немного в матричные преобразования, немного в освещение и текстуры. Что там еще? В общем ничего сложного. Если есть опыт болванка проекта создается буквально на коленке за пару часов. За несколько вечеров можно создать простенькую демку или игрушку.
Ответ написан более трёх лет назад
Надо уточнить, поскольку пользуется NDK, придется собирать проект под разные платфомы, если планируется распространять поделку
Ответы на вопрос 1
Можете посмотреть мои статьи про использование C++ и OpenGL ES на Android. Весь код открыт. Там не совсем игры, просто примеры, но суть такая же как в играх. Большинство компаний, по разработки игры под мобильные платформы использует или Unity3D или Cocos2D или разрабатывают свои кроссплатформенные движки на C++ (возможно на базе существующих, плюс нативные прослойки, в случае с Andoid — это NDK), среди таких компаний, например: Game Insight, Social Quantum, Playrix. Или Qt, но для игр в продакшен он скорее всего не применим, слишком тяжелый. Но, например, компания 2GIS использует его для своего мобильного приложения
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Linux
- +1 ещё
Как сделать многопоток сокетов?
- 1 подписчик
- 8 часов назад
- 66 просмотров
Как быстро написать игру для Android на Unity
В своё время Flappy Bird, не имея сложной механики и графики, стала хитом. Сегодня мы расскажем, как всего за 10 минут написать свой вариант игры на Unity под Android.
В нынешнее время каждый может стать успешным разработчиком мобильных игр или приложений, не прилагая к этому титанических усилий. Примером такого случая является Донг Нгуен, разработавший Flappy Bird. В игре не было никакой сложной механики или графики, но это не помешало ей стать популярной и приносить своему создателю по пятьдесят тысяч долларов в день. Однако в игре не было ничего примечательного. Всё, что потребовалось для успеха, — оказаться в нужном месте в нужное время и немного удачи. Подобное может произойти и сегодня, вам просто нужна правильная идея.
Чтобы продемонстрировать, насколько легко написать что-то подобное, сегодня мы напишем свой Flappy Bird с помощью Unity всего за 10 минут.
Игровой персонаж
Сначала создайте новый проект и убедитесь, что выбрана опция 2D.
Загрузите свой спрайт птицы в сцену. Не забудьте включить фантазию!
Затем отрегулируйте размер спрайта как вам нравится, перетягивая его за угол в нужном направлении. Спрайт должен быть виден в окне иерархии ( hierarchy ) слева. В нём видны все объекты в сцене, и на данный момент их должно быть всего два: камера и птица.
Перетащите камеру на птицу и отпустите. Камера должна оказаться под птицей, это будет значить, что камера теперь «ребёнок» птицы. Теперь позиция камеры будет фиксироваться относительно птицы. Если птица двигается вперёд, то камера делает то же самое.
Снова выберите птицу в сцене или в окне иерархии. Вы увидите список опций и атрибутов справа в окне под названием Inspector . Здесь вы можете управлять различными переменными, привязанными к определённому объекту.
Теперь нажмите на Add Component . Выберите Physics2D > Rigidbody2D — это готовый набор инструкций для применения гравитации к нашему персонажу. Нажмите на Constraints в этой панели и затем выберите freeze rotation Z . Это позволит предотвратить вращение птицы вместе с камерой по кругу.
Таким же образом добавьте Polygon Collider , который говорит Unity, где находятся границы персонажа. Нажмите Play и увидите, как спрайт вместе с камерой бесконечно падает вниз.
Пока всё идёт хорошо!
Теперь пора заняться полётами персонажа, благо это будет несложно.
Сначала нужно создать C#-скрипт. Создайте для него папку (кликните правой кнопкой мыши где-нибудь в assets и создайте папку «Scripts»), сделайте клик правой кнопкой мыши и выберите Create > C# Script .
Назовём его «Character». Кликните по нему дважды, чтобы открыть его в вашей IDE, будь то MonoDevelop или Visual Studio. Затем добавьте следующий код:
public class Character : MonoBehaviour < public Rigidbody2D rb; public float moveSpeed; public float flapHeight; // Это нужно для инициализации void Start () < rb = GetComponent(); >// Update вызывается один раз на кадр void Update () < rb.velocity = new Vector2(moveSpeed, rb.velocity.y); if (Input.GetMouseButtonDown(0)) < rb.velocity = new Vector2(rb.velocity.x, flapHeight); >if (transform.position.y > 18 || transform.position.y < -19) < Death(); >> public void Death() < rb.velocity = Vector3.zero; transform.position = new Vector2(0, 0); >>
Этот код делает две вещи. Он заставляет персонажа двигаться вперёд со скоростью, которую мы определим в инспекторе, и создаёт ощущение полёта птицы. Метод Update() вызывается повторно на протяжении игры, поэтому всё, что вы сюда поместите, будет выполняться непрерывно. В данном случае мы добавляем немного скорости нашему объекту. Переменная rb является скриптом RigidBody2D , который мы применили к нашему объекту ранее, поэтому когда мы пишем rb.velocity , мы обращаемся к скорости объекта.
Тап по экрану интерпретируется Unity как клик мыши, если вы используете мобильное устройство. После нажатия мы заставляем персонажа немного подняться вверх.
Переменная moveSpeed будет отвечать за скорость движения, а переменная flapHeight — за увеличение высоты полёта птицы после каждого нажатия. Поскольку эти переменные объявлены как public , мы сможем изменить их вне скрипта.
Метод Death() тоже объявлен как public , что значит, что другие объекты и скрипты смогут его вызвать. Этот метод просто возвращает положение персонажа в начало. Также он будет использоваться каждый раз, когда персонаж будет залетать слишком высоко или низко. Скоро вы поймёте, почему он объявлен именно как public . Строка rb.velocity = Vector3.zero; нужна, чтобы убрать импульс — мы же не хотим, чтобы после каждой смерти персонаж падал всё быстрее и быстрее?
Теперь можно выходить из IDE и добавлять скрипт как компонент к персонажу. Для этого нужно выбрать нашу птицу и нажать Add Component > Scripts > Character . Теперь мы можем определять moveSpeed и flapHeight в инспекторе (для этого и нужны public -переменные). Присвоим переменным значения 3 и 5 соответственно.
И ещё: в инспекторе нужно добавить тег к персонажу. Для этого кликните там, где написано Tag: Untagged и затем выберите Player в выпадающем списке.
Препятствия
Теперь добавим препятствия: трубы. Кто-то в трубах находит грибы, а кто-то — свою смерть.
Перетащите спрайт трубы в сцену в место, где должно быть первое препятствие, и назовите его pipe_up .
Теперь создадим новый скрипт под названием Pipe :
public class Pipe : MonoBehaviour < private Character character; // Это нужно для инициализации void Start () < character = FindObjectOfType(); >// Update вызывается один раз на кадр void Update () < if (character.transform.position.x - transform.position.x >30) < >> void OnCollisionEnter2D(Collision2D other) < if (other.gameObject.tag == "Player") < character.Death(); >> >
Добавьте этот скрипт к спрайту трубы тем же образом, что и раньше. Таким образом, труба будет возвращаться на экран после выхода за его левую границу. Мы тут ещё ничего не сделали, но ещё вернёмся к этому.
Метод OnCollisionEnter2D() вызывается каждый раз при взаимодействии трубы с персонажем. После этого вызывается созданный ранее метод Death() , возвращающий игрока в начальную точку.
Итак, у нас есть одна труба, которая время от времени будет исчезать и появляться на другом конце экрана. Врежешься в неё — умрёшь.
Перевёрнутые трубы
Сейчас у нас есть только один спрайт трубы. Давайте добавим ещё один. Для этого кликните правой кнопкой мыши в окне иерархии, нажмите New 2D Object > Sprite и затем выберите спрайт, который хотите использовать. Ещё проще будет просто перетащить файл в сцену ещё раз.
Назовите этот спрайт pipe_down . В инспекторе в части Sprite Renderer выберите опцию Flip Y , чтобы перевернуть трубу вверх ногами. Добавьте такое же RigidBody2D .
Теперь напишем новый C#-скрипт под названием PipeD . В нём будет похожий код:
public class PipeD : MonoBehaviour < private Character character; //Это нужно для инициализации void Start() < character = FindObjectOfType(); >// Update вызывается один раз на кадр void Update() < if (character.transform.position.x - transform.position.x >30) < >> void OnCollisionEnter2D(Collision2D other) < if (other.gameObject.tag == "Player") < character.Death(); >> >
Префабы
Итак, нам достаточно этого кода, чтобы сделать всю игру. Мы могли бы передвигать трубы на правую сторону экрана каждый раз, когда они исчезают, или скопировать и вставить столько труб, сколько мы хотели бы встретить на протяжении всей игры.
Если пойти первым путём, то убедиться, что трубы стоят как надо после случайной генерации, и поддерживать честный ход вещей было бы сложно. После смерти персонажа они могли бы появиться в километрах от первой трубы!
Если пойти вторым путём, то всё закончится излишним потреблением памяти, с вытекающим из этого замедлением игры, и ограниченной реиграбельностью, т.к. всё стоит на одних и тех же местах каждый раз.
Вместо этого давайте воспользуемся префабами. Если говорить просто, то мы превратим наши трубы в шаблоны, которые потом сможем использовать для эффективного создания большего количества труб по желанию. Если тут есть программисты, то считайте скрипт Pipe классом, а трубы — экземплярами этого объекта.
Для этого создайте новую папку «Prefabs». Затем перетащите pipe_up и pipe_down из окна иерархии в папку.
Каждый раз, когда вы перетаскиваете объект из этой папки в сцену, у него будут те же свойства, поэтому вам не нужно будет постоянно добавлять компоненты. Более того, если вы измените размер компонента в папке, это повлияет на все трубы в игре, и вам не придётся изменять каждую из них отдельно.
Как вы понимаете, это сильно сэкономит наши ресурсы. Также это означает, что мы можем взаимодействовать с объектами из кода. Мы можем создавать экземпляры наших труб.
Сначала добавьте этот код в условное выражение в методе Update() скрипта Pipe , которое мы оставили пустым:
void Update () < if (character.transform.position.x - transform.position.x >30) < float xRan = Random.Range(0, 10); float yRan = Random.Range(-5, 5); Instantiate(gameObject, new Vector2(character.transform.position.x + 15 + xRan, -10 + yRan), transform.rotation); Destroy(gameObject); >>
Это нужно для создания экземпляра нашего gameObject . В результате получается новая идентичная копия. В Unity всегда, когда вы используете слово gameObject , оно ссылается на объект, к которому скрипт в данный момент привязан — в нашем случае к трубе.
Мы генерируем заново наши трубы в случайных вариациях, чтобы было повеселее.
Но вместо того, чтобы проделывать всё то же в скрипте PipeD , мы генерируем оба объекта в одном месте. Таким образом мы можем легко устанавливать положение второй трубы относительно первой. Также это значит, что нам нужно меньше кода для PipeD .
Создайте public gameObject с именем pipeDown . Затем обновите код следующим образом:
if (character.transform.position.x - transform.position.x > 30)
Мы добавили переменную gapRan , которая позволяет слегка менять расстояние между трубами, чтобы было интереснее играть.
Возвращаемся обратно в Unity и перетаскиваем префаб pipe_down из папки с префабами (это важно!) в место, где написано «Pipe Down» (заметьте, как наш camel case заменяется пробелом) на спрайт трубы pipe up . Если вы помните, мы определили Pipe Down как public gameObject , что даёт нам возможность определять, чем является этот объект откуда угодно – в данном случае через инспектор. Выбирая префаб для этого объекта, мы убеждаемся, что при создании экземпляра трубы он будет включать в себя все атрибуты и скрипт, которые мы добавили ранее. Мы не просто создаём спрайт, но пересоздаём объект с коллайдером, который может убить персонажа.
Всё, что мы добавим в то же место в скрипте PipeD — просто Destroy(gameObject) , чтобы труба саморазрушалась при выходе за левую границу экрана.
Если вы сейчас запустите игру, то экран будет продвигаться дальше автоматически, и вы умрёте, если столкнётесь с любой из труб. Пролетите достаточно далеко, и эти трубы исчезнут и появятся снова впереди.
К сожалению, между трубами большое расстояние, и экран выглядит пустым. Мы могли бы исправить это, добавив несколько префабов в нашу сцену, чтобы создать конвейер постоянно появляющихся труб. Однако было бы лучше генерировать трубы в скрипте. Это важно, так как в противном случае после смерти персонажа трубы в начале пути уничтожатся, и снова образуется пустое пространство.
Таким образом, мы можем создавать несколько первых труб во время каждой загрузки игры и возвращать всё на свои места после смерти персонажа.
Бесконечный полёт
Теперь создадим public -переменные pipe_up и pipe_down в скрипте Character . Это даст вам возможность ссылаться на созданные объекты, перетаскивая префабы на объект персонажа, прямо как когда мы добавили pipe_down в скрипт Pipe .
Нам нужно добавить эти переменные:
public GameObject pipe_up; public GameObject pipe_down;
Затем мы напишем такой метод:
public void BuildLevel()
Мы будем вызывать его один раз в методе Update() и один раз в методе Death() .
После начала игры вызывается Update() , и наши трубы ставятся согласно заданной конфигурации. За счёт этого первые несколько препятствий всегда будут стоять на одном и том же месте. После смерти игрока трубы встанут на те же самые места.
Вернитесь в сцену в Unity и удалите две трубы, которые сейчас там находятся. Ваша «игра» будет выглядеть просто как пустой экран с птицей. Нажмите Play и трубы появятся, после нескольких первых их положение будет определяться случайным образом.
В заключение
Вот мы и сделали целую игру! Добавьте счётчик очков, попробуйте сделать его более оригинальным и увеличивайте сложность игры по мере продвижения. Также не будет лишним сделать меню. Ещё хорошей идеей будет уничтожать трубы на экране после смерти персонажа. Как только вы с этим закончите — считайте, что готовая к выпуску в Play Store игра у вас в кармане! Когда-то похожая игра сделала другого разработчика очень богатым, и это доказывает, что вам не нужно быть гением-программистом или иметь за своей спиной богатого издателя, чтобы достичь успеха. Вам просто нужна хорошая идея и десять минут!
Хотите писать приложения под Android, но не знаете, с чего начать? Тогда ознакомьтесь с нашей большой подборкой ресурсов для изучения Android-разработки.