Недавно я оказался в не совсем обычной для себя ситуации вынужденного безделья. Пару недель поваляв дурака, я стал чувствовать, что это не такое уж и веселое занятие, которое к тому же еще и стало переходить в скуку. И мне надо было себя занять чем-нибудь относительно полезным. Раньше мне периодически приходили в голову мысли о том, чтобы вернуть к жизни какую-нибудь старую игру из времен моей юности. Но я всегда гнал такие идеи прочь, так как понимал, что "никому это теперь не надо". Но сейчас у меня было свободное время и, главное, было желание. В результате для клонирования я выбрал один из вариантов игры Lode Runner, в который я когда-то играл на первом персональном компьютере времен позднего СССР, который назывался БК-0010. Не думаю, что многие о нем помнят, так как мир «железа» поменялся с тех времен очень сильно. Однако сам Lode Runner с этого БК-0010 был достаточно уникален своими правилами среди других одноименных Lode Runner-ов. Эта версия игры была моей самой любимой, как мне кажется, по объективным причинам, хотя… может быть тут дело просто в ностальгии. В результате я сумел себя мотивировать тем, что "лично мне", а, возможно, и "всему миру", эта игра может быть интересна, и на её восстановление стоит потратить время (ссылка на полученный результат).
Для начала взглянем на оригинал с БК-0010 (хвала Интернету, в котором можно найти почти всё):
Правила игры достаточно просты. Необходимо собрать все сокровища в лабиринте, затем появится «дверь», через которую можно выйти на следующий уровень. Но выполнению этой благородной задачи мешают злые охранники, которые преследуют беззащитного главного героя. Хотя… есть у нашего героя одно секретное оружие — в кирпичном полу можно пробивать дырки, делая ловушки для охранников. Охранник проваливается в такую дырку и некоторое время считается пойманным. В этот небольшой промежуток времени главный герой может бегать охраннику по голове. Отличительной особенностью версии игры на БК-0010 было то, что главный герой дырявил кирпичи строго под собой, а не справа или слева, как это происходило, например, на Lode Runner с компьютера ZX-Spectrum. В результате можно было бежать вперед, оставляя за собой продырявленный пол, куда падали преследователи. И эта особенность как раз и выделяла для меня этот Lode Runner из всех других одноименных игр.
При полном клонировании в разработке есть как плюсы, так и минусы. Безусловным плюсом является то, что есть возможность заранее четко представить себе цель, также можно использовать игровые уровни, которые уже есть в версии для БК-0010. Минусы же заключаются в том, что поведение главного героя и охранников должно быть реализовано максимально близко к оригиналу. И если с главным героем всё более-менее ясно, то у охранников есть что-то наподобие AI, который имеет-таки массу мелких особенностей, требующих повторения в моем коде. Критические отклонения в поведении охранников могут сделать уровни с БК-0010 неинтересными либо вообще непроходимыми. А это убивает весь смысл клонирования.
Начал я с того, что нашел в Интернете уже кем-то переделанный вариант Lode Runner-а с БК-0010. Однако маленько поиграв в него, я понял, что он похож только с виду. Несмотря на внешнюю схожесть, на мой взгляд, автор не дал себе труда поработать над поведением охранников, поэтому перемещались они не так, как это было в оригинале. А когда я «замуровал» одного из охранников в кирпичах, игра сбилась. Но в этой версии был важный для меня плюс — здесь присутствовал редактор уровней, и эти уровни также были старательно перерисованы из оригинала. А мне эти уровни как раз были очень нужны.
Несмотря на то, что игра была по современным меркам простенькой, она требовала, чтобы у неё был какой-то интерфейс пользователя, т.е. те же кнопки меню должны были как-то функционировать. Также у меня присутствовала навязчивая идея о том, чтобы игра была легко переносимой на разные платформы. К счастью для меня, я уже делал подобную оболочку для своей классической RTS Земля онимодов (статью о том как я её делал можно найти тут). Оболочка эта имеет важную особенность — она не общается с ОС напрямую, а только через виртуальные функции, которые можно относительно легко заменить. Также оболочка имеет достаточно продвинутый GUI, который с виду может не сильно отличается от интерфейса Windows:
Запись/чтение файлов, файловые потоки, работа с мышью и клавиатурой, воспроизведение звука, вывод графики и управление режимами экрана — всё это также было предусмотрено в моей оболочке. Поэтому я пошел именно этим путем — решил допрограммировать к оболочке небольшую игру.
Больше информации по этой оболочке можно найти в моей прошлой статье.
Игра не требовала каких-то серьезных вычислительных мощностей, поэтому я решил не заморачиваться и рисовать графику процессором. Логика тут очень проста. Создаем поверхность в памяти, выводим туда картинку процессором, потом копируем эту поверхность на текстуру DirectX или OpenGL в видеопамяти и эту текстуру уже выводим на монитор. Такой подход хорош тем, что он максимально упрощает перенос между разными платформами. А так как бороться за быстродействие мне не придется, то я посчитал этот путь единственно правильным, тем более, что оболочка на текущий момент также строит своё изображение процессором.
Обычно я всем говорю, что если вы делаете игру с нуля, то нужно начинать с редактора ресурсов. Такой редактор, практически, должен позволять собирать персонажа из спрайтов и визуально прописывать все его характеристики. Однако в данном случае персонажи были устроены слишком просто, и поэтому я отошел от собственного правила, перейдя сразу к редактору уровней. В моем случае всё это выглядит так:
Здесь можно выбрать уровень для редактирования, создать новый или удалить надоевший. Само редактирование уровня также выглядит очень просто, так как лабиринт состоит всего лишь из нескольких деталей.
Естественно, что в начале у меня никакой графики не было — я надергал из Интернета каких-то иконок и превратил их во «временную графику». Живые объекты у меня также в начале представляли из себя статические картинки, которые, в прямом смысле, плавно ездили по уровню. Но такой подход позволил мне запрограммировать почти всю логику игры не прибегая к помощи художника. Художником, кстати, выступил мой старый друг Константин Иванов, который уже давно ничем подобным не занимался, так как в настоящий момент тратит свою жизнь на создание рекламных видеороликов в одной казанской компании. И эти видеоролики ему уже порядком надоели. Поэтому, к моему удивлению, он достаточно активно взялся за оформление моей явно некоммерческой затеи. В результате всё оформление нами было сделано за 2 ночи в сочетании в уничтожением алкогольной продукции. Тут надо уточнить, что сам я по графике ничего не делал — только предлагал и критиковал, а рисовал Константин.
Так как в оригинальном варианте игры персонажи представляли из себя нечто невнятное по причине малого количества пикселей на клетку уровня, то мы решили их поменять. Привидения вполне подходили на роль охранников, к тому же у них было большое достоинство — им не нужно ногами двигать во время перемещения, что упрощает рисование. А вот с главным героем так просто не получилось. Первый вариант, который выдал мне Константин, определенно напоминал мне «жидкого Терминатора» в миниатюре. И было очевидно, что ему надо не убегать от привидений, а охотиться на них. Однако сюжет игры требовал другого. В результате я дал Константину книгу Николая Козлова "Истинная правда или учебник психолога по жизни", а там куча иллюстраций примерно такого типа:
И через несколько минут он мне выдал нашу «колобчиху» , которую мы в результате и отправили на поиски сокровищ. На всякий случай уточняю, что Константин рисовал ей «ручки», а не «ушки», но визуально это не совсем очевидно.
Потом мы старательно переносили все уровни из оригинала в нашу игру. Я их открывал в той не самой удачной версии, о которой я упоминал ранее, затем нажимал PRINTSCREEN, закидывал в Photoshop и оттуда печатал на принтере. Да… перед печатью еще делал инверсию изображения, чтобы не заставлять принтер печатать много-много черного цвета. И, глядя на этот лист, я просто рисовал в своем редакторе уровней то же самое. После того, как все 26 уровней были перенесены, мы с удовольствием дорисовали несколько собственных.
Лично у меня самые большие сложности были из-за необходимости почти точно повторить алгоритм поведения охранников. Практически, приходилось играть и глазами выискивать в каких-то редких ситуациях неадекватность действий «спецслужбы лабиринта». И нет так сложно было исправлять эти ситуации, как сложно было их обнаружить. Но мне очень хотелось сделать поведение аналогичным тому, что было в оригинале и, надеюсь, что это мне удалось.
Был когда-то в конце существования СССР такой мультфильм, который назывался "Босой ученый". Там один, ну, очень умный восточный мыслитель пошел на рынок за новыми ботинками. И там он увидел, что какой-то художник продает картины, на которых нарисованы всякая живность, в частности, там были и петухи. И мыслитель говорит художнику:
— У тебя же талант. Зачем ты его тратишь на то, чтобы рисовать петухов? Нарисовал бы лучше что-нибудь великое, например, бога.
А художник ему и отвечает:
— Бога нарисовать слишком просто, поэтому мне это неинтересно.
— Неужели ты считаешь, что бога нарисовать проще, чем какого-то там петуха? (возмутился мыслитель)
— Конечно, проще (отвечает художник). Бога же никто не видел. Нарисуй я его с рогами или без головы — никто не скажет, что я нарисовал его неправильно. А вот если я нарисую неправильно петуха, то все сразу скажут, что я не умею рисовать.
(рассказал по памяти — смотрел мультик очень давно, но эта мысль мне определенно показалось дельной)
В общем саму игру я осилил примерно за недельку, но потом добавляли графику и звук, рисовали уровни и, самое главное, я-таки решил поиграться в кроссплатформенность. До этого момента я никогда не писал приложений под Linux или Mac OS (хотя вру… под Mac OS, iOS, Android и WinPhone я делал примеры работы своего движка спецэффектов, но это были отдельные проекты, а сейчас мне надо было портировать один и тот же продукт везде).
Я обнаружил, что мир Linux/Unix очень разнообразен и сильно отличается в мелочах, несмотря на общие правила. Разбираться с этим многообразием я для себя посчитал делом немыслимым, но портировать всё же очень хотелось. Поэтому я взял движок SDL, который, к счастью, берет на себя все эти тонкости работы различных юниксообразных ОС. Для портирования на Linux я поставил на виртуальную машину Fedora-64 и в ней установил среду Code::Blocks. Дописал к своей оболочке новые классы, которые через виртуальные функции обращались бы к этому SDL. Создал объекты этих классов, вместо объектов классов, которые взаимодействовали с Windows и… собственно всё. К моему удивлению, виртуальная машина вполне воспроизводила игру в реальном времени, разве что звуки чуть-чуть запаздывали.
Mac OS сопротивлялся дольше Linux-а, так как я поленился переносить проект на XCode и установил в Mac OS тот же Code::Blocks. И тут я обнаружил, что отладчик-то не работает. Я понимал, что всё дело в какой-то мелочи, так как после Linux-а проект на Mac OS даже сразу собрался, но возможности запустить отладчик у меня всё равно не было, хотя я и попытался установить GDB. (Возможно, что у меня на Mac-е жутко древняя операционка Lion, и отсюда проистекают проблемы с отладчиком). В результате, я просто стал выводить сообщения в консоль. Оказалось, что проблема была в путях к папке с игрой и к папке для сохранения данных. Как только я исправил эти функции, игра запустилась.
Отдельное время у меня отняла задача по открытию в браузере ссылок. Как это делать в Windows я, конечно, знал:
void GPlatformWindows::OpenLink(const char* link)
{
ShellExecute(NULL, _T("open"), link, NULL, NULL, SW_MAXIMIZE);
}
А вот Linux порядком помотал мне нервы с этими ссылками. В результате я сделал так:
void GPlatformUnix::OpenLink(const char* link)
{
ToIconic(); // сворачиваем окно с игрой
#ifdef __APPLE__
// для MAC OS
CMagicString param="open ";
param+=link;
system(param);
#else
// для Linux
pid_t pid=fork();
if (pid>=0)
{
if (pid==0)
{
CMagicString param="xdg-open ";
param+=link;
system(param);
_exit(0);
}
}
#endif
}
Не уверен, что это самое лучшее решение, но оно в моем случае вполне работает.
Итоги:
Полученные результаты меня вполне устроили. Я сам с удовольствием поигрался в свое творение и считаю, что качество данного клона вполне приемлемое. Кроме того, я очень редко берусь за проекты, которые по своему объему очень мелкие. А малый объем работы приносит быстрый результат и, соответственно, ощущение «новой звездочки на крыле». Кроме того, мелкие проекты завершаются быстрее, чем они успевают надоесть.
Если будут желающие «заценить» данное произведение, то я записал небольшое видео на тему того, как правильно играть в мой Lode Runner:
Совет по игре: чтобы дырявить пол лучше удерживать пробел, а не барабанить по нему.
Разработчики:
— Программирование: Алексей Седов (он же Odin_KG, он же студия Astralax)
— Графика: Константин Иванов
Платформы: Windows, Linux, Mac OS
Ссылка на страницу с игрой: Lode Runner
О программировании игр в стародавние времена (лирический раздел)
Я начинал интересоваться программированием почти в то же время, когда появлялись эти первые игры на первых компьютерах, доступных простому населению СССР. И эти первые игры произвели на меня гораздо большее впечатление, чем какая-либо современная высокотехнологичная коммерческая игра с огромным бюджетом и мощным пиаром. И тут всё очень понятно. Впервые я увидел компьютерную игру в тот же момент, когда я впервые узнал о существование компьютеров. Т.е. вот представьте себе следующее: человек знает про радио, телевизор и пылесос, но он вообще понятия не имеет, что на свете есть такая штука как компьютер. Узнал я это в «салоне компьютерных игр», куда отправились все мои тогдашние приятели по общему двору, чтобы посмотреть на эту диковинку. (Тогда как раз в стране стали появляться первые кооперативы, и салоны компьютерных игр скоро стали обычным бизнесом). И в этом салоне стояли как раз те самые БК-0010 с черно-белыми маленькими телевизорами. Поиграть на этом чуде стоило тогда 1 руб/час. И первое, что я увидел выглядело так:
Это игра Land, которая показала мне, что изображением на телевизоре, оказывается, можно управлять. И всё это называется «КОМПЬЮТЕР». Сейчас, оглядываясь назад, я предполагаю, что тогда мне было ориентировочно 13 лет.
Не знаю как бы сложилась моя жизнь, если бы я в своё время вот так вот не познакомился с компьютерными играми. Но тогда я, естественно, и мечтать не мог, что когда-нибудь смогу взять да и запросто сам создать компьютерную игру. К этому этапу я смог перейти только через пару лет, когда у меня появился первый самодельный компьютер Специалист. А вот и он, кстати:
Потом было несколько вариантов ZX-Spectrum, максимальным по навороченности из которых был ATM-turbo, но это всё растянулось по времени на несколько лет. ATM-turbo я себе смог позволить только уже когда учился на втором курсе (сэкономил 10 стипендий, чтобы купить радиодетали). По образованию, я, кстати, химик-технолог, и я очень рад, что в свое время не пошел учиться на программиста — академическая модель обучения, на мой взгляд, вырабатывает у учащегося жесткое отвращение к получению знаний в этой области.
Несмотря на то, что сейчас игры типа Lode Runner выглядят примитивными, когда-то они таковыми не являлись. И автору оригинала (насколько мне известно его зовут А.Марков) приходилось не так легко как мне с моим клонированием. В то время разработка велась совсем не такими методами как сейчас. Это станет понятно, если мы просто вспомним технические характеристики того же самого БК-0010.
Процессор: К1801ВМ1 (щестнадцатиразрядный) с тактовой частотой 3 МГц
ОЗУ: 16 килобайт
Видеопамять: 16 килобайт (на деле отдельной видеопамяти раньше не было — это часть того же самого ОЗУ, которая постоянно выводилось на монитор)
ПЗУ: 32 килобайта (тут были Бейсик или Фокал, а также всякие системные функции)
Устройство хранения информации: бытовой магнитофон и кассеты (скорость загрузки примерно 10 килобайт в минуту)
Устройство отображения: телевизор (в редких случаях монитор)
Визуально БК-0010 представлял из себя толстую клавиатуру, внутри которой находилось сразу всё.
Стоимость составляла 650 рублей (при зарплате инженера в 120 рублей, фрезеровщика в 200 рублей, а начальника в 300 рублей)
Я сам на этом БК-0010 никогда не программировал (он был слишком дорогой да и, на мой взгляд, не идеальный), но, по сути, я начинал примерно в то же время. И, я понимаю, что тогда разработчику нужно было, ох, как постараться, чтобы создать на таком железе и, самое главное, с имеющимися программными инструментами, что-то стоящее. Да и сам процессор физически был очень слаб — программист обычно считал такты, за которые выполняется та или иная команда, чтобы оптимизировать код. По-моему, на БК-0010 были еще и какие-то проблемы с ассемблером, так как один мой знакомый программировал на БК-0010 просто "в кодах". На деле, это значит, что забиваешь память цифрами, которые что-то значат для процессора, но визуально мало о чем говорят человеку. (Я этим в начале, кстати, тоже занимался, пока не узнал, что такое ассемблер и не набрал его ручками в виде списка байтов из одного журнала). Например, число 06 означало для процессора команду копирования содержимого регистра B в регистр A, что можно было записать на ассемблере в более понятном человеку виде как MOV A,B (для процессора КР580ВА80) или LD A,B (для процессора Z-80). Но это еще кое-как можно было запомнить, но дела с переходами по адресам обстояли еще хуже. При программировании в кодах нужно вписывать прямой адрес или смещение от текущего адреса до того, куда программа должна перескочить. А если приходилось вставлять в код изменения, то адреса сдвигались и надо было все адреса переходов расставлять заново. Некоторые для этих целей вставляли в код множество команд ассемблера NOP (код 00), которая просто ничего не делает — такие команды потом можно было заменить на что-то другое не трогая адреса.
Рисовать графику, кстати, тоже было негде. Я, например, в то время отмечал карандашом точки на миллиметровке, а потом переводил эти точки в байты и эти байты вводил в компьютер ручками. И не думаю, что у автора оригинального Lode Runner-а были какие-то сильно отличающиеся от моих возможности.
Я всё это к тому, что меня всегда удивляло часто пренебрежительное отношение к этим старым играм. Делать всё это было крайне сложно, и не у кого было спросить совета, так как разбирались в этом единицы, а Интернета тогда еще даже в планах не было. Единственный плюс, который, на мой взгляд, тогда присутствовал — это интерес к этой работе со стороны игроков. Людей с компьютерами было мало, но они были, скажем так, благодарными пользователями — появление новой игры вызывало интерес и игра быстро расходилась по тем же салонам компьютерных игр. И я не помню, чтобы кто-то когда-то говорил гадости на тему «какая отстойная игра» или что-то в этом духе. Короче, не было перенасыщения рынка, которое есть сейчас, что лично для меня всегда ставило под сомнение необходимость в создании новых игр. Ведь в реальности все существующие сейчас игры даже пересмотреть невозможно, не то что переиграть.
Также я не уверен, что раньше создание игр приносило какую-то ощутимую прибыль их создателям — думаю, что это было чистое творчество, которое сейчас, практически, уничтожено коммерческими отношениями в обществе. Тихо сдохли и радиолюбительство и интерес к муз.школе и вообще всё, что предполагает занятия чем-то не ради чистой прибыли.
Закончить я хотел бы словами благодарности в адрес разработчиков той эпохи (речь шла про отрезок времени: конец 80x — начало 90х). А также лично в адрес тов. Маркова, с которым я не знаком, но тем не менее его игра произвела на меня в возрасте 13-14 лет большое впечатление. Как не крути, именно эти энтузиасты стояли у истоков российского игростроя. Но главное, они зародили интерес к теме программирования у тех, кто «шел следом за ними». И я, в отличии от многих, понимаю, сколько это тогда требовало сил и терпения.
Благодарю за внимание!
Алексей Седов
Автор: Седов Алексей Павлович