Цитата:
Сообщение от
Alex Rider
А как карта будет понимать, что отрисовка слоя закончена, и следующая запись в память - это уже отрисовка следующего кадра? Например, в Саботере достаточно один раз при входе на экран нарисовать задний и передний слой, а в промежуточном слое персонажей графику надо отрисовывать постоянно.
Статические слои можно нарисовать однократно, а потом не трогать. Если для движущихся объектов используются два слоя по-очереди, то надо с помощью переменной current_layer выбирать слой, в котором рисовать. Обычно это делают по сигналу INT. Сначала распределить слои и подобрать удобные режимы цвета для каждого слоя. Допустим для спрайтов выбраны два слоя 2 и 3. Один из них включаем, другой выключаем.
layer0 = 1 ; задний фон (стены) включен, режим "стандартной графики ZX Spectrum-a"
layer8 = 1 ; передний фон (ящики) включен, режим "2 цвета на тайл/спрайт + маска"
layer2 = 1 ; слой спрайтов включен (отображается текущий кадр), режим "2 цвета на тайл/спрайт + маска"
layer3 = 0 ; слой спрайтов выключен (на нем рисуется очередной кадр), режим "2 цвета на тайл/спрайт + маска"
current_layer = 3
Каждый кадр после INT меняем состояние включения 2 и 3 слоев и рисуем следующий кадр на том слое, который выключим:
layer2 = 0 ; слой спрайтов выключен (на нем рисуется очередной кадр)
layer3 = 1 ; слой спрайтов включен (отображается текущий кадр)
current_layer = 2
Перед рисование новых спрайтов стереть старые в режиме цвета color_mode = COLOR1C, attribute = 0.
Цитата:
А еще все же интересно как надо будет переделывать графику. Я опять на примере Саботера (потому что других игр пока не знаю).
В Саботере фактически 4 способа хранения графики:
1. Задний фон - тайлы со стандартными атрибутами (9 байт) - выводятся "как есть", но их атрибуты могут быть запросто изменены (комната бессмертия - стены и вещество в ящике, искры на ограде). В почти таком же формате хранятся изображения предметов в ящиках и в руках ГГ.
1 вариант. Используем слой 0 и рисуем в стандартном режиме ZX Spectrum-a:
current_layer = 0. Дальше записываем атрибут в область атрибутов экрана и 8 байтов пикселов в область пикселов экрана.
2 вариант. Используем слой 1 и рисуем в режиме графики "2 цвета на тайл/спрайт":
current_layer = 1, color_mode = COLOR2. Дальше записываем атрибут в переменную attribute и 8 байтов пикселов в область пикселов экрана.
Цитата:
2. Спрайты персонажей - всегда монохромные, тайлы спрайтов хранятся по 16 байт (растр + маска), рисуются как правило черным цветом (но иногда цвет ГГ меняется, например, после телепорта или при ударе током, огонь из огнемета охранника, белое метательное оружие на фоне неба).
Используем слой 2 или 3 и рисуем в режиме графики "2 цвета на тайл/спрайт + маска":
current_layer = 2 или 3, color_mode = COLOR2M. Раз цвета могут меняться, записываем этот цвет в переменную attribute и 16 байтов пикселов в область пикселов экрана, парами байт пикселов, байт маски.
Цитата:
3. Спрайты переднего фона - имеют растр, маску и атрибуты (17 байт), тоже могут быть перекрашены (консоль, например, когда на ее ГГ попадает).
Используем слой 8 и рисуем в режиме графики "2 цвета на тайл/спрайт + маска":
current_layer = 8, color_mode = COLOR2M. Раз цвета могут меняться, записываем этот цвет в переменную attribute и 16 байтов пикселов в область пикселов экрана, парами байт пикселов, байт маски.
Цитата:
4. Фонт - стандартный формат по 8 байт на символ без атрибутов, раскрашивается при выводе (может быть отрисован как тайлы переднего слоя).
Используем слой 8 и рисуем в режиме графики "2 цвета на тайл/спрайт":
current_layer = 8, color_mode = COLOR2. Раз цвета могут меняться, записываем этот цвет в переменную attribute и 8 байтов пикселов в область пикселов экрана.
Цитата:
zst, распиши, пожалуйста, как малыми усилиями переделать графику всех четырех типов? Можно ли это дело автоматизировать с тем, чтобы вначале получить точно так же раскрашеную графику, но без клешинга? Как управлять цветами отрисовки в игре?
Вроде расписал. Перед рисованием очередного тайла/спрайта нужно выбрать текущие цвета точек с помощью переменной attribute. В режимах "2 цвета" и "2 цвета + маска" он точно такой же, как и атрибут в стандартной графике ZX Spectrum-а. Цвет можно менять перед рисованием каждого знакоместа или только тогда, когда надо поменять цвет. То есть при отображении объектов одного цвета, например, всех ящиков или текста можно один раз выбрать цвет, а затем рисовать только пикселы ящиков или текста.
Если требуются еще объяснения для полной ясности деталей новых видеорежимов - спрашивай.
В первый пост добавил ссылки на текущее описание параметров видеокарты "Meteor Graphics".