Два года я пытался вникнуть в геймдев, и написать свою игру в стиле 3D. Это технически сложный путь, но он преодолим. Непреодолимым препятствием стала невозможность придумать игру, в которую интересно было бы играть. Красота есть, персонажи есть, физика тоже неплохая, но интересный сюжет никак не рождается.
Но ведь было же! Магия пикселей и знакомест работала, когда я писал свои первые программы на компьютере Партнёр 01.01 более 30-ти лет назад. В итоге было принято решение "вернуться к корням", поймать за хвост ту магию, которую источали текстовые компьютеры. Авось получится раскачать избалованный фреймворками мозг!
Как я собирал для этой цели компьютер РАДИО-86РК, я расскажу в следующий раз. А пока про первую игру после перерыва в три десятка лет.
86РК медленный. Пока вы не научитесь на нём программировать, он будет жутко тормозным. Архитектура компьютера такова, что работа процессора постоянно прерывается контроллером прямого доступа к памяти (ПДП), который забрасывает символы из ОЗУ в контроллер дисплея. Так процессор и ПДП делят память, когда в памяти копается ПДП, процессор простаивает.
Таймера в компьютере нет, прерываний нет, чтобы мячик летал плавно, я привязал его к частоте кадров. Дожидаемся конца кадра, и сразу же выводим на экран все нужные спрайты, главное успеть до начала следующего кадра. А частота восьмибитного процессора у нас 1,77 МГц. Но она таковой никогда не бывает из-за простоя.
Графики в 86РК тоже нет, это тру олдскульный текстовый компьютер. Тем он и интересен. Есть псевдографика. А впрочем, вот его таблица из 128 символов:
Не густо! Но ведь чем проще компьютер, тем проще для него написать игру - ну... так я тогда думал!
Из псевдографики можно выложить дисплей 128х64 псевдопикселя. С одной стороны маловато, с другой стороны такое разрешение у популярной современной любительской консоли Arduboy.
Рисовать псевдографикой то ещё удовольствие. Как это делали античные программисты с блокнотиками, представить страшно! Не в плане трудоёмкости (хотя это тоже), а в плане удержания картинки в голове. Когда я понял, что совсем не справляюсь, я написал конвертер картинок на JS, с этого момента стало возможным рисовать в Фотошопе, а затем моментально конвертировать графику в символы.
Писал я игру конечно же не на реальном железе, а в эмуляторе Emu80 Виктора Пыхонина. Писать конечно же надо на Ассемблере - это единственный способ вытянуть скорость из машин того поколения. Перебрал несколько ассемблеров, самым оптимальным и удобным оказался "Прекрасный Ассемблер".
Прежде чем нарисовать летающий мячик, нужно вывести на экран хотя бы квадратик. Для этого надо вычислить по координатам (X, Y), в какую ячейку линейной экранной памяти этот самый квадратик записать. В ассемблере i8080 нет операций умножения, значит для вычисления ячейки памяти можно использовать сложение в цикле... Но это будет медленно! А еще, чем больше координата Y, тем дольше будет работать цикл сложения.
Вспоминаем про табличное программирование! Составляем таблицу, в которой уже будет посчитан адрес ячейки экранной памяти для каждого значения Y. К этому значению добавляем координату Х, и получаем адрес ячейки памяти, в которую будем писать символ. Это я конечно упростил, чтобы не отнимать время у читателей.
Вот так уже работает быстро, и с одинаковым временем выполнения. Теперь надо заставить мячик двигаться. Но я вижу, что уже немного вас утомил, давайте отдохнем пару секунд - игра "Сквош" на маленьком автомобильном мониторе:
У мячика есть направление движения и скорость. Представить их можно, как инкремент по координатам в единицу времени. Значит каждый кадр мы просто добавляем к координатам вектор, соответствующий направлению движения мяча.
- Логично?
- Да!
- Работает?
- Нет!
Если инкремент будет равен или больше 2, то мячик начинает перепрыгивать через препятствия. Мячик сразу оказывается за границей препятствия, а его там уже не поймать! Значит сдвигать мячик можно всегда на одну позицию за кадр, но не каждый кадр.
Для этого мы вводим счётчик кадров. Делим кадры на чётные, нечётные, каждый второй кадр, и каждый четвертый кадр. И вот инкременты делаем по соответствующим подпрограммам. Хотите немного отклонить мяч, значит инкрементируем X каждый четвёртый кадр. Хотим сильно отклонить - инкрементируем X просто каждый кадр.
Это надо переварить! Давайте сейчас сделаем ещё одну остановку. Если хотите попасть в секретную группу к самым упоротым ретрофрикам, сканируйте QR-код!
Звук тоже не совсем прост на журнальном варианте РАДИО-86РК. Как я уже писал выше, ПДП регулярно останавливает процессор. А значит, если мы будем генерировать звук процессором, то звук будет хриплый и рваный.
Единственный вариант, который я смог придумать, чтобы получить годный звук - это замаскировать хрипы изменением частоты. Для этого можно вспомнить, как делается звук ударных на ZX Spectrum с помощью музыкального сопроцессора AY-8910. Сначала идёт белый шум, затем прямоугольный сигнал, затем прямоугольный сигнал затухает и снижает частоту. Так получаются довольно сочные барабаны.
Белого шума у нас нет (коричневый хрип вместо него), менять амплитуду сигнала мы не можем, а частоту можем. Таким образом делаем все звуки для сквоша: удар мяча о стену, удар об ракетку, пропуск мяча. Меняя частоты и длительность, получаем приличный набор звуков с эффектом винила.
Ещё нам надо сделать цифры с набранными в игре очками. Это спрайты из псевдографики, а преобразовать шестнадцатеричное число в десятичное можно только делением с остатком, которого в i8080 нет, а значит вычитанием в цикле. Тут оптимизировать скорость уже не получилось.
Вот с такими трудностями сталкивались наши отцы-программисты в на заре компьютерной эры. Не было графики, а значит и никакого пиксельарта родиться ещё не могло. Не было эмуляторов, а значит процесс отладки выглядел абсолютной мозголомкой. Сохранение написанного - тот ещё квест с магнитофоном или дискетками... Хотя, постойте... Я же именно так всё и делал сначала на Партнёре 01.01, а затем и на Пентагоне 128. И как-то не сильно раздражался, и даже что-то написано было, и воспоминания самые тёплые.
Н-да, странненько!
Скачиваем игру, гоняем на реальном железе, рассказываем о впечатлениях в комментариях!
Поиграть в сквош в онлайн-эмуляторе »
Скачать игру для РК »