Мой первый игровой проект увидел свет в 2007-м году. Это неофициальный сиквел игры «Come 2 Us SEED» – милого, но невероятно затягивающего платформера с видом сбоку. Говоря своими словами, штука отличалась чудовищной аддиктивностью – моя двоюродная сестра проводила дни напролёт, гоняя мультяшную свинку по платформам за зелёными «фруктами» (точками) и уклоняясь от глуповатых врагов. И это при том, что всё действие умещалось на небольшом цветном экране с разрешением аж 132х176 пикселей 🙂
Анализ механик
Чем же была так увлекательна игра? С первого взгляда, игровой процесс прост как три копейки, и вчистую проигрывает любому мобильному платформеру тех лет как в динамике, так и в разнообразии. Однако, после первых пяти минут игры ощущение волшебным образом испаряется, а под маской платформера обнаруживается тонкая и требующая быстрого логического планирования игра. Если коротко, то виновник этого – сумасшедшая игровая физика, породившая ключевую механику игры – механику «одностороннего перемещения» персонажей.
Высота – вот главный ресурс игрока здесь, а менеджмент этого ресурса – главное его занятие. Подъём наверх быстр и лёгок – буквально секунда, и мы добрались до самого верха. Это бывает полезно – поднявшись, можно сбежать от преследующего монстра или перебраться в недоступную снизу область уровня. Но вот спуск вниз…
Платформы, основной элемент уровней – делятся на “травяные” (преодолеваются насквозь прыжком снизу) и “сплошные” (туда можно запрыгнуть сбоку). Оба вида помогают игроку вскарабкаться. Однако, радоваться рано – это та самая ситуация, где “вход рубль, выход два”. Шагнув с платформы в пустоту, персонаж начинает чудовищно медленное (будто в киселе) падение. Находясь в воздухе, можно свободно перемещаться вправо-влево (“бегать по воздуху”) – но спуск ускорить никак невозможно. Совсем. Абсолютно. Совершенно никак. Даже кнопка “вниз” в настройках не предусмотрена!
Такая механика “кисельного падения” добавляет маленькому платформеру неожиданную глубину:
- с одной стороны, она работает на игрока, позволяя ему преодолевать достаточно крупные пропасти, или забираться на высокие точки, откуда можно подобно осеннему листу “спланировать” в закрытые места уровня.
- с другой стороны, она же помогает и монстрам, которые любят карабкаться по пятам – и легко могут загнать игрока в угол наверху. Или пока персонаж игрока неспешно опускается вниз, монстры могут заранее проследовать к точке его будущего падения и заготовить столовые приборы 🙂
Ах да, монстры. Монстры принципиально неуничтожимы – но довольно глупы и используют простые паттерны поведения. Они преграждают игроку путь к прохождению уровня, не давая захватить все обязательные для выхода с уровня зелёные точки. Большая часть игрового процесса завязана как раз на взаимодействии с врагами – отвлечь монстра, обхитрить и заманить в ловушку в непроходимое место, уронить в яму… плюс, на уровнях встречаются “энерджайзеры” в виде древесных листьев, на время замораживающие врагов. Правда, листья разбросаны крайне скупо – почти каждый предназначен для конкретного места уровня, с трудом проходимого без его взятия.
Уровни вообще созданы в парадигме “есть только один правильный способ прохождения”. Некоторые огрехи можно компенсировать быстротой рук (игрок вообще перемещается куда быстрее монстров) или хитроумным манёвром, но… на уровнях полно мест, где поленившийся обдумать свои действия наперёд игрок сыграет против себя самого. Впрочем, игра редко загоняет игрока в тупик и наказывает, и обычно даже после неудачного решения можно вернуться “на исходную” и обдумать положение. И когда игрок это понимает – простое аркадное развлечение для быстрых пальцев окончательно превращается в головоломку.
Процесс разработки
Толчком к началу работ над игрой стала неожиданная и сильная болезнь, свалившая меня в сельской местности – вдалеке от друзей, интернета и большинства развлечений. Лечение быстро помогало, но когда я уже чувствовал себя посвежевшим и отдохнувшим – врач настоял на продлении постельного режима ещё на пару недель.
Я валялся в кровати с ноутбуком, изучая учебники по программированию – а всё это время двоюродная сестра буквально не отлипала от телефона, чуть не по 12 часов в день гоняя свинку на экране с диагональю 1.8 дюйма. Это заставило меня всерьёз тревожиться о здоровье её глаз – а также о том, не сломается ли телефон раньше, чем ею будет достигнут финал игры 🙂
Я решил за остающуюся неделю постельного режима воплотить на ПК идейное продолжение игры – перенести игру на более безопасное для глаз устройство, попутно доработав геймплей и устранив недостатки оригинала. Задумка проекта была довольно проста:
- Реализовать на “самописном” движке узнаваемый аркадный игровой процесс с механиками “кисельного падения” и концепцией уровней-головоломок.
- Переработать баланс оригинала, снизив сложность и сделав игровой процесс разнообразнее.
- Уложиться в неделю – для этого используя преимущественно знакомые технологии и подходы.
В те времена отрасль бесплатных и доступных игровых движков находилась в зачаточном состоянии – потому написание собственного движка было единственным внятным выбором. Из инструментов, которыми я в то время владел, я решил использовать язык программирования Visual Basic – в настоящий момент де-факто вымерший, но в те времена ещё вполне актуальный.
“Индустриальным стандартом” тех лет для отрисовки качественной 2D-картинки были как минимум средства DirectX 8.0. Однако, использование DirectDraw с его низкоуровневыми графическими API для рисования даже минимальной картинки было настоящим адом. Это каша из плохо документированных операций с контекстами, магических констант, загадочных манипуляций со спрайтами и таинственных действий с памятью – причём щедро сдобренная порцией отказывающихся запускаться примеров, устаревших руководств и пугающего размера подводных камней. Всё это безобразие практически не стыковалось с объектной моделью Visual Basic, “заточенной” под окошки и кнопочки – моделью простой до идиотизма, наглядной, полностью прозрачной, и за это так трепетно мною любимой. Впечатлиться можно тут.
Путь “сделать как в AAA-индустрии” был быстро отброшен. В итоге, существующая реализация использует для вывода спрайтов на экран простейшее из всех доступных средств – стандартный компонент Image из набора Windows Forms. Да-да, банальное поле для вывода небольших изображений в интерфейсе обычных “настольных” пользовательских программах. Никакой встроенной поддержки анимации, визуальных эффектов… даже повороты спрайтов не поддерживаются! Скажу больше – если поле начинает двигаться в процессе работы программы, то изображение при перерисовке сильно и неприятно мерцает.
Тем не менее, двигать изображение для было и не нужно. Был использован старомодный, но вполне действенный подход “объект-знакоместо”. По сути, игровое поле представляет собой сетку из клеток-тайлов (квадратиков с изображениями одинакового размера), где каждый из них отображает в любой момент времени только ОДИН объект – персонажа, бонус, платформу, пустое место. В итоге, если персонаж переместился вбок – необходимо убрать его изображение из одной клетки и разместить в другой. Оригинальная игра, вероятно, использовала подобный подход – потому очень быстро был получен похожий результат.
Как только был воссоздан core-геймплей и скопированы некоторые из самых увлекательных уровней игры, было принято решение расширить набор бонусов. Были добавлен “озверин”, позволяющий при контакте съесть одного любого противника – чего невероятно не хватало в оригинале! – а также дополнительные жизни. “Озверин” раскладывался по уровням достаточно тонко, чтобы не было шанса ими злоупотребить – плюс, эффект от двух таблеток не “стакался”, то есть сколько бы таблеток игрок не проглотил – сработает это только один раз. Эта механика удачно легла на перенесённую из оригинала механику “стаков” монстров (когда несколько монстров занимают одну клетку). В ремейке разным способам “разделения” стаков и борьбы с ними уделено отдельное внимание.
Примечательные особенности
- Основные работы над движком удалось завершить в течение 3-4 дней, дальше основное время было посвящено разработке уровней плюс отлову багов.
- Сначала был реализован вывод тайлов на экран, потом физика движения, потом персонажи, потом подбор фруктов, потом загрузка карт из файла, потом бонусы, потом… в общем, игра делалась от “горизонтального среза”, постепенно расширяясь.
- Новые бонусы действительно сильно разнообразили игровой процесс, и на них удалось завязать свежие головоломки и трюки.
- Кривая сложности сделана по классической “голивудской” схеме – очень плавная в начале, после этого демонстрируя заметный рост к середине. Пики интенсивности, где требовались быстрые действия – перемежались с менее активными уровнями-головоломками, где от игрока нужно было только верно разгадать задумку. Завершал же игру “гранд финал”, оставляющий ощущение удовлетворённости и приятное послевкусие.
- Графика и звук были отданы на откуп “местному Community” – то есть двоюродной сестре. До того её опыт работы с нужными средствами был близок к нулю. Хотя сестра была в восторге от результата – но музыка спустя 10 минут игры вызывает у стороннего человека головную боль. Так что музыка ко времени публичного релиза из игры была вырезана (к большому моему огорчению!). Графика оказалась милой и вошла в релиз, получив переделку только в “ремастере”.
- Выбранный подход к реализации движка оказался довольно верным – игра запускалась всюду, от Windows 95 в 2007-м и до Windows 10 спустя больше чем 10 лет (правда, на Windows 10 надо установить библиотеку и активировать режим совместимости). Игра не лагала и не тормозила нигде и никогда.
- Захардкодена была основная и неизменная игровая логика – а вот уровни реализованы подгружаемыми из файлов. Игра была сделана заведомо расширяемой. Правда, это не пригодилось – но было очень полезным на этапе разработки.
- Использование тайловой системы позволило очень просто сделать редактор уровней по образцу классического Digger. Поскольку даже пустой тайл являлся элементом Image, то он реагирует на клики мыши – за счёт чего сделать дополнительную логику добавления объектов на карту было плёвым делом. Система загрузки уровня из файла вообще была превращена в систему сохранения карт за какие-то 15 минут работы. В итоге, при компиляции игры с определённым флагом – она собиралась как редактор. Редактор не только существенно облегчил работу по созданию уровней, но даже был включён в поставку игры.
- Также “местное Communtity” участвовало в разработке уровней, создало несколько толковых уровней – и было в восторге от факта, что уровни вошли в финальную версию.
- После того, как игра была выпущена – сестра тут же прошла её десяток раз всеми разными способами… и наигралась. Впрочем, к оригиналу (да и в целом к мобильному геймингу образца 2007-го) она тоже охладела – видимо, гештальт был успешно закрыт.
Публикация и оценка
В 2007-м году я не имел толком ни опыта, ни понимание вопросов издания продуктов. Самое лучшее, что я смог сделать – это показать игру друзьям, опубликовать на своей homepage, а также ряде бесплатных “софтопомоек” – где за счёт невзрачной графики она быстро затерялась среди себе подобных.
Впрочем, игра и не планировалась для продажи, и интересовал меня скорее выпуск в мир своей первой законченной и серьёзной игры.
Однако, локальная известность пришла к игре – хоть и неожиданным путём. Игра вместе с исходниками была опубликована на крупнейшем в СНГ ресурсе, посвящённом программированию на Visual Basic. По сравнению с большинством игровых проектов, размещённых там – игра выглядела настоящим инженерным чудом, внешне совершенным, внутренне упорядоченным, увлекательным и вполне законченным продуктом. По итогу, игра набрала больше 3500 установок (цифра, сравнимая с общей посещаемостью ресурса!), и даже обзавелась своей маленькой группой ценителей. Я получил обратную связь и интересные знакомства (в игре была встроена подсказка с моим номером ICQ) – и неоценимый опыт завершения инди-разработок ещё в ту эпоху, когда слова “инди” ещё не перевернуло мир.
Выводы разработки
- Такой вышла моя первая законченная игра.
- Она имеет минусы, недочёты и ряд недоработок – но она увидела свет в 2007-м.
- В игру можно играть, она приносит удовольствие, а баги и косяки не влияют сильно на общее ощущение от процесса.
- Чёткое понимание результата, сроков и состава механик конечного продукта – вот то, что способствовало успешному её завершению.
- Жёстко определённый перечень фич и итоговый облик игры – это то, что помогло начать разработку с правильных положений (например, не гнаться за DirectX-графикой) и завершить проект в срок.
- Правильно расставленные приоритеты вообще помогли отбросить ненужное и сразу перейти к важным вещам – особенно если в руках нет готового движка/фреймворка/кода реализации всех механик.
- Разработка велась во многом инкрементарно – первой появилась core-механика, за ней последовали дополнительные фишки – но в каждый момент в игру можно было поиграть. Именно наличие “горизонтального среза” поддерживало ощущение прогресса и позволяло сверяться с целями.
Где поиграть?
Игру можно скачать с моего сайта:
- Если у Вас Windows 95 – Windows 8:
Скачать “P.I.G. HD [2018 Remastered]”
pig_remasterHD2018.zip – Загружено 138 раз – 1 022,92 КБ
(рекомендуется установить режим совместимости с Windows 98)
- Если у Вас Windows 10 или возникла проблема:
Скачать “P.I.G. HD [2018 Remastered] + OCX”
pig_remasterHD2018ocx.zip – Загружено 124 раза – 1,09 МБ
(для установки отсутствующего в Windows 10 устаревшего компонента выполните “install.bat” от имени администратора)