[color=#454545][center]Сожмите протон до одной миллиардной его размера и упакуйте в это пространство столовую ложку вещества.[/center][/color] [url=http://annimon.com/forum/?act=post&id=393212]Long Flight[/url] - конкурсная игра, опубликованная в начале 2015 года. В данной статье будет описан процесс разработки. Целью является поделится личным опытом. [head]Как всё началось[/head] Всё началось больше года назад, с первой программы, написанной мной на MIDlet Pascal. Всё что она собой представляла - это множество белых точек на абсолютно чёрном фоне. Тогда это было весьма трудно назвать космосом, но уже было нечто похожее: так называемые звёзды циклически падали вниз. [center][img=screenshot0.png]screenshot0.png[/img][/center] Тогда, в принципе, всё было идеально: я являлся героем в своих глазах, а небольшой код в несколько десятков строк вызывал во вне чувство гордости за себя, что вся эта куча символов вообще работает. [head]Акт 1: StarFire. Первая попытка[/head] Спортивный интерес не давал мне остановиться, меня затягивало всё сильнее и сильнее: я добавил космический кораблик и возможность им управлять, а в скором времени были добавлены враги и пули. Разработка продолжалась, и уже к январю 2014 года была создана первая тестовая версия игры. Аркадка к тому времени выглядела намного милее: [center][img=screenshot2.png]screenshot2.png[/img][img=screenshot1.png]screenshot1.png[/img][/center] Код становился всё больше и больше, и уже здесь возникли первые проблемы - бэкапы, откат изменений, редактирование больших участков кода, бесконечные рефакторинги, вечное стремление к идеальному коду, и так далее... Я мог в первый день написать кучу кода без предварительного проектирования, на следующий день заняться переименовыванием переменных или подпрограмм, а на третий половину кода заменить на что-то новое. А ещё позже вообще может оказаться, что нужно сделать откат! И попробуй тут выкручивайся с тысячами бэкапов - голова кругом пойдёт!.. [i]А все проблемы решаются простым способом - просто их не нужно создавать или стремиться сводить их появление к нулю.[/i] [spoiler=О том, как это можно сделать] О разработке программного обеспечения есть [url=http://annimon.com/download/index.php?act=view&id=378]очень хорошее руководство для начинающих[/url], оно так и называется - "Разработка программного обеспечения", написанное Виктором Мельником. Более точно к этому вопросу обращается С. Макконнелл в книге "Совершенный код". Об управлении версиями и почему это так важно вы можете почитать в статье "[url=http://annimon.com/article/764]Лёгкое введение в git[/url]". Хорошим справочником по работе с git может послужить книга S. Chacon - "Pro Git". [/spoiler] [head]Акт 2: Space in Fire. Продолжение[/head] Теперь разработкой занимался уже не один человек, а несколько: один занимался программированием, а второй разработкой дизайна и графики. Проблемы возникли, когда от MIDlet Pascal требовалось намного больше, чем он умеет. Таким образом, спустя один месяц игра встала на продвинутый уровень развития, переписанная уже на языке Java - именно здесь и начался сущий ад. Разработка велась на протяжении 5 месяцев, после чего была заброшена. Как же так получилось? Вообще-то никакого продолжения не должно было быть - задуманная игра была уже почти доделана. Именно в этот момент в полную силу была ощутима ошибка неправильной разработки: несогласованность действий, несерьёзное отношение к проектированию. А результат - два человека вместе занимались разработкой двух разных игр. Перед тем, как делать продолжение игры, нужно было выяснить, каким оно является и будет ли это вообще продолжением, а не созданием новой игры. Прежде чем приступать к кодингу, необходимо всё расставить по полочкам и продумать каждую мелочь; заниматься разработкой следует в хронологическом порядке, а именно: не нужно делать всё и сразу вместо того, чтобы сконцентрироваться на чём-то определённом и сделать это качественно (а для этого необходимо умение распределять своё время); нужно быть честным: движок к этой игре было нереально сложно разрабатывать, да и оптимизировать под Java ME тоже весьма непростая задача. Именно это и послужило тому, что проект почти не развивался, но на него были потрачены огромные усилия. Таким образом, исходный код StarFire был утерян, а на исходники Space in Fire уже не было никакого смысла смотреть. [center][img=screenshot3.png]screenshot3.png[/img][img=screenshot4.png]screenshot4.png[/img][/center] События со стороны дизайнера тоже развивались интересно. Еще давным давно я (SashaG) привык, что мой Nokia X2-00 заменяет мне компьютер. Вот только с кодингом были проблемы: ни Mobile BASIC, ни MobPascal не были подходящими инструментами разработки; поэтому времени было валом и было чем заняться. Довольно долго и много я рисовал в ProPaintMobile и на обычно пустующей MicroSD-флешке собрался приличный архив графики, различных модов и тем. Но этим я ограничиваться не хотел, мне нужна была игра, ибо мне порядком все надоело, однажды я сказал: "так лень жить, что аж лень умирать"... Внезапно стукнула идея сделать порт Космических Рейнджеров. Так как с кодом я ничего поделать не мог, я решил, что даже просто графика - уже хорошо. Рисую я не как все. Удобно сохранять каждый этап, ибо тут слоев никаких нет, а мне порой нужно было откатить изменения. Название каждой картинки было примерно таким: "file_aaa.png". Количество "а" означало номер этапов. Иногда я пользовался другими буквами (когда размер имени файла норму превышал, например). С каждым новым пикселем одновременно формировались самые разные идеи, которые иногда даже выходили за рамки проекта... Внезапно я наткнулся на игру Kalter'а. Естественно, предложил сотрудничать. Увидев предоставленные мной наброски, он согласился. С этого момента игра терпит изменения. Так как у меня было много идей, то я через своего коллегу делал свою игру. В чем же была идея игры? - Пошаговой я ее видеть не хотел, нужен был драйв. В остальном это была двухмерная версия Galaxy on Fire 2 или аркадный вариант Космических Рейнджеров, как угодно. Так начался Space in Fire. Самый первый шаг - сделать управление, подобная реализация была в игре GangStar для мобильников. Тут было много веселья... Взяв ручку и бумагу, я вывел тригонометрические формулы (что само по себе странно) и передал коллеге. Первый билд комом. Корабль летал опираясь на свои собственные законы и было сложно понять, что с ним происходило. Заметив некую закономерность, я попросил уменьшить скорость корабля и понял, что он поворачивает в обратном направлении (то есть, при нажатии вправо – поворот против часовой стрелки, к примеру). Быстро пофиксили и получилась веселая леталка без ничего. Далее серьезных изменений игра не перетерпела и постепенно проект остановился. Проходит время... Случилось многое, но об этом не здесь. Уже лучший друг Kalter поведал мне о конкурсе (к сожалению, когда половина времени на разработку проекта прошла). Я взялся за свой проект, а он делал свой. Почти сразу он попросил разрешения брать мою графику (которая предназначалась для Space in Fire) и я, конечно, разрешил. В тяжелейших духовных поисках я пытался создать более-менее годный дизайн. Чтобы проект выглядел целостным нужны были единые гайдлайны. Возможные вариации дизайна проекта (их могло быть значительно больше): [center][img=gfx0.png]gfx0.png[/img][img=gfx1.png]gfx1.png[/img][img=gfx2.png]gfx2.png[/img][img=gfx3.png]gfx3.png[/img][img=gfx4.png]gfx4.png[/img][img=gfx5.png]gfx5.png[/img][/center] [head]О том, как было реализовано управление в Space in Fire[/head] Выведем несколько основных формул. Так как действие происходит в декартовой двухмерной системе координат, и лететь нужно строго, куда смотрит кораблик, вводим новую векторную величину, характеризующую изменение положения кораблика, прямо зависимую от скорости (speed) и обратно зависимую от промежутка времени (frame). Обозначим её, как step и запишем в следующем виде: [math]\[step=\frac{speed}{frame}\][/math] Так как промежутком времени будет считаться один кадр, переменную frame можно опустить. Тогда зависимость станет прямой: [math]\[step=speed\][/math] Переводим в скалярную форму. Для этого нам нужно знать угол (обозначим его через [math]\[\alpha\][/math]) и применить тригонометрические функции. Тогда выражение примет следующий вид: [math]\[stepx=cos\alpha*speed\][/math] [math]\[stepy=sin\alpha*speed\][/math] Это и есть величины, характеризующие изменение положение кораблика за один кадр. [head]Акт 3: Long Flight[/head] [center][img=album.png]album.png[/img][/center] Цель была такова: сделать простую, но красивую леталку. Основной упор работы шёл на качество исполнения. Время распределял по своим возможностям и силам, от чего на создание непосредственно самого игрового процесса времени выделялось не много. Прежде чем начать разработку подготовил все необходимые инструменты: [b]*[/b] Java ME SDK 3.4 - инструменты разработки под Java ME [b]*[/b] NetBeans IDE 8.0 - удобная среда разработки Для тестирования использовались 3 эмулятора: [b]1.[/b] KEmulator 1.0.0 [b]2.[/b] MicroEmulator 2.0.4.63 [b]3.[/b] Pstros Приходилось находить компромисс между первыми двумя: первый мог исполнять нерабочий код, а второй иногда не мог исполнять рабочий код. Третий эмулятор во многом аналогичен второму. Для удобства написания игры было создано 3 проекта среды NetBeans: [b]*[/b] Debug [b]*[/b] Release [b]*[/b] Crypto Дам описание каждой из них: [i]Debug[/i] - первичная версия проекта. Содержит необходимую отладочную информацию - она является очень удобной, поскольку упрощает поиск и исправление багов. Допустим, если возникнет какое-либо исключение, оно тут же будет перехвачено и передано на консоль эмулятора, где будет выведен стек-стрейс и полный путь к возникшему исключению (с точностью до строчки в исходном коде!). [i]Release[/i] - окончательная версия проекта. Все ресурсы шифруются, классы обфусцируются, удаляется отладочная информация. [i]Crypto[/i] - отдельный проект, шифрующий ресурсы. Так как разработка велась на разных устройствах, а следовательно необходим чёткий контроль версий, был создан локальный git репозиторий. К тому же NetBeans дружит с git и осуществляет удобную работу с ним. Сначала сделал заготовку (были созданы все игровые экраны), ближе к новому году была создана игра, а все последующие дня были отведены для исправления багов и неточностей. Разработка в целом велась благоприятно, и проект был сдан в намеченные сроки. [center][img=screenshot5.png]screenshot5.png[/img][img=screenshot6.png]screenshot6.png[/img][/center] На этом всё. [url=https://github.com/KalterFive/LongFlight]Исходники[/url] можно найти на GitHub.