Перечитал вот это предложение. Теперь я понял, как надо делать. Надо обеспечить программисту выбор:
- использовать только стандартную графику
- дополнительно к стандартной графике изображать ГГ без клешинга, используя дополнительный слой и режим 2 цвета + маска
- переделать спрайты для 3 цветов + прозрачный
- дополнительно к стандартной графике изображать ГГ с помощью блиттера и спрайтов 8 бит на точку
- все изображать с помощью блиттера и спрайтов 8 бит на точку.
Эмулятор или FPGA с частотой развертки TV читает из слоя номер 0 стандартные пикселы и атрибуты и вычисляет номера цветов 8 точек. Если режим новый, то читает ГОТОВЫЕ 8 точек из слоя 0. Затем читает ГОТОВЫЕ цвета 8 точек из слоя 1. Складывает их с учетом прозрачного цвета и записывет 8 номеров цвета в буфер экрана. Когда надо вывести на экран изображение эмулятор или FPGA читает ГОТОВУЮ картинку из буфера экрана и выводит на монитор с частотой 60 Гц.
Слой 0 можно выбрать со стандартной графикой или другой, подходящий для конкретной задачи режим графики. Имея слой 1 мы сможем продолжить работу над блиттером, который ускорит копирование спрайтов в эту же область 256х192 по 1 байту на точку. Так мы постепенно сможем добавлять новые возможности.
Дополнительный слой номер 1 для режимов 2-4 цвета на спрайт - это область памяти размером 256х192 точек. Цвет каждой точки определяется одним байтом. Поэтому мы можем накладывать сверху спрайты программным способом, используя прозрачный цвет. Видеокарта уже начинает выполнять часть работы за Z80. По двум байтам данных и атрибуту вычисляет цвета восьми точек. Далее, если точка не прозрачная, номер цвета записывается в слой номер 1.
То есть в эмулятор надо добавить слой 1, написать процедуру записи 8 точек в слой 1, когда программа записывает по два байта в адрес пикселов на экране.
Последний раз редактировалось zx-kit; 24.08.2015 в 06:01.
"L-256"
Да с чего же она это вот прям ДОЛЖНА? Не ЮЛА, небось. Пусть как хочет, так и делает одинаковую.
Это как - и код оттуда же выполнять??
Да чем проще-то. Только расточительнее - номера в палитре к спрайтам привязывать.
И при чём тут видеорежимы и совместимость?! "вывести с нужной частотой развертки" - это дело кадрового конвертера, какой может быть вообще отдельным девайсом и никак не управляться видеокартой, а работать тупо по сигналу видеовыхода. Хотя может быть и отдельным блоком видеокарты - не суть важно, для софта не должно быть разницы никакой. И не путай разные буфера (для конвертера, кстати, нужно целых ТРИ своих отдельных буфера, вроде как)
Ну и каша... буфер (видеорежима, а не конвертера) заполняется не "режимом", а контроллером записи в видеопамять по состоянию сигналов системной шины. И все записи в обычную память Спека (в том числе в адреса стандартной экранной области) тоже через эту шину проходят. Так что можно просто следить за шиной и заполнять видеобуфер одновременно, обеспечивая совпадение картинки для совместимости. Или только части картинки - что и обеспечивает возможность легкой постепенной переделки софта.
---------- Post added at 08:14 ---------- Previous post was at 08:08 ----------
А я предлагаю не плодить кучу ограниченных убогих режимов, а подумать, как их сделать числом поменьше, но универсальнее и мощнее. Для игрушек, как уже указывал в прошлый раз - взять битмап максимального размера (в рамках развёртки) с максимальной глубиной цвета, без слоёв, и для совместимости с чем угодно - блок трансляции адресов и данных (вот его устройство надо продумать!); и блиттеру с одним режимом проще работать.
---------- Post added at 08:18 ---------- Previous post was at 08:14 ----------
Нет, не так - даже это слишком жёсткие варианты. И конечно же, не надо разных слоёв, это нерациональный расход памяти и пропускной способности шины карты. Лучше - однослойный тупой битмап, но с хитрым и ускоренным доступом. Эх, нету времени сейчас подробно расписывать, и не знаю, когда снова буду на форуме
Прихожу без разрешения, сею смерть и разрушение...
Слои графики в видеокарте "Meteor Graphics"
Во многих играх есть неподвижный или медленно меняющийся фон и несколько движущихся объектов. Разделение графики в видеокарте "Meteor Graphics" на слои упрощает и ускоряет построение изображений в играх.
Слой 0 обычно закрашивается полноэкранным рисунком или изображение строится из небольших фрагментов - тайлов. В слой 1 помещаются изображения движущихся объектов - спрайтов. Размещение тайлов и спрайтов в разных слоях экономит время, которое потребовалось бы на восстановление затертого фона при движении объектов.
Для создания движения спрайтов каждый цикл игры участки слоя 1, занимаемые в данный момент спрайтами очищаются - заполняются прямоугольниками с номером цвета, который соответствует прозрачному. Затем спрайты рисуются по новым координатам.
При выводе на телевизор/монитор несколько слоев складываются с учетом прозрачного цвета. Если в слое с большим номером точка прозрачная, то сквозь нее будет видна точка со слоя с меньшим номером. Если во всех слоях точки прозрачные, то сквозь них виден цвет back_color.
Преобразование данных в номера 8 точек для различных режимов (эту работу выполняет видеокарта)
В стандартном режиме цвета ZX SPECTRUMа цвета 8 точек, видимых на экране, зависят от байта пикселов, байта атрибутов и сигнала FLASH, который предназначен для мигания курсора. При изменении любого из трех могут измениться цвета 8 точек. Поэтому стандартный режим нельзя сразу преобразовать в 8 номеров цветов. Преобразование происходит синхронно с частотой кадров телевизора, равной 50 Гц. При этом полученные 8 номеров цветов используются вместо цветов из слоя 0.
В дополнительный режимах цвета данные о номерах цветов 8 точек вычисляются сразу после записи одного или нескольких байтов в область пикселов экрана. Для вычисления используется параметр attribute. Полученные 8 байтов записываются в соответствующий слой.
Последний раз редактировалось zx-kit; 26.08.2015 в 05:29.
"L-256"
Что-то подумал я про переделку Саботера 2 под Метеор, и грустно мне стало... Лучшее, что я смогу там сделать - это "неСпектрумовское" синее небо в слое фона и перекрашенные тайлы переднего фона. А почему? А потому что в Саботере 5 слоев графики, из них 4 с маской. Вот так вот
Для начала не обязательно менять цвета - можно сначала устранить клешинг с одновременным ускорением вывода спрайтов. А как, в двух словах, эти 5 слоев графики выводятся на экран в игре?
Для их вывода подходит новый режим цвета: 2 цвета + маска. Этот режим позволит просто накидать 4-5 слоев графики в слой 1 видеокарты. Маска задает контуры/форму спрайта. Если точка вне контура, то считается прозрачной. Прозрачные точки не записываются в область графики 1 слоя. Остается тот цвет точки, который был записан до этого. В результате получим наложение нескольких слоев без клешинга. А в слое 0 можно расположить тайлы фона, которые рисуются в стандартном режиме цвета.
Последний раз редактировалось zx-kit; 26.08.2015 в 05:46.
"L-256"
В буфер знакоместа копируется тайл фона с атрибутом. На него накладываются по маске по очереди тайлы ГГ, Охранника-1, Охранника-2, переднего плана. INK и PAPER знакоместа определяются хитрой логикой (каждый слой начиная с ГГ и заканчивая передним планом могут поменять атрибут в буфере). Потом буфер знакоместа копируется в экранную область.
А с Метеором мне непонятно как в один слой его спрайтов вывести 4 слоя (ГГ, охранники, передний фон), да еще и с маской.
V6Z80P - Back for Good
Для начала это хотя бы видится реальным. У меня в планах есть переделка игры под TS-Conf, я немного думал на эту тему. Там тоже гемора будет прилично, но в целом это сделать можно.
Для Саботера идеально было бы простое наличие 5 тайловых слоев - тогда переделки минимум. Но Саботер - не единственный тип игр с точки зрения графического движка.
С Метеором все намного проще. Тайлы фона, ГГ, Охранника-1, Охранника-2 и переднего плана можно записывать сразу в слой 0 или 1.
Для каждого объекта:
1. Записать цвета INK и PAPER объекта в переменную attrubute.
2. В HL записать адрес верхнего байта в знакоместе в экранной области.
3. Выполнить восемь циклов:
- загрузить в A байт пикселов
- записать A по адресу в HL
- загрузить в A байт маски
- записать A по адресу в HL
- вычислить следующие адреса пикселов и маски в области тайлов
- перейти к следующему адресу пикселов на экране (INC H).
И все. Видеокарта сама наложит по маске 5 слоев графики Saboteur2 Meteor version !
---------- Post added at 07:58 ---------- Previous post was at 06:45 ----------
Можно подумать и об увеличении слоев. Слой 0 для стандартной графики и слои 1-5 для дополнительной.
3F00 layer0 - режим слоя 0: 0 = off, 1 = on (стандартный режим ZX Spectrum-a)
3F01 layer1 - режим слоя 1: 0 = off, 1 = on
3F02 layer2 - режим слоя 2: 0 = off, 1 = on
3F03 layer3 - режим слоя 3: 0 = off, 1 = on
3F04 layer4 - режим слоя 4: 0 = off, 1 = on
3F05 layer5 - режим слоя 5: 0 = off, 1 = on
Последний раз редактировалось zx-kit; 27.08.2015 в 06:06.
"L-256"
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)