Нашёл на компе эмуль.
Решил переписать уже готовую знакомую игру.
Выбор пал на contra с приставки nes.
Скачал старую любимую книгу "Как написать игру на ассемблере".
Нашёл и скачал Gens4.
Запустил на эмуле, попробовал пример из книги.
Таак.. Штудировать раздел о Gens`е
Охх! Как мы раньше это делали?! Транслятор крайне неудобен.
Начал придумывать выход.
#define
ход мыслей и решение:
Вспомнилось как приходилось большой листинг компилировать.
Кодинг на бумаге, выгрузки/подгрузки, кривой магнитофон.
Нехватка памяти для листинга на zx.
Может писать на ПК и готовую программу "запихивать" в эмуль?
плюсы: память только для кода, пиши хоть 20к строк
минусы: не олдфажно(ну и по барабану)
Нужен транслятор асма для ПК!
#endif
GO_TO яндекс.
НИЧЕГО!
А если написать свой? Не сложно ведь(наверное)?
Решено.
На чём писать? А что у меня есть? VS12 стоит. Ну попробуем.
Так, нам надо окно, но ведь я никогда оконные не пробовал на студии!
Всё винапишкой шлёпал главное окно, а графика уже своя..
GO_TO яндекс по статьям об GUI.
Дотнет, дотнет, изврат, ещё какие-то библиотеки.(Почему мне дотнет не нравится?)
О! Ведь есть MFC, она от дотнета не зависит. Но я её не знаю..
GO_TO яндекс.
Чтение уроков и пробы примеров.
Тааак.. Слишком много проблем себе придумываю.
Есть ведь Borland с++ builder. Он как раз подходит и я с ним знаком.
Итак, список всех команд z80 в закладки, он пригодится не раз.
4 дня спустя.
Что-то уже работает! Убогий редактор, но делает то, что пока мне требовалось.
Открывает листинг, сохраняет, транслирует, сохраняет в байткод.
А как этот байткод в спек-то засунуть?
Нашёл первый попавшийся эмуль с возможностью загрузки блока кода прямо в память.
Пробуем писать. Сделаем что-то тестовое. Скопипастил пример из книги. Компилится и работает на эмуле. Отлично.
Попробуем ещё один. Не работает.. Баги в трансляторе.
Борьба с метками, неправильно работающими командами, добавление новых багов.
Колдовство с двухпроходностью и ещё не определёнными в коде метками.
Вот. Работает!
Как же быть со спрайтами?
Прилепил небольшую доделку для компилятора для перевода BMP в блоки DEFB.
Нагуглил полный скрин первого уровня из контры, разобрался со структурой, нарезал тайлов.
Встретил много полезных статей.
А в каком формате хранить?
GO_TO яндекс.
Чтение различного материала по спрайтам.
Итог - хранение спрайтов построчно.
Допилил работу со спрайтами в компиле и перевёл все тайлы в DEFB.
Так же нужен скроллинг уровня. Да ещё и чтоб всё быстро было.
В итоге принцип работы первой поделки:
Создан обычный теневой буффер.
Буффер заполняется первым экраном уровня.
Правый столбец знакомест на экране с чёрными атрибурами чтоб скрыть скроллинг.
Буффер скролится попиксельно влево, при надобности дописывается правый вертикальный столбец из уровня.
В небольшой буфер копируется часть экрана под спрайтами. Рисуются маски, затем спрайты.
Переброска буфера на экран и восстановление фона буфера.
Вроде работает но... Жесть как по черепашьи!
И это контра? Она ведь должна быть динамичной.
Слишком медленный горизонтальный скроллинг и нет аппаратного(
И это ещё врагов нет! А уровень то должен быть насыщен спрайтами..
Кстати! А ведь может на спеке уже есть контра?
GO_TO яндекс.
Воу, так она и вправду есть, но называется GRYZOR.
Заценим.
Крайне неиграбельно, но зато как быстро и управление хорошее. Уровни победнее, много пустого места.
Может оттого и быстро?
Но самое важное что БЫСТРО, а у меня нет.
Похоже я рано взялся за такую динамичную игру. Знаний маловато.
А возьмём что попроще. Как насчёт танчиков с денди?
Почему бы и нет. Она точно попроще, да и скроллинга уровня нет.
Несколько дней экспериментов и рабочая поделка готова.
Кто сказал проще? Проблемы снова начали проявляться. Опять тормоза.
Принцип работы поделки:
Рисуется экран без всяких буферов(зачем тратить такты на переброску уровня в экран?).
Окрашивается "шторкой" как на денди.
Для каждого спрайта создан буфер так, чтоб он туда помещался даже проскролленый.
В буффер рисуется часть уровня.
Рисуется маска и сам спрайт.
Рисуются элементы, которые должны быть поверх спрайта(кусты к примеру).
Буффер рисуется в экран.
Плюсы: Нет мерцания, пока не пересекаюстя краями два спрайтбуфера.
Но.. Всё медленно!
Надо избавиться от горизонтального скроллинга.. Я его плёхо уметь..
Сделаем так же как и ранее делали усатые дядьки с туманного альбиона.
Будем хранить уже несколько проскролленых спрайтов.
Всю игру перепишем по новой.
Написал первую пробу.
Вау! Эй, танчик, погоди так лететь, я только клавишу немного ткнул.
Похоже проблема быстрого попиксельного передвижения решена.
А норм транслятор получился, для экспериментов сгодится.
Может кому пригодится, надо поделиться. Поищем спектрумистов.
GO_TO яндекс.
Нигде не нужен. Жаль.
GO_TO яндекс снова.
О, zx-pk.ru.
Твою мать! Так для ПК есть уже трансляторы?
На порядок лучше и функциональнее моего.
Как я так искал? Ну и ладно, зато первый опыт написания подобного получил
Экспериментируем дальше.
Начинает притормаживать...
Рисование фона в буффер.
Рисование маски.
Рисование танка.
Рисование самого буффера на экран.
Уже незначительно медленнее, но всё же..
А как же быть при мерцании пересекающихся буферов?
Нет. Надо менять подход.
Где-то я встречал инфу об аппаратном переключении буфферов.
GO_TO zx-pk.ru
Точно есть такая фишка. Читаем.
Так она не работает на 48к. Ну и ладно, те у кого 48к лишатся моего мегашедевра из-за того что я не умею делать плавную картинку стандартными методами
Много чтения и подвисания спека при переключении страниц.
Почему биты порта в половине статей пронумерованы и описаны неверно?
Принцып работы поделки:
Включается банк 5, отображение банка 5
Очищается экран в 0.
Рисуется уровень.
Копируется во вторую половину банка.
Включается банк 7, отображение банка 7
Очищается экран в 0.
Рисуется уровень.
Копируется во вторую половину банка.
Включается режим переключения экранов:
5 - видимый, 7 - подключенный с C000.
7 - видимый, 5 - подключенный с C000.
Каждый кадр переключение буферов, прорисовка всегда в C000.
На каждом кадре под всеми спрайтами восстанавливается фон из второй половины банки.
Рисуются маски, рисуется спрайты.
Свап буферов.
Мерцания больше не будет!
Работает. Продолжаем экспериментровать!
PS:
Всё-таки выложу сюда свою самоделку-транслятор.
Не факт что кому-то пригодится, но попрошу протестить как вообще работает.
Очень примитивный и почти ничего нет, но компилит.
Макросов нет. Использования умножений и делений в выражениях нет. Указания повторов нет. Да вообще нифига нет.
Несколько ORG в коде не тестилось.
Запускался только на вин10.
Так же хотелось бы узнать где подробно и с примерами можно почитать про использование сменных буферов при графике в играх на ZX.
Всё что нашёл - очень скудная информация.
[свернуть]