DEADSOFTWARE

Add article and more screenshots.
[LongFlight.git] / article / article.txt
1 [color=#454545][center]Сожмите протон до одной миллиардной его размера и упакуйте в это пространство столовую ложку вещества.[/center][/color]
3 [url=http://annimon.com/forum/?act=post&id=393212]Long Flight[/url] - конкурсная игра, опубликованная в начале 2015 года. В данной статье будет описан процесс разработки. Целью является поделится личным опытом.
5 [head]Как всё началось[/head]
6 Всё началось больше года назад, с первой программы, написанной мной на MIDlet Pascal. Всё что она собой представляла - это множество белых точек на абсолютно чёрном фоне. Тогда это было весьма трудно назвать космосом, но уже было нечто похожее: так называемые звёзды циклически падали вниз.
7 [center][img=screenshot0.png]screenshot0.png[/img][/center]
8 Тогда, в принципе, всё было идеально: я являлся героем в своих глазах, а небольшой код в несколько десятков строк вызывал во вне чувство гордости за себя, что вся эта куча символов вообще работает.
10 [head]Акт 1: StarFire. Первая попытка[/head]
11 Спортивный интерес не давал мне остановиться, меня затягивало всё сильнее и сильнее: я добавил космический кораблик и возможность им управлять, а в скором времени были добавлены враги и пули. Разработка продолжалась, и уже к январю 2014 года была создана первая тестовая версия игры. Аркадка к тому времени выглядела намного милее:
12 [center][img=screenshot2.png]screenshot2.png[/img][img=screenshot1.png]screenshot1.png[/img][/center]
13 Код становился всё больше и больше, и уже здесь возникли первые проблемы - бэкапы, откат изменений, редактирование больших участков кода, бесконечные рефакторинги, вечное стремление к идеальному коду, и так далее... Я мог в первый день написать кучу кода без предварительного проектирования, на следующий день заняться переименовыванием переменных или подпрограмм, а на третий половину кода заменить на что-то новое. А ещё позже вообще может оказаться, что нужно сделать откат! И попробуй тут выкручивайся с тысячами бэкапов - голова кругом пойдёт!.. [i]А все проблемы решаются простым способом - просто их не нужно создавать или стремиться сводить их появление к нулю.[/i]
14 [spoiler=О том, как это можно сделать]
15 О разработке программного обеспечения есть [url=http://annimon.com/download/index.php?act=view&id=378]очень хорошее руководство для начинающих[/url], оно так и называется - "Разработка программного обеспечения", написанное Виктором Мельником. Более точно к этому вопросу обращается С. Макконнелл в книге "Совершенный код".
16 Об управлении версиями и почему это так важно вы можете почитать в статье "[url=http://annimon.com/article/764]Лёгкое введение в git[/url]". Хорошим справочником по работе с git может послужить книга S. Chacon - "Pro Git".
17 [/spoiler]
19 [head]Акт 2: Space in Fire. Продолжение[/head]
20 Теперь разработкой занимался уже не один человек, а несколько: один занимался программированием, а второй разработкой дизайна и графики. Проблемы возникли, когда от MIDlet Pascal требовалось намного больше, чем он умеет. Таким образом, спустя один месяц игра встала на продвинутый уровень развития, переписанная уже на языке Java - именно здесь и начался сущий ад. Разработка велась на протяжении 5 месяцев, после чего была заброшена. Как же так получилось? Вообще-то никакого продолжения не должно было быть - задуманная игра была уже почти доделана. Именно в этот момент в полную силу была ощутима ошибка неправильной разработки: несогласованность действий, несерьёзное отношение к проектированию. А результат - два человека вместе занимались разработкой двух разных игр. Перед тем, как делать продолжение игры, нужно было выяснить, каким оно является и будет ли это вообще продолжением, а не созданием новой игры. Прежде чем приступать к кодингу, необходимо всё расставить по полочкам и продумать каждую мелочь; заниматься разработкой следует в хронологическом порядке, а именно: не нужно делать всё и сразу вместо того, чтобы сконцентрироваться на чём-то определённом и сделать это качественно (а для этого необходимо умение распределять своё время); нужно быть честным: движок к этой игре было нереально сложно разрабатывать, да и оптимизировать под Java ME тоже весьма непростая задача. Именно это и послужило тому, что проект почти не развивался, но на него были потрачены огромные усилия. Таким образом, исходный код StarFire был утерян, а на исходники Space in Fire уже не было никакого смысла смотреть.
21 [center][img=screenshot3.png]screenshot3.png[/img][img=screenshot4.png]screenshot4.png[/img][/center]
22 События со стороны дизайнера тоже развивались интересно. Еще давным давно я (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) и я, конечно, разрешил. В тяжелейших духовных поисках я пытался создать более-менее годный дизайн. Чтобы проект выглядел целостным нужны были единые гайдлайны. Возможные вариации дизайна проекта (их могло быть значительно больше):
23 [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]
25 [head]О том, как было реализовано управление в Space in Fire[/head]
26 Выведем несколько основных формул. Так как действие происходит в декартовой двухмерной системе координат, и лететь нужно строго, куда смотрит кораблик, вводим новую векторную величину, характеризующую изменение положения кораблика, прямо зависимую от скорости (speed) и обратно зависимую от промежутка времени (frame). Обозначим её, как step и запишем в следующем виде:
27 [math]\[step=\frac{speed}{frame}\][/math]
28 Так как промежутком времени будет считаться один кадр, переменную frame можно опустить. Тогда зависимость станет прямой:
29 [math]\[step=speed\][/math]
30 Переводим в скалярную форму. Для этого нам нужно знать угол (обозначим его через [math]\[\alpha\][/math]) и применить тригонометрические функции. Тогда выражение примет следующий вид:
31 [math]\[stepx=cos\alpha*speed\][/math]
32 [math]\[stepy=sin\alpha*speed\][/math]
33 Это и есть величины, характеризующие изменение положение кораблика за один кадр.
35 [head]Акт 3: Long Flight[/head]
36 [center][img=album.png]album.png[/img][/center]
37 Цель была такова: сделать простую, но красивую леталку. Основной упор работы шёл на качество исполнения. Время распределял по своим возможностям и силам, от чего на создание непосредственно самого игрового процесса времени выделялось не много. Прежде чем начать разработку подготовил все необходимые инструменты:
38 [b]*[/b] Java ME SDK 3.4 - инструменты разработки под Java ME
39 [b]*[/b] NetBeans IDE 8.0 - удобная среда разработки
40 Для тестирования использовались 3 эмулятора:
41 [b]1.[/b] KEmulator 1.0.0
42 [b]2.[/b] MicroEmulator 2.0.4.63
43 [b]3.[/b] Pstros
44 Приходилось находить компромисс между первыми двумя: первый мог исполнять нерабочий код, а второй иногда не мог исполнять рабочий код. Третий эмулятор во многом аналогичен второму.
45 Для удобства написания игры было создано 3 проекта среды NetBeans:
46 [b]*[/b] Debug
47 [b]*[/b] Release
48 [b]*[/b] Crypto
49 Дам описание каждой из них:
50 [i]Debug[/i] - первичная версия проекта. Содержит необходимую отладочную информацию - она является очень удобной, поскольку упрощает поиск и исправление багов. Допустим, если возникнет какое-либо исключение, оно тут же будет перехвачено и передано на консоль эмулятора, где будет выведен стек-стрейс и полный путь к возникшему исключению (с точностью до строчки в исходном коде!).
51 [i]Release[/i] - окончательная версия проекта. Все ресурсы шифруются, классы обфусцируются, удаляется отладочная информация.
52 [i]Crypto[/i] - отдельный проект, шифрующий ресурсы.
53 Так как разработка велась на разных устройствах, а следовательно необходим чёткий контроль версий, был создан локальный git репозиторий. К тому же NetBeans дружит с git и осуществляет удобную работу с ним.
54 Сначала сделал заготовку (были созданы все игровые экраны), ближе к новому году была создана игра, а все последующие дня были отведены для исправления багов и неточностей. Разработка в целом велась благоприятно, и проект был сдан в намеченные сроки.
55 [center][img=screenshot5.png]screenshot5.png[/img][img=screenshot6.png]screenshot6.png[/img][/center]
57 На этом всё. [url=https://github.com/KalterFive/LongFlight]Исходники[/url] можно найти на GitHub.