Важная информация
  • "Диспетчер" - игра для Speccy с нуля

    Автор: Cергей Cтариков (megozavr)

    Когда мне пришла идея "сотворить" игру для "Speccy"? Можно сказать, что очень давно. На самом деле, идеи всегда "томились" в голове и ждали своего часа. Где-то в мыслях, я уже "зарелизил" кучу игр в версиях для Спектрума: от текстового квеста до гонок уровня NFS, от малоизвестных аркад до хитов c PC. Мне всегда было интересно, а как бы выглядела, например, Tomb Raider для ZX или какой-нибудь God of War. Но мысли мыслями, а нужно было создать, что-то осязаемое. Имперские амбиции я выдвигать не стал и хотел попробовать для начала, что-то несложное, но интересное.

    Я переиграл на планшете в массу разных головоломок и понял, что хочу сделать игру именно этого жанра. Пришло время вернуть "должок" любимому "Спекки", за всё то время, что я получал от него в виде игр, музыки и программ. Пусть настоящего Спектрума у меня уже нет, но он получил постоянную прописку в виде эмулятора на планшете, где и занимает почетное место среди установленных приложений.

    Итак, набравшись вдохновения, смелости и храбрости, я приступил к реализации проекта. У меня уже были первоначальные наброски будущей игры, в виде разрисованных в тетрадке нескольких листов. Сюжет занимал... нет он нисколько не занимал, ни одной строчки. Да и какой сюжет у головоломки? Большая часть этих страниц, это варианты исполнения уровня, да всякого рода "фишки" этой игры. Эскизы конечно напоминают творения безумного художника, но именно с этого всё начиналось.



    Черновики. Если внимательно приглядеться, можно увидеть наброски уровней... а можно и не увидеть.


    Задача игры, в общем-то простая. Есть грузовик (в единственном экземпляре) и есть элементы, обозначенные буквой Р (зона разгрузки) . Необходимо с помощью стрелок, проложить маршрут так, чтобы грузовик коснулся каждый такой элемент. Профит достигался путем рационального маршрута и отсутствием глупости при его прокладке. Ну что сказать... очень даже концептуально.

    Что нужно для успешного воплощения своих фантазий? Ну конечно же набор инструментов, а точнее программ, в которых и будет создаваться мой скромный "шедевр". Для начала нужно было определиться с ассемблером. Помниться в далеких 2000-х, ещё на реальном Спектруме, я пытался начинать "кодить" в программе Alasm, нахваленной одним знакомым спектрумистом (у которого я в то время покупал дискеты с играми... вкладывался, так сказать в развитие индустрии), но тогда дальше запуска и просмотра готовых листингов дело не пошло. Можно было и сейчас, загрузить через эмулятор этот ассемблер и работать в нём, но становиться таким "хардкорным" кодером у меня не было желания. Поэтому я стал подбирать современные средства разработки.

    Нахваленный SjASMPlus отказался со мной "дружить", причем дважды, за что и был "удостоен чести" ликвидации через корзину. Но замена быстро нашлась и моим новым "другом" стал эмулятор ZX Spin, со встроенным ассемблером. Я быстро оценил удобство работы и запуска готового кода, парой щелчков мышки. Конечно, периодически он испытывал мои нервы на прочность: то выясняется, что он складывать не умеет, то записи чисел в шестнадцатеричном виде ему не нравятся, а то и вовсе выдавал сообщения, которые я даже "загуглить" не смог.

    Разобравшись со средой разработки, я приступил к первым шагам в написании своего кода. Здесь стоит упомянуть книги, по которым я изучал программирование: "Как написать игру на ассемблере для ZX-SPECTRUM", авторов А. Евдокимова и братьев Капульцевичей; "Как написать игру для ZX-SPECTRUM" Д. Коулдвелла, ну и, разуметься, Инфорком, со своим бестселлером "Программирование в машинных кодах". Именно этот костяк литературы продвигал мой проект вперед. Конечно, не забывал и про форум "Speccy - наш выбор", где мне давали дельные советы.

    Набрав свои первые строчки кода из книг, я понял, что у меня получается и воодушевлённый успехом начал думать дальше. Варианта два: продолжать шаг за шагом изучать литературу, приемы, набивать простенькие программки, разбираясь как они работают (и в таком случае свою игру, я напишу через пару десятилетий, если ещё останется вдохновение) или "с места в карьер" - начать разработку самой игры. Решено! Используя процедуры из книг, где-то придумывая свои, изучая по ходу сам ассемблер, буду воплощать свой проект в жизнь. Определив глобальную стратегию развития проекта, я перешел к тактическим операциям, первая из которых была графическая.

    Для начала, я скачал несколько графических редакторов. Один из них был ZX-Paintbrush. Редактор сразу мне понравился - удобный и многофункциональный, за что сходу стал новым компаньоном моей команды (другие конкуренты отправились маршрутом SjASMPlus-a).

    Изначально, у меня была безумная идея "слямзить" часть графики (ландшафта) с одной известной игры. Но не наказание в виде авторского права, а понимание, что лучше сделать свое, остановило меня. Определив для себя, что каждый спрайт будет размером 3*3 знакоместа, я обрадовавшись начал "творить". Вернее, пытаться. Это по началу я думал, что 9 знакомест, дадут мне безграничный полет фантазии в рисовании спрайта. На деле грузовик, который я пытался изобразить, больше был похож на коробку с квадратными колесами. В общем, изобразить спрайт и сделать его красивым, да еще и в небольшом разрешении, задача очень даже непростая. Это действительно искусство - рисовать для Спектрума. Ну а мне, в отсутствие таланта художника, приходилось методом проб и ошибок, постепенно "вытачивать" графический образ своей игры...



    Первоначальные наброски дизайна игры. Что делает грузовик на лунной поверхности... история умалчивает.

    Наконец, через некоторое время, мне удалось нарисовать спрайты грузовика в 4-х направлениях, а также другие элементы дизайна игры. Минимализм сегодня в моде, успокаивал я себя, глядя на наброски уровней в графическом редакторе. Оставалось теперь всё это "поженить" с программным кодом.

    Вывод спрайтов не стал для меня большой проблемой. Готовую процедуру я взял из книги и практически без переделок "пристроил" её в свой код. Вообще, на первых порах, я старался почаще "тянуть" готовые процедуры из книжек, оставляя на своей совести, лишь связать всё это воедино, чтобы они работали, как единый механизм. Безусловно, что-то и самому приходилось "изобретать", но там, где можно было взять готовое, я брал не заморачиваясь. В приоритете было написание игры, а не программирование (хотя к концу проекта, я таки немного поднял свой уровень: от - ничего не понимаю, до - ага, можно сделать так).

    Уровни в самом коде, я представил в виде массива, используя индексный регистр. Через него же, происходила "распечатка" уровня. Да, мне говорили про такты, байты и нежелательном участии этого регистра для вывода графики. Но благо у меня не аркада про очередные похождения "Диззика", да ещё и в честном 3-д, а скромный вывод нескольких спрайтов на экран, поэтому падения fps игре не грозило. Сделав пару пробных запусков, я убедился, что все работает как надо. Мой "движок" довольно бодро отрисовывал уровень и это не могло не радовать. Я решил ограничиться десятком уровней (а остальные выпустить аддоном за дополнительную плату), поскольку вдохновения на тот момент, уже оставалось наполовину.

    После, передо мной появилась новая задача - движение спрайта грузовика по экрану. Сразу вычеркнул "колхозный" вариант, когда спрайт перемещается по знакоместам. Только от вида такой "дёрганной" анимации, меня бы самого начало "передёргивать". Решение было найдено всё в той же книге Капульцевичей - процедуры скроллинга окон во всех направлениях. Действительно, не для одной бегущей строки их можно приспособить. Для моей игры, это и вовсе оказалось идеальным вариантом. Конечно, я немножко "пошаманил", чтобы процедурки работали как мне нужно и вскоре грузовичок уже "летал" по уровню на реактивной тяге. Поскольку у меня игра, не по мотивам "Форсажа", я выставил небольшую задержку, чтобы ничего не выдавало в нём медленного, тяжелого большегруза.

    Код рос с каждым днём, как курс валюты и вскоре, я даже начал блуждать по нему, словно в темном лесу с еле живым фонариком. Здорово выручали метки, по которым можно было сразу "телепортироваться" к нужному участку коду (конечно если ты помнишь какая из них тебе нужна). Вообще программировать весёлое занятие. За одним, непременно тянется другое. Написал процедуру перемещения курсора по экрану? Молодец! Похвально! Теперь напиши процедуру проверки выхода его за пределы экрана! Проверки, это вообще чуть ли не половина всего кода. Потому как проверять нужно всё, везде и всегда. Впрочем, почти как в жизни. Признаться, читабельность и наглядность кода, была не самой сильной стороной, да и комментарии я оставлял с вальяжной небрежностью, за что иногда не признавал свой код в лицо. Приятно, что Spin раскрашивал мнемоники команд и этим, скрашивал мои серые будни программиста.



    Фрагмент листинга программы. Комментарии излишни..., впрочем, как и в самом коде.

    Вообще, если рассматривать мой код как состав поезда, то: голова - это начало игры, загрузка уровней; середина — это подпрограммы печати, управления; ну а хвост это графические данные, спрайты и россыпь переменных. Но главное другое. Состав медленно, но верно, двигался к своему триумфу.

    Написав добрую половину кода, я понял, что не так страшен этот ассемблер. На деле программировать оказалось, не сложней чем на бейсике, а где-то удобней и проще. Да и программировал я, по-простому, без хитро-выдуманных алгоритмов. Основную сложность, я видел в написании процедур для вывода графики и печати спрайтов, но моя ставка на готовые варианты из книг, себя полностью оправдала. Так что могу смело сказать, что написать свою игру задача вполне посильная и интересная.

    Ближе к завершению игры, мне стало интересно, сколько же памяти она занимала. Несложный подсчёт показал, что код программы составлял... всего 4кб. Я даже немного расстроился. Думал, что уже "нашкодил" на пару десятков килобайт, а тут несолидные четыре. Ну а если серьезно, то моим прикидкам, даже если бы у меня была добрая сотня уровней и ещё куча разнообразной графики, то все равно, я бы не превысил и половину памяти 48кб "машины". А еще говорят, у Спектрума памяти мало! А ведь я при этом, абсолютно не экономил память, программируя на широкую ногу и щедро разбрасываясь байтами. Думаю, если задаться целью оптимизации, можно легко "отжать" у программного кода, еще добрый килобайт.

    Пришло время "запилить" загрузчик игры. Технологию написания, я без зазрения совести "выдрал" из книги Коулдвелла, в одной из последних глав. Далее, подобрал картинку для заставки и поработав над ней всё в том же редакторе, "прикрутил" надпись названия игры, ну и конечно про себя не забыл, скромно указав свой ник.

    Когда я уже начал "набивать" бейсик-загрузчик, меня ждал сюрприз. Я начисто забыл раскладку клавиатуры Спектрума. Единственное, что не стереть из памяти даже глубоким форматированием, это конечно LOAD "". К счастью, в ZX Spin оказалась встроенная помощь по клавиатуре и командам, для таких "забывчивых" как я. Виртуальный магнитофон, встроенный в эмулятор, позволил без особых проблем записать код игры, на виртуальную же кассету. Сразу скажу, что все "завелось" не с первого раза и даже не второго. Путем сложных математических расчетов, я таки вычислил правильный порядок записи данных на кассету и наконец сформировал рабочий образ игры.

    Наконец, настало время загрузить релиз игры в эмуляторе. Для пущего эффекта, я даже включил режим "реальной" загрузки с ленты и принялся ждать. И вот оно свершилось! Побежали полоски по бордюру, и строчка за строчкой, начала прорисовываться моя заставочная картинка. Момент безграничной радости. Как в старые добрые времена! Игра полностью загрузилась, и я смог в неё поиграть. Быстро "пробежавшись" по уровням, окончательно проверив работоспособность программы, я начал готовить инструкцию в формате PDF.

    В заключении хочу сказать. Всем, у кого есть идеи и они размышляют, получиться у них или нет, я скажу - дерзайте! Это здорово видеть, как твой проект обретает жизнь и радует не только тебя, но и остальных. Может именно Вы, создадите лучшую игру для "Speccy" прямо сейчас! Верьте в себя и успехов Вашим проектам!

    P.S. Ветка с обсуждением игры "Диспетчер" находится здесь.

    Комментарии 14 Комментарии
    1. Аватар для SKcorp.
      SKcorp. -
      А на реале-то идет?
    1. Аватар для krt17
      krt17 -
      Так то молодец конечно, но как почетный неосилятор sjasm в корзину с 1 звездой.
    1. Аватар для megozavr
      megozavr -
      На реале не знаю, самому интересно.
      krt17 в след. игру постараюсь осилить

      ps. строчка - "а остальные выпустить аддоном за доп плату..." в оригинале должна быть вот так перечеркнута, ну да ладно надеюсь все и так поняли, что я пошутил
    1. Аватар для helcril
      helcril -
      Отличная статья, мне понравилось.

      - - - Добавлено - - -

      Цитата Сообщение от megozavr Посмотреть сообщение
      На реале не знаю, самому интересно.
      krt17 в след. игру постараюсь осилить

      ps. строчка - "а остальные выпустить аддоном за доп плату..." в оригинале должна быть вот так перечеркнута, ну да ладно надеюсь все и так поняли, что я пошутил
      Мне кажется если бы написал что-то вроде "выпустить как DLC" было бы забавнее.
    1. Аватар для CityAceE
      CityAceE -
      Цитата Сообщение от megozavr Посмотреть сообщение
      в оригинале должна быть вот так перечеркнута
      Да, должна быть. Но при публикации почему-то зачёркивание исчезло, хотя ещё на предпросмотре готовой статьи оно было. Вернуть его никак не удалось.
    1. Аватар для Bedazzle
      Bedazzle -
      Отличная статья, отличная игра, отличный пример, что глупо просто сидеть сложа руки, если чешется.
      Спасибо!

      P.S.
      ещё прикольно было бы сделать из статьи сразу линки что на книги, что на форум. Ну это для тех, кто вдруг не знает, где искать.
      И ссылка на эмулятор, чтобы играть в онлайне.
    1. Аватар для kostya261
      kostya261 -
      Мотивирующая статья. Читается легко и приятно. Мне очень понравилась.
    1. Аватар для megozavr
      megozavr -
      Спасибо за коментарии и отзывы! Рад что вам понравилось
    1. Аватар для ZXFanat
      ZXFanat -
      Статье твердое Хорошо!. Пока читал, пришлось несколько раз некоторые сообщения искать на форуме о тех программах, на которые ссылался автор. Толком не нашел, в основном обрывочно. Но, да Бог с ним. Статья познавательна.
    1. Аватар для Alex Rider
      Alex Rider -
      Я бы сказал, статья на "отлично". Читается легко, в ней изложены новые (как ни странно) и интересные для меня вещи Ну не то, чтобы совсем новые, но я в очередной раз убедился, что перфекционизм - это враг проекта. Автору дважды браво: за то, что выпустил игру и за то, что поделился статьей про разработку. И да, игнорь всяких профи, обзывающихся "ниасилятором" - важнее результат здесь и сейчас, а не красивая реализация никогда!
    1. Аватар для krt17
      krt17 -
      Цитата Сообщение от Alex Rider Посмотреть сообщение
      И да, игнорь всяких профи, обзывающихся "ниасилятором" - важнее результат здесь и сейчас, а не красивая реализация никогда!
      Неосилятором я называл, я совсем не профи, кому высер то адресован? Смысл моего замечания был в излишней по мне категоричности высказывания, "я не разобрался - в мусорку". А придумать игру намного круче чем закодить ее.
    1. Аватар для tipa
      tipa -
      Цитата Сообщение от krt17 Посмотреть сообщение
      А придумать игру намного круче чем закодить ее.
      ну нинай нинай.. давным-давно я придумал игру, нарисовал спрайты, сделал даже заставки и мультипликацию в редакторе. сделал несколько разных уровней на бейсике с целью потом откомпилировать. и это и было большой ошибкой. бейсик работал медленно, программы запоролись, исходников я не писал никуда в тетрадочку..... то есть игры в общем то нет. а умел бы кодить, что-то бы осталось кроме пары полудохлых бейсик-уровней.

      по статье: мне понравилось. действительно читается легко, все понятно (даже ламеру как я). мне вообще интересно читать про любые попытки знающих и умеющих делать что-то просто и непринужденно, объясняя все простым языком.
    1. Аватар для carchip
      carchip -
      С интересом прочитал всю статью, написано все просто, и понятным языком.
      Для себя сделал вывод Если есть желание, и немного времени, то не так и страшно как кажется что-то попробовать сделать
    1. Аватар для Shadow Maker
      Shadow Maker -
      Цитата Сообщение от tipa Посмотреть сообщение
      ну нинай нинай.. давным-давно я придумал игру, нарисовал спрайты, сделал даже заставки и мультипликацию в редакторе. сделал несколько разных уровней на бейсике с целью потом откомпилировать. и это и было большой ошибкой. бейсик работал медленно, программы запоролись, исходников я не писал никуда в тетрадочку..... то есть игры в общем то нет. а умел бы кодить, что-то бы осталось кроме пары полудохлых бейсик-уровней.
      Вот не надо про бейсик. Было бы желание. Наташа Зотова, не зная ничего про спектрум ВООБЩЕ, просто сделала отличную игру Lava. http://hype.retroscene.org/blog/games/286.html