Прикладная графика 1992 г.

Интерактивная графика - "печать" аркадных атрибутов. Печать шаблонов без искажения фоновой картинки. Возможные проблемы цветовых атрибутов и борьба с "клэвингом".


2. 3. 3. Понятие об аркадных атрибутах экрана.
Интерактивная графика.

выше мы упомянули о том, что вместе с черно-белой информа-
цией по шаблону может храниться и информация о его цветовых ат-
рибутах. но можно хранить и так называемые аркадные атрибуты
для каждого знакоместа.

Что такое аркадные атрибуты? Давайте вспомним всем извест-
ную программу "Расшап". Ваш герой живет и оперирует в некотором
игровом пространстве. В одних местах он может спокойно переме-
шаться по экрану, другие части игрового поля ограничены стенами
и недоступны для него. При встрече с "монстрани" он погибает,
но иногда, если проглотит "таблетку силы", то наоборот - сан
сможет уничтожать противников. Получается так. что разные учас-
тки экрана обладают разными свойствами, стенки - непроницаемы,
монетки - собираемы, таблетки, фрукты и т. п. - съедаемы, "монс-
тры" - смертельны или уничтожаемы. Мы можем представить себе,
что каждое знакоместо экрана обладает некоторым атрибутом или
набором атрибутов, и если отдать на аркадные атрибуты экрана по
одному байту на каждое знакоместо, то всего лишь 7бв байтов
оказывается достаточным, чтобы выразить огромное многообразие
алгоритмов поведения персонажей.

Где хранить аркадные атрибуты? В ранних программах для
"Спектрума" аркадные атрибута совнешали с цветовыми. Это
достаточно простое решение. Суть его состояла в следуюшен:
программист принимал для себя некоторое соглашение типа:

все. что окрашено в черный цвет - проходимо и проницаемо.

Все. что окрашено в зеленый цвет - съедаемо.

все. что окрашено в красный цвет - смертельно.

Все. что окрашено в желтай цвет собираемо.

все. что окрашено в синий цвет - непроходимо.

все, что окрашено в пурпурный цвет - непроходимо, но раз-
рушаемо теми объектами, которые окрашены в голубой цвет (пулей,

снарядом, мечом и т. п. >.

Программа организована так. что прежде, чем выполнить пе-
чать героев и объектов на экране, проверяет, какой цветовой
атрибут установлен в данном знакоместе (а как определить адрес
в Файле атрибутов по координатам знакоместа Вы уже знаете» и
разрешает или запрещает эту печать. Она также может включить по
результатам такой проверки процедуру, которая исполнит некото -
рое специфическое действие, например, начислит очки за удачно
съеденный банан или изобразит сцену гибели "монстра", поражен-
ного лучом бластера и тоже начислит очки.

Вот мы с Вани и подошли к понятию "интерактивная графика"
Как видите, в отличие от графики иллюстративной, которая служит
как бы только приложением к программе, интерактивная графика
активно влияет на код ее работы. С одной стороны, подчиняясь
командам от управляющего устройства (клавиатуры, джойстика)
графические объекты печатаются на экране, стираются, печатаются
в новом месте, а с другой стороны, при столкновениях (коллизи-
ях) одних графических объектов с другими, включаются рабочие
процедуры программы, которые изменяют ход ее работы. так и
получается, что практически вся графика в игровых программах -
интерактивная.

"Цветовой" подход был хорош для ранних программ с очень
простой псевдографикой. Для современных программ, отличающихся
совершенной графикой и тщательно продуманными цветовыми решени-
ями. "подвешивать" на цветовые атрибуты аркадные свойства было
бы слишком грубын приемом, экран выглядел бы слишком пестро.
Возьмем программу "sceptre of Baedad". Веревка и колонна могут
быть окрашены в одинаковые цвета, но по колонне нельзя забрать-
ся наверх, а по веревке можно, это означает, что графический
шаблон "веревка" имеет во всех своих знакоместах включенным ар-
кадный атрибут "опора", а колонна - нет.

к счастью, проблема может быть решена достаточно просто.
Мы можем создать в оперативной (не в экраной) памяти Файл ар-
кадных атрибутов, структура которого соответствовала бы струк-
туре Файла экранных атрибутов, этот экран невидим, но он есть.
Когда изображение вашего героя печатается на экране вместе с
цветовыми атрибутами, одновременно с этим на невидимом "аркад-
ном" экране проверяются и "печатаются" в тех же координатах
аркадные атрибуты Вашего героя или объекта.

Какие аркадные атрибуты могут быть выбраны? это зависит
исключительно от вашей Фантазии, возьмем, например, ставший
классическим "ботинок" из програнны "Killeht Lore", мы не слу-
чайно останавливаемся на этой довольно старой программе, хотя
сейчас есть тысячи не менее достойных примеров. Дело в том.
что этим "башнаком" фирна "ULTIMATE" произвела буквально рево-
люцию в игровом программном обеспечении и открыла принципиально
новый жанр игр. к которому относятся столь любимые нашими чита-
телями аркадные адвентюры.

какими аркадными атрибутами обладает этот старый ботинок?

1. Проницаемость = о (сквозь него нельзя пройти).

2. Смертельность = о (он не убивает). >■

3. "Опора" - 1 (на него можно встать или поставить на него
другой объект).

4. Перемещаемость = 1 (его можно толкать и передвигать по
игровому полю.

5. "Съедобность" = О (он несъедобен).

6. "Транспортабельность" = 1 (его можно взять и унести с
собой, а потом выложить в другом месте). В этом смысле
он является "инвентарем".

7. "Нагия" = 1 (этот объект относится к числу тех. которые
нужно отнести к чародею и бросить в волшебный котел).

в. "Анимация" = о (ботинок стоит неподвижно в отличие от
некоторых других объектов, которые перемешаются).

Нежду делом может встать вопрос о том. достаточно ли раз-
ешение 24 X 32 для аркадных атрибутов? Мы знаем, что для граФи-
еской информации принято разрешение 192 X 256 и оно выглядит
достаточным. Для цветовой информации разрешение 24 X 32 выгля-
ит недостаточным, но приемлемым с большими натяжками. Для ар
адных же атрибутов разрешение 24 X 32 оказывается более, чем
достаточным. На практике вполне приемлемые результаты можно
получать с разрешением 6X6. т. е. когда по одному байту ар-
адных атрибутов выделено для кахдого шаблона размером 4ХЧ
знакоместа. Большинство хе коммерческих программ используют
разрешение 12X16. т. е. выделяя по байту аркадных атрибутов на
каждый экранный блок размером 2X2 знакоместа.

Здесь хе нужно отметить, что вовсе не обязательно уклады-
вать все аркадные атрибуты в один байт. Вы можете выделить для
этой пели два байта и хранить в одном аркадные атрибуты, а в
другом - указание на адрес, в котором расположена процедура,
обрабатывающая момент коллизии Вашего героя с данным шаблоном.
Конечно, в одном байте разместить двухбайтный адрес невозможно,
но можно, например, хранить только "смешение" в подготовленной
Вани таблице переходов, а сам адрес перехода к нужной процедуре
брать из этой таблицы.

В заключение укажем. Что принципы интерактивной графики
могут быть использованы не только в игровых программах, но и во
вполне серьезных прикладных, концепция "теневого" экрана специ-
альных атрибутов может быть использована для организации на
экране сложных графических меню, когда для каждого пункта тако-
го меню по его координате можно найти в "теневом" экране атри-
бут, характеризующий этот пункт и содержащий указание на адрес
перехода для исполняющей процедуры, по этому принципу несложно
организовать и работу электронных таблиц, в которых при любом
изменении значений чисел в клетках таблицы тут же переключается
атрибут "теневого" экрана, указывающий на то. что значение в
колонке К строки S было изменено, что запустит программу пере-
счета новых значений всей таблицы для данной строки и данного
столбца.

2. 3. 4. "Печать" аркадных атрибутов.

Ны не случайно взяли слово "печать" в кавычки, ведь печа-
таются аркадные атрибуты на "теневом" экране, который находится
не в экранной области памяти, а где угодно в оперативной. В то
же время, процедура этой "печати" при правильном подходе может
практически ничем не отличаться от процедуры печати на основном
экране, в чем вы сейчас сможете Убедиться. Считайте, что это
тоже печать, хоть и не на экран, а в Файл.

Представим себе, что у нас есть как бы три взаимосвязанных
экрана.

Рис. 5

Как всегда при работе с растровой графикой печать чего-ли-
бо на экране (в том числе и на "теневом") выполняется в два
этапа. На первом этапе по координатам определяется адрес в Фай-
ле. а на втором этапе выполняется копирование в этот адрес.
Точно так же и сканирование по файлу для определения того, ка-
кой атрибут присвоен какому объекту тоже начинается с определе-
ния адреса в Файле по координатам. Вспомним, как раскладывается
адрес в Файле экранных атрибутов по шестнадцати разрядам:

Как видите, положение этого файла в оперативной памяти
целиком определяется пятью старшими битами с 11-го по 15-ый.
Измените хоть один из этих битов и Вы получите новый начальный
адрес для "теневого" Файла атрибутов. Так. если комбинация
0101 1000 дает адрес 22528. то например комбинация 1101 1000
уже даст начальный адрес 55296.

Вспомним процедуру для отыскания адреса в файле атрибутов
по координате:

LD А. Е - Вот в этой точке и выставляются

AHD 18Н пять старших битов в порядке 01011.

SRL А что определяет начальный адрес.

SRL А

SRL А Замените эту операцию например

OR 58Н- на OR D8H и тогда начальный адрес

LD Н.А Файла будет равен 55296 и на экране

ld а. е он показан не будет, но его струк-

AHD 07 тура будет точно соответствовать

OR А структуре Файла цветовых атрибутов.

RRA

RRA

RRA

RRA

ADD A.D
LD L.A

Итак, процедура поиска адреса по координатам требует изме-
нения всего лишь в одном байте, а процедура печати атрибутов,
приведённая выше в разделе 2. 3.2. вообше никаких изменений не
требует и мы ее не будем и рассматривать, коль скоро изменится
только содержимое программной переменной ADDR.A.

Подходя к программированию творчески, можно вообше и не
хранить в памяти компьютера процедуру поиска адреса в файле ар-
кадных атрибутов, а использовать для этого процедуру поиска ад-
реса в Файле цветовых атрибутов, изменяя в ней один байт (нас
принер поставив D8 вместо 58) перед ее вызовом и восстанавливая
его в прежнее состояние после ее работа.

2. 4. Печать шаблонов без искажения Фоновой
картинки.

приведенные выше процедуры впечатывают Ваш шаблон на экран
и при этом "безвозвратно" затирают то изображение, которое под
ним находилось. К сожалению, случаи, когда это так и должно
быть, оказываются слишком редкими, опять же. в рамки данной
книги не входит рассматривать вопросы анинации и мультиплика-
ции, но сан процесс перемещения или изменения Формы графических
объектов на экране состоит ведь из трех этапов:

печать спрайта (шаблона) на экране;
стирание его же;
- печать этого спрайта в новом месте.

Если на первом этапе, при печати, не запомнить то. что бы-
ло на экране в данном месте, то после стирания не удастся и
восстановить исходную Фоновую картинку.

В компьютерах некоторых систем, например "Коммодор-б4".
"Ямаха-MSX" есть специальные микросхемы - процессоры для работа
со спрайтами. В "Спектруме" этого нет и Вам самим надо позабо-
титься. чтобы информация, хранившаяся на экране под Вашим напе-
чатанным шаблоном не была утрачена.

Самое первое, что приходит в голову в такой ситуапии - это
взять изображение, хранившееся на экране до печати Вашего шаб-
лона и скопировать в нанять в какой-то буфер для последующего
восстановления. Может быть, это будет и весь экран или значи-
тельная его часть. Так. конечно, делают, хотя при этом есть и
целый ряд неудобств. Это. во-первых, расход оперативной памяти
на создание такого временного буфера. Во вторых, это приводит к
снижению скорости работа программы, то есть та же мультиплика-
ция выполняется не самым плавный образом

К счастью, у Вас есть элегантная возможность обойти эти
проблемы, никакого изображения из экрана вовсе не запоминать
и, в то же время, не утрачивать его при печати Вашего шаблона.
Для этого вспонним логическую Функцию XOR ("ИСКЛЮЧАЮЩЕЕ ИЛИ").

А - 1010 0101

В - ООН 1100

XOR В - 1001 1001

Эта функция включает те бита, которые были включены в пер-
вом или во втором аргументе, но не в обоих вместе. Достоинство
операции xor в над содержимым аккумулятора состоит в том, что
если мы еше раз повторим эту же команду, то получин в аккумуля-
торе то. что там было исходно. Проверьте:

А - 1001 1001

В - 0011 1100

XOR В - 1010 0101

• * I

Итак, получается, что если мы хотим что-то напечатать на
экране н не утратить хранившуюся тан информацию, то нам надо не
"затирать" байта экрана новыми, а сливать их командой XOR. а
потом, когда надо будет стереть изображение с экрана, снова его
же напечатать с командой XOR.

В этом смысле действие команды XOR в машинном коде эквива-
лентно действию команды OVER 1 при печати в БЕИСИКе.

Как это сделать на практике? Очень простое возьмем цен-
тральный фрагмент процедуры, с помощью которой мы печатали
шаблоны на экране (раздел 2. 3. 2. ):

LOOP-1 LD A. (HL) : Загрузили в аккумулятор

;очередной байт шаблона.

LD (DE). А :Перенос текушего байта из

;оперативной памяти в экранную.

IHC D .'Переход к следующей линии

; знакоместа на экране снизу.

IHC HL ;Переход к следующему байту

;шаблона

—-DJHZ LOOP_1 :конец цикла копирования шаблона

: 8 х 8.

Как видите, здесь командой LD (DE), А на экране производят-
ся безвозвратные изменения. То. что было в экранном адресе, на
который указывает регистровая пара DE, заменяется содержимым
аккумулятора А (а это изображение нашего шаблона).

Попробуем внести в этот фрагмент необходимые изменения для
того, чтобы шаблон не затирал изображение, а "сливался" с ним.

LOOP-1 LD A. (DE) ; Загрузили в аккумулятор

.-очередной байт экрана.

XOR (HL) ; Слияние по XOR с очередным байтом

; шаблона.

LD (DE). А . Печать байта на экран по XOR.

IHC D ; Переход к следующей линии

;знакоместа на экране снизу.

IKC HL :Переход к следующему байту

; шаблона.

-DJHZ LOOP-1 .-конец цикла копирования шаблона

И теперь, когда надо будет "стереть" ваш шаблон с экрана,
вы сможете вместо "стирания" напечатать его еше раз в том же
саном месте той же самой процедурой.

г. 4. 1. возможные проблемы цветовых

атрибутов и борьба с "клэшингом".

Итак, мы с Вами договорились до того, что в принципе очень
удобным, хотя и не единственным приемом печати шаблонов на эк-
ране. является "слияние" накладываемой и Фоновой картинок с по-
мощью логической функции XOR. Встает вопрос - а как при этом
поступить с цветовыми атрибутами? хотелось бы и их печатать с
помошью XOR. дабы не приходилось сохранять в памяти то. что бы-
ло на экране и потом восстанавливать. К тому же. мы хорошо пом-
ним. что в пределах одного знакоместа можно иметь только два
цвета - ink и PAPER. Давайте рассмотрим возникающие при этом
ситуации на серии конкретных примеров.

Предположим. Вы хотите решить вполне жизненную проблему -
Вам надо "впечатать" на экран шаблон желтого автомобиля, а на
экране в этом месте стоит зеленое дерево. То есть как бы Ваш
желтый автомобиль едет на Фоне зеленого леса.

Напомнин конструкцию байта цветовых атрибутов экрана:

Здесь f - признак мигания (flash - 0,1);

в признак яркости (BRIGHT = 0.1);

Р цвет фона (PAPER О. ..7);
I - цвет изображения (INK = О. ..7).

Для простоты будем считать, что наши изображения не имеют
признаков FLASH и BRIGHT и они равны нулю.

Принцип 1.

Если у нас лес нарисован зеленым по белому, то его атрибут
будет равен:

А атрибут автомобиля, нарисованного желтым по белому:

После применения команды XOR мы получин:

Как видите, в результате и лес и автомобиль у нас станут
после этого красными. Если с этим еше как-то можно смириться.
то уж совсем никуда не годится та "черная дыра", которая возни-
кнет в качестве Фона для совмешенных изображений автомобиля и
леса. Представляете, каково будет, если по красивому многоцвет-
ному экрану будет ездить такое черное пятно? Попробуйте изме-
нить цвет PAPER у дерева и у автомобиля. Ставьте какие угодно
сочетания и у Вас ничего путного не получится, пока Вы не выбе-
рете черный цвет в качестве Фонового. Только он. поскольку его
битовая конструкция равна ООО. не превратится ни в какой дру-
гой. а останется тем. какой он есть.

Итак, вывод первый: одним из использованных цветов прн
подготовке изображений должен быть черный цвет.

Принцип 2.

Хорошо, пусть один из цветов ьудет черным. Тен более, что
в абсолютном большинстве программ так оно и есть и это не меша-
ет им быть красивыми и многокрасочныни. встают только вопросы -
как быть с тем. что у нас в результирующей картинке и лес и ав-
томобиль окрасились в красный цвет, которого и в помине не было
в нашей программе и какой цвет лучше назначить черным - INK или
PAPER.

Какой цвет делать черным, мы еше разберем. А вот попробо-
вать сделать черным и тот и другой - это интересно. Сделаем
накладываемую картинку (автомобиль) желтым цветом INK на черном
Фоне PAPER, а вот Фоновую картинку (лес) - наоборот - нарисуем
зеленым цветом PAPER на черном цвете INK. Подход может быть не-
сколько необычен, но иненно так и делают, именно рисуют цветом
PAPER, это означает, что в Фоновой картинке там. где у Вас есть
лес. там пикселы выключены, а там. где его нет - включены. Изо-
бражение получается инвертированным. Причем Вам вовсе не обяза-
тельно таким его рисовать в графическом редакторе. Вы можете
его рисовать нормально черным по белону. а потом инвертиро-
вать командой, которая есть в любом графическом редакторе и то-
лько после этого раскрашивать с помошью "пустой" кисти.

Посмотрим, что у пас получится на этот раз:

Как видите, в результате такого совмещения совместное изо-
бражение и леса и автомобиле станут желтыми, а «он для того и
другого - зеленым. Это уже вполне приемлемый результат. С этим
уже можно жить, хотя кое-что еше сделать конечно можно. Зеле-
ная "дырка" Фона в зеленом лесу смотрится совсен неплохо со
всех точек зрения, а если вы хотите, чтобы поменьше листвы
окрасилось в желтый цвет, то рисуйте шаблон автомобиля так.
чтобы его пикселы максимально перекрывали пикселы леса под ним.
Например, по трассе движения автомобиля от леса оставьте только
намек - отдельные зеленые пятна, не забудьте также, что в ре-
зультате наложения двух включенных пикселов по xor результирую-
щий пиксел выключается.

Итак, вывод второй: в накладываемом и Фоновом изобра-
жениях черный цвет должен быть использован по-разному.
Если у Фона цвет PAPER - черный, то в накладываемом
шаблоне черным принимаем цвет ink и. соответственно,
наоборот.

Принцип 3.

Сейчас, когда мы разобрались с тем. как ведут себя цвето-
вые атрибуты Фоновой картинки и шаблона при печати на экране по
команде XOR. давайте вернемся к пиксельной (монохромной) инфор-
мации и посмотрим, что происходит с изображениями автомобиля и
леса, когда за черный пвет INK и PAPER у них приняты противопо-
ложные пвета.

мы не будем полностью изображать и лес и автомобиль, а
рассмотрин у них для простоты по паре байтов. При этом окраску
пикселов будем обозначать одной буквой:

3 - зеленый: X - желтый; Ч - черный.

И рассмотрим два варианта:

Вариант 1: Для леса примем цвет INK - черным, а для авто-
мобиля - наоборот черным будет цвет PAPER.

В результирующем изображении включенные пикселы примут
цвет IHK, а он. как мы знаем, будет равен старому цвету INK
автомобиля. Итак, мы получим:

Как видите, преобладающим на экране будет желтый цвет.
Создается впечатление, что автомобиль действительно едет по
лесу и при этом он едет по переднему плану, закрывая деревья
Фона.

Вариант 2: Для леса примем цвет PAPER - черным, а для ав-
томобиля - наоборот черным будет цвет INK.

в результируюшен изображении включенные пикселы
примут цвет INK, а он. на этот раз будет равен цвету INK
леса. Итак, мы получим:

Как видите, преобладающим на экране будет зеленый цвет,
т. е. автомобиль едет за деревьями, на заднем плане.

Итак, вывод третий: при наложении одного изображения на
другое по XOR. черный цвет PAPER следует принимать для
того изображения, которое должно занять передний план.
Для изображений заднего плана наоборот за черный прини-
маем цвет INK. Иначе говоря: фоновое изображение подго-
тавливаем с помошью графического редактора в инвертиро-
ванном виде - рисуем цветом PAPER.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Советы бывалого - Основные сведения о модеме и факсе.
Железо - О решении проблем , связанных с подключением к Speccy CGA/EGA мониторов.
Почтовый ящик - О двух версиях газеты...
События - Чемпионат VIRUS II: итоги.
Почта - Переписка с читателями журнала.

В этот день...   23 ноября