Уууу, сынок ты решил почитать и этот текст. Значит, всё не так запущено как я думал. Тебе либо интересен я, либо гейм мэйкинг, либо Cпекк.
В общем, история этой игры непрозаична. Давным-давно я увидел забавную игру на PC, называлась она Spr!ng Weekend. Идея её проста до опупения – это доработанные пятнашки!!! Короче надо двигать фигурки по полю и составить их в том положении, в котором они стоят на подсказке. Естественно, что при старте игры фигурки перемешиваются. От уровня к уровню количество шагов для приведения картины к эталону увеличивается, как и разнообразие фигурок. Во время очередной сходки нашей команды я сказал ╚бля! игра гавно! да я щас её сделаю!╩ и даже начал прорабатывать расположение игровых объектов на экране и набрасывать алгоритмы программы. Но как обычно всё заглохло. Может быть из-за лени, может из-за навалившихся проблем. Но, так или иначе, я решил вернуться к этому проекту по нескольким причинам: - Во-первых, меня ещё не отпустило от создания Нортон Комбата.
- Во-вторых, в связи с созданием великим человеком Стасом великого форума zx.pk.ru я почувствовал силу спекковского движения.
- В-третьих, я понял что игры надо делать.
- В-четвертых, я решил вывесить на свой сайт hds.ncn.ru список всех проектов нашей команды, ну и естественно наткнулся на этот незаконченный проект.
- В-пятых у брата, который Firestarter намечалось совершеннолетие и не сделать гифт я просто не мог.
- В-шестых я всё ещё надеялся надавить на дух соперничества моего брата, чтобы он наконец доделал свою почти законченную игру CaveMaster (но мой брат просто похуист и это не помогло).
Короче всё навалилось. И опять закипели мозги и зачесались руки.
Эта игра ваще проста донельзя. Писать тут нехуй. Всё устроено на табличках. Но, тем не менее, дорогой мой я щас всё объясню. Традиционно пойдём по ходу работы программы.
Итак, сначала вызываем инициализацию (метка INIT). Включаем страничку с музыкой и инициализируем плэйер. Затем по традиции делаем табличку для перехвата прерывания. Вот и вся инициализация. Всё просто, сынок.
Дальше только игровой цикл. Так как уровней ровно 18 (это по количеству годков брата, конечно, можно было забацать и 50, но нахуйа? мы и на 13-тилетие ему делали игру, в которой 13 уровней), я решил ограничить главный игровой цикл простой командой DJNZ. Кстати был косяк в связи с этим: я метку _AGAIN поставил не там и если игрок хоть раз проигрывал уровень, то в конце игры вместо файнал-ката его ждали пустые уровни, которые сами начинались и сами заканчивались. Их количество зависело от номера уровня, на котором в последний раз игрок проиграл. Но final cut всё-таки был, но такой, знаете ли, депрессивный. Пришлось делать final release мне тогда. Но самое главное игру на день рождения я предоставил. Так, чо это я?
Игра имеет динамическую графику, поэтому решено было использовать два экрана. В тот момент когда пользователь видит кадр на другом экране уже рисуется следующтй. Дадада как в дэмках, сынок. Ну вот значит, выставляем видимым первый экран. Далее надо выставить курсор в исходное положение, обнулить количество ходов и инициализировать уровень. Тут поподробнее надо остановиться на структуре хранения игрового уровня. Уровень представляет собой две таблички: эталон (прально составленные фигуры, чтобы было с чем сравнивать), и начальное расположение (это то, что игрок увидит, когда уровень запустится). Ну, ещё надо вывести игровой экран и напечатать номер уровня. Догадайся, мой маленький друг, что за процедура печати там? Прально! Из Нотера1.5. Так так! Ты что-то ещё заметил? Почему номер уровня в хексе? Объясняю ещё раз – МНЕ ЛЕНЬ было делать перевод в десятичную систему. Затем я копирую начальное расположение фигур в буфер для последующего их восстановления. Ведь мы щас будем их двигать, перемешивать. А если игрок проиграет? Откуда мы восстановим начальное положение фигур? Прально! Из буфера!
Следующее что нужно сделать – вывести на экран фигурки, которые игрок будет двигать (метка PRINT_BIG) и фигурки с эталонным расположением (метка PRINT_SMALL). Процедуры эти в принципе идентичны. Единственная разница в том, что они вызывают разные процедуры вывода спрайтов. Тут я организовываю цикл из 19-ти шагов и вывожу фигурки одну за другой на экран. Чтобы не ибаццо я сделал две таблицы, которые содержат координаты каждой из фигурок (маленьких и больших). Представлено всё это в виде адресов экрана.
Дальше (метка MAINLP) я вывожу курсор на оба экрана (видимый и невидимый). Вообще-то я задумывал сделать просто стрелочку, которая управлялась бы мышью, но "стрелочки" я до этого я ни разу не делал, да и мыши у меня не было, когда я ваще что-то делал. Я, конечно, просил у брата процедуру опроса мыши со стрелочкой (он-то в этом сцукно, преуспел), но он естественно нихуйа не сделал. Не мог же я ему сказать "блять, для тебя же гифт делаю!", ведь тогда это не было бы сюрпризом. Да он и так в принципе догадался, что я что-то замышляю именно на его день рождения. Короче пришлось делать просто атрибутный курсор. Я мог не успеть к дню рождения.
Дальше по программе у нас опрос клавиатуры (метка KEYZ). Опять же чтобы не ибаццо я решил опрашивать Sinclair Joystick 2. Про передвижение курсора объяснять особо нечего – берём текущий адрес курсора в атрибутной области и прибавляем, отнимаем в зависимости от направления передвижения. А вот на поворотах фигурок стоит остановиться (метки CLOCKWISE и ANTICLOCKWISE). Тут значит, я проявил чудеса сообразительности, может даже, придумал новый метод программирования. Хотя хуй его знает, может всё, можно было сделать проще. Кстати количество поворотов я ограничил, а иначе было бы не интересно. Поворочал фигурки 20 раз и писец – "гейм оувэр" тебе. Короче в зависимости от координат курсора вызывается определённая процедура, которая поворачивает фигурки. Поворачивать их очень просто: берём содержимое одного байта и помещаем в другой. И так по цепочке. Адрес вызова этой волшебной процедуры берётся из ещё одной таблички. Затем для красивой анимации печатаются чуть повёрнутые фигурки, адреса для печати на экран которых лежат ещё в одной табличке. Потом меняем видимый и невидимый экран местами и фигачим фигурки уже на новые места, адреса которых берутся из ещё одной таблички.
Вот и всё! Оказывается это не так страшно – писать игры на ассемблере. Ну, потом вызывается ещё одна маленькая процедурка (метка CHECK_SCORE), которая сравнивает количество попавших на свои места фигурок с эталоном. И вот когда совпадений становится 19, уровень считается пройденным! Вот и весь игровой цикл! Тебя сынок, наверное, заинтересовало, как я нашлёпал 18 уровней? Итак, когда игра уже полностью работала, я отключил проверку на выигрыш и восстановление исходного расположения фигур. Затем сделал в ALASM`е 18 эталонов уровней, запустил игру и начал сумбурно путать фигурки, попутно записывая на листочек, куда я их там поворачиваю (чтобы солюшн потом опубликовать, сынок). Закончив перемешивать фигурки я преспокойненько зашел в STS и переписал полученное расположение фигур с дампа памяти прямо в исходник игры. Вот так. В общем, когда все 18 уровней будут пройдены игра переходит к final cut`у. Его я описывать не буду. Там и так всё ясно, да не тебе этот файнал-кат предназначался.
Короче осталось только оформление. Да-да сынок, оформление надо оставлять на потом. Сколько там спрайтов у мелкомягкого оригинала я считать не стал. Нахуйа мне нужны эти цветочки, жучки и лягушки? Мы ведь на Спекке! И я решил сделать 10 спрайтов на спекковскую тематику. Игровой экран нарисовать вообще не составило никаких проблем. Осталась музыка, а свою я написать не успевал. Пришлось одолжить у KYV^3umf. Но для final cut`а я написал музон сам, хотя это был уже пост-пати-релиз. Загрузочный скрин быстренько накидал на PC и сконвертил на ZX.
Вот и вся игра. А ты боялся. Простая идея, позаимствованная у мелкомягких и получается интересная игрулька. В неё многие играли. Некоторые люди даже выиграли. И это знаете ли просто здорово! Здорово когда в сделанные тобой игры играют!
Ты можешь сделать такую сам! Пусть она называется Spr!ng Weekend. Только реализуй все, что не сделал я. Управление мышью, различное количество возможных ходов, уровней понаделай много, музыки понавтыкай ещё. Главное не ленись и не бойся что-либо начинать!
Скачать исходники этой игры ты можешь здесь
|