|
Идея написать эту игру возникла в моём воспалённом мозгу очень давно. В то время как раз появилась игра Мортал Комбат на целую дискету. Все наверное помнят там маленьких таких человечков, которые умели делать комбы, фаталити и другую хрень. Одновременно с этим, ну может чуть раньше, ко мне в лапы попалось чьё-то фидошное произведение под названием "9600 бод и все, все, все…" В рассказике есть такой интересный момент, когда Кенга и её отпрыск соревнуются на время, выделяя клавишей Insert файлы в Norton Commander. Не знаю, что на меня тогда нашло, но во время какой-то пьянки я в шутку сказал что "сделаю ващще щас игру Нортон Комбат!!!". Идея была проста как всё гениальное: два игрока на время должны пометить файлы в панелях коммандера стилизованного под Нортон. И, знаете ли, начал писать алгоритм и наброски движка, но, протрезвев, я как-то даже забыл об этом проекте на долгие годы…
Далее жизнь на Спекке сложилась таким образом, что обновляемых коммандеров осталось только два: Куик и Рил. На форуме zx.pk.ru даже сделали голосование "каким коммандером пользуются люди". Разгорелись баталии, споры и опять не понятно чем руководствуясь я вспомнил свой заброшенный проект Нортон Комбат. Мне захотелось его доделать и схлестнуть, так сказать ╚в неравной борьбе╩ двух титанов спекка-коммандеро-строения Павла и Спектра. Я кстати, болею в этой битве за Павла, т.к. пользуюсь исключительно Рилом. Итак, мозги закипели, руки зачесались, и началась работа…
В этом жанре игр, при их создании думать практически не надо – есть идея, а остальное придёт само. Короче данный экземпляр мини-дурацких-игр состоит в основном из программы обработки нажатия клавиш и вывода курсора, ну можно сюда отнести ещё и счетчик времени. Так как память задействована совсем "неплотненько" оптимизировать ничего не надо. Графики практически нет, ну есть игровой экран, стилизованный под панели Нортона.
Итак, подробнее расскажу, из чего этот кусок байтов состоит. Будем двигаться постепенно по ходу работы программы, для понятности. Ведь моя задача – научить тебя делать маленькие и простые игры, даже если до этого ты программировал только на Бэйсике.
Ну, в самом начале как обычно мы будем всё инициализировать (подпрограмма INIT). Первое что я делаю – инициализирую плэйер музыки. Если ты не знаешь, как это делается, поясняю: адрес инициализации, и адрес проигрывания тебе скажут при компиляции мелодии в музыкальном редакторе. В данном случае музыка лежит в странице ╚номер ноль╩ начиная с адреса #C000. Далее заполняем по старой привычке таблицу для отлова прерывания и копируем обработчик с места компиляции в место его работы. Про обработчик прерывания можно сказать, что он в принципе нихрена не делает кроме того как играет музыку и увеличивает игровой таймер каждые 50 прерываний на единицу. С обработчиками есть один важный момент: самое главное сохранить и восстановить ВСЕ регистры процессора. Потому что по пьяни можно что-нить забыть, а потом долго разбираться в отладчике ╚а чо оно не работает?╩.
Далее идёт следующий этап инициализации (метка INIT2). Это очень важный шаг, сынок. Без него ты нифига не поиграешь в игру по второму разу. Эта процедурка будет вызываться при каждом старте игры, и обнулять счетчик времени, выставлять курсоры игроков в "исходное положение", обнулять "спидометр" и количество выбранных файлов каждого из игроков. Далее уже идёт отчистка экрана и бордэра. Я не заморачивался с этим моментом, игра-то ведь "ниачом", и сделал всё с помощью всяких LDIR`ов. Ещё я там текст выводил, типа ╚мы с гордостью представляем и бла, бла, бла…╩. Тоже особо не думал. Процедуру печати я взял из уже готового проекта Noter1.5. Там у меня матрица символа 6*6 пикселей. Потом, значит, ждём нажатия любой клавиши и распаковываем игровую заставку прямо в экран. Тут особая скорость не нужна. Вот в принципе и вся инициализация.
И тут начинается самое интересное – главный игровой цикл (метка START2). На всякий случай я ещё раз обнуляю счетчик времени, ведь он уже хрен знает, сколько прерываний там насчитал, пока игроки читали предысторию, пока экран распаковывался. Ну, вот значит, задумаемся, сынок, что же нам надо делать в ГЛАВНОМ ИГРОВОМ ЦИКЛЕ? Да практически ничо. Ну, проверить ╚а не выиграл кто-нить из игроков уже?╩, опросить клавиши управления и напечатать курсоры игроков. Ну, есть там ещё процедура печати спидометра и таймера, но это фигня, как и вся игра, впрочем. Опрос клавиатуры (метки PLAYER1 и PLAYER2) я решил сделать по полурядам Sinclair1 и Sinclair2 чтобы не ибаццо. Хотелось, конечно, сделать redefine keys, но мне было лень. Опрос короче простейший: влево, вправо, вверх, вниз и пометка для каждого игрока.
Для стирания курсоров в старых координатах и печати в новых используется одна и та же процедура CURSOR_PRINT, которая в качестве входных данных хочет видеть координаты и цвет курсора. Соображаешь? Когда печатаем курсор, даём ей один цвет, когда стираем, даём на съедение процедуре цвет фоновой картинки. Вот и всё.
Процедура печати "спидометра" ваще до боли в глазах простая (метка SCALE_PRINT). Выводит полосочки, количество которых зависит от скорости нажатия кнопки "пометка файла". Максимальное число полосочек на всякий случай запоминается, чтобы потом порадовать игрока, что он типа "разогнался до #3F скорости". Почему #3F? Да потому что мне лень было искать процедуру, которая пересчитывает число в десятичное. А с шеснадцетиричными, как ты знаешь, всё просто: берёшь половинку числа (4 бита) прибавляешь 48 и получаешь код символа для печати, затем печатаешь и повторяешь всю процедуру для второй половинки байта.
Для печати таймера (метка PRINT_TIME) используется всё та же процедура печати, что и раньше. Только текст я формирую динамически, т.е. записываю код символа в текст, а затем уже печатаю.
Вот собственно и весь код. Ну, только когда кто-то из игроков выиграет нужно вывести сообщение "гейм оувэр" и заново инициализировать и запустить игровой цикл. У меня была идея сделать сохранение таблицы рекордов на диск, но просто было лень…
Пришло время для оформления. Ну, с музыкой я справился легко. Особо не заморачивался и написал такой прикольный бит с простенькой темой. Игровой экран много времени не занял, но тут я проявил смекалку и вместо имён файлов написал имена сценеров, которых вспомнил, а вместо расширений файлов написал сокращения названий команд этих самых сценеров. Там даже повторы были какие-то, но это не важно, ведь и "файлы" есть и приветы как будто передал. Заставку "гейм оувэра" я решил украсить вовремя-подвернувшейся конверченой фотографией моей жены в интересном ракурсе. Загрузочной картинкой стал скриншот FAR manager`a с PC. Ну я его повернул там в перспективе чуть-чуть и подрисовал слегка.
Затем осталось только скомпилить, запаковать и слинковать, в чём мне сильно помогли модуль SAVEBAS.H, Hrust и Рил Коммандер.
Вот собстно и всё. Как видишь из простой идеи можно сделать интересную вещь. По отзывам людей игравших в неё я понял, что клавиатур поломано не мало, а это говорит только о том, что в игры играют и их надо делать и делать.
Можно, например, сделать Нортон Комбат 2, доделав то, что мне было лень. Можно добавить какие-нить фичи типа заданий на выделение файлов определённого расширения, которые разбросаны по панелям в случайном порядке. Добавить междууровневые картинки, несколько музычек. Короче прогресс неостановим главное не лениться и реализовывать даже свои самые бредовые идеи.
Скачать исходники этой игры можно здесь
|