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

Блочная графика - создание аркадных эффектов в блочной графике. Создание трехмерных эффектов в блочной графике.


4. БЛОЧНАЯ ГРАФИКА

Выше мы упомянули, что воспроизведение блочной графики
сводится на практике к печати символов, размешенных либо в ПЗУ,
либо в ОЗУ компьютера. Это наиболее простой и экономичный путь
получения сложных графических изображений. Разумеется в боль-
шинстве случаев в качестве печатаемых символов выступают не
символы стандартного набора ASCII, а заранее подготовленные
программистом специальные символы, на расположение которых в
ОЗУ указывают с помошью системной переменной CHARS (23606 DEC =
5С36Н).

Приняв в своей программе именно такой метод воспроизведе-
ния графики, вы значительно облегчаете себе жизнь, благодаря
тому, что можете использовать стандартные процедуры ПЗУ для
печати символов на экране. Это прежде всего процедура, которая
задеиствуется командой процессора RST юн и некоторые другие
процедуры, опирающиеся на нее. В основном упрощение программи-
рования достигается за счет того, что Вам теперь уже не нужно
для печати объекта на экране производить пересчеты экранных
координат в адреса экранной памяти, т. к. при использовании
RST ЮН вы можете задавать эти координаты напрямую.

в предыдущем томе - "Элементарная графика" ны достаточно
подробно остановились на печати с помошью RST ЮН и теперь
имеем возможность на этом вопросе не останавливаться, а
рассмотреть некоторые дополнительные приемы. Тем не менее, в
двух словах мы все же напомним основы печати через RST ЮН.

1. для того, чтобы напечатать с помощью команды RST ЮН
некоторый символ, необходимо:

- установить код этого символа в аккумуляторе, что
делается тривиально просто:

LD А. N

- сделать текущим канал, по которому должна выполняться
печать, это можно сделать несколькими способами.

Во-первых. Вы можете применить для этого системную проце-
дуру ПЗУ CHAN.OPEN (1601Н = 5633 DEC). Перед тем. как ее вызы-
вать. в аккумуляторе следует установить номер потока, который
подключен к этому каналу. Так, для печати в основную часть
экрана (канал "S", поток #2) там следует установить число 2. А
для печати в нижнюю часть экрана (канал "К", поток #0) там
следует установить 0.

Во-вторых. Вы можете воспользоваться для этой цели систем-
ной переменной TV.FLAG i5СЗСН = 23612 DEC), нулевой бит которой
указывает на то. какой канал вывода в данный момент является
текущим. Если этот бит выключен, то текущим будет канал "S". а
если включен, то канал "К".

2. Применяя управляющие коды, вы можете управлять как
позиниеи печати, так и цветовыми атрибутами печатаемых
символов. Управляющие коды (управляющие символы) выдаются
командой RST ЮН точно так же, как и печатные символы.

3. Если Вы хотите напечатать не один символ, а последова-
тельность символов (символьную строку), то можете воспользо-
ваться процедурой ПЗУ PR.STRING (203СН = 8252 DEC). Печатаемая
символьная строка может включать в себя и коды управления цве-
том и позицией печати. Т к. PR.STRING в своей работе опирается
на RST ЮН, то соответственно здесь тоже необходимо предвари-
тельно задавать текущий канал вывода.

4. 1. Создание аркадных эффектов в блочной графике.

Поскольку экранное изображение в программах строится из
заранее заданных пользователем символьных блоков 8X8, здесь
есть элегантная возможность введения в игру аркадных атрибутов.
Выше мы говорили о том, что в программах делают это "подвеши-
вая" аркадные свойства объектов на их цветовые атрибуты или,
скажем, вводя "теневой" экран аркадных атрибутов. В программах,
использующих символьную графику (правильнее ее считать псевдо-
графикой) нередко аркадные атрибуты "подвешивают" на пиксельную
конструкцию псевдосимволов. Несколько примеров такого подхода
мы сейчас и рассмотрим. Вы можете и сами посмотреть, как это
организовано, например в программах MANIC MINER. JET SET WILLI.

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

Это основной блок, иэ которого строится изображение игро-
вого поля. При вертикальном перемещении гегоя такой блок явля-
ется "опорой" - на нем можно стоять, не проваливаясь. При го-
ризонтальном перемещении этот блок непроходим, идентифицировать
наличие такого блока в знакоместе с координатами X, V - очень
просто. Надо по координатам знакоместа найти адрес, соответ-
ствующий его верхней пиксельной линии и. если по этому адресу
содержится число 170. значит это он.

На Рис. 36 показаны примеры блоков, являющихся опорой дру-
гого рода - они выполняют Функнии наклонных плоскостей. Если
под героем идентифицирован блок, верхняя линия которого равна 1
или 128. включается иная процедура, обрабатывающая движение.
Так, при перемещении вправо/влево, одновременно должна изме-
няться и вертикальная координата героя. В программе JET SET
WILLI эта процедура устроена таким образом, что когда герой
"прыгает" эта опора является проницаемой.

На рис. 37 показаны два примера бегущих дорожек. Такие
блоки "включают" процедуры самопроизвольного движения героя
вправо или влево. Идентифицируются они по наличию числа 238 или
119 в адресе, соответствующем первой линии знакоместа

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

Основной цикл работы программы выглядит следующим образом:

- определяем, какие управляющие клавиши нажаты:

- проверяем возможность перемещения в заданном направле-
нии;

- проверяем, что за блок находится под новой координатой
героя (направление "вниз" надо проверять всегда, даже

если клавиша "вниз" не нажиналась - это происходит
благодаря закону всемирного тяготения);

- если никаких особенностей не выявлено, герой печатается
в новой координате;

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

4. 2. Создание трехмерных эффектов в блочной графике.

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

Рассмотрим создание такого генератора на конкретном при-
мере. Его задача - просканировать экран и. если на экране будут
обнаружены "твердые" объекты, выполнить "оконтуривание" этих
объектов тенью. Будем считать, что освешение экрана направлено
слева-сверху. В этом случае все твердые тела должны отбрасывать
тень вправо-вниз.

Введен понятие "твердого тела", таким телом будем считать
всякое тело, имеющее пиксельный шаблон такой, какой показан на
Рис. 35. Для идентификации того, что контур рисовать надо, мы
можем использовать верхнюю пиксельную линию, которая у такого
тела должна равняться 170.

Тень выглядит изяшнее. если ее ширина не равна символьному
блоку (8 пикселов), а несколько меньше - 3... 5 пикселов. Ножно
сказать так, что "широкие" тени больше соответствуют дизайну
ранних программ, а "узкие" - дизайну программ последних лет
выпуска. Мы исполним тени шириной ч пиксела. Для такого генера-,
тора нам потребуются три "теневых элемента". По одному для го-
ризонтальных и вертикальных теней и один элемент в качестве уг-
лового. см. Рис. 39-

Список процедур.

SHADOW - головная процедура. Здесь выполняется сканирова-
ние экрана. Поскольку тень должна отбрасываться вправо-вниз,
нам удобнее работать, если мы начнем сканировать экран и стро-
ить теневой контур из правого нижнего угла, следуя по порядку
справа-налево и снизу-вверх. В случае, если находится знако-
место. в котором байт верхней линии равен 170 (оаан). то после
необходимых проверок, связанных с границами экрана, вызываются

процедуры VERT или HORIZ для рисования вертикальной или гори-
зонтальной тени.

ADDR - процедура рассчитывает адрес в экранной области для
верхней линии знакоместа, координаты которого (в знакоместах)
выставлены в регистровой паре DE. Результат возвращается в
регистровой паре HL.

VERT - процедура, оттеняюшая "твердый" блок справа по вер-
тикали. Ны приходим сюда с адресом знакоместа, в котором должна
быть напечатана "тень", установленным в регистровой паре HL.
Печать осуществляется наложением по OR байта, в котором включе-
ны четыре старших бита. Это выполняется в цикле из 6 шагов.
Процедура несколько усложнена тем. что надо проверить, не
является ли исследуемый блок угловым. Если это так. то тогда
надо напечатать еше и "угловую тень", которая печатается в цик-
ле из четыпрех шагов.

HORIZ - процедура, оттеняюшая блок снизу. Печать осущест-
вляется включением всех битов в четырех верхних линиях знако-
места.

процедура SHADOW.

Код Нетка Ннемоника Комментарий

F3 SHADOW DI отключение прерываний.

0616 LD В. 16Н ;Организация цикла для 22

С5 LOOP PUSH ВС ;СТРОК.

58 LD Е, В ; _ |

ID DEC Е ; Текущая координата V.

0620 LD В. 20Н ; организация цикла для 32

С5 LOOP_l PUSH ВС :столбцов.

50 LD D. В ;

15 DEC D ; Текущая координата X.

CD???? CALL ADDR ; Вызов процедуры для расчета

;адреса в дисплейном Файле для
:знакоместа, заданного в DE.

7Е LD A. (HL) ;Байт в первой линии текущего

. знакоместа.

FEAA CF AAH ioh равен 170?

2026 JR NZ. PASS ; Если нет. то переход на PASS.

7А LD A.D

ЗС IHC А :Проверни знакоместо справа.

FE1F CP 2 ОН !

3020 JR NC. PASS ; Если это самый правый столбец

;экрана, то оттенять его не
; надо.

2С INC L ; Переход к знакоместу справа.

7Е LD A. CHL) ; Что там содержится?

FEAA CP AAH : Байт равен 170?

2803 JR Z. PASS.1 : Если да. то это ие то, что нам

;нужно, переходим на PASS.1.

CD???? CALL VERT ; Вызов процедуры вертикального

; оконтуривания.

2D PASS.l DEC L ; Восстановили L

7В LD А. Е ;

ЗС IHC А ;Проверим знакоместо снизу.

FE16 CP 16Н ;

ЗОЮ JR NC. PASS ; Если это нижняя строка из 22

;возможных, то ее оттенять не

; надо.

7D LD A. L ;Проверим, что содержится

С620 ADD А. 20Н ; в знакоместе снизу.

67 LD L, А

7Е LD A. (HL) ;

FEAA CP AAH ;Байт равен 170?

2803 JR Z. PASS_2 ; Если да, то это не то, что

; нам нужно, переходим к FASS_2.

CD???? CALL HORIZ ; Вызов процедуры оттенения

; по горизонтали.

7D PASS.2 LD A, L ; Восстановили

D620 SUB 20Н ; предыдущее

67 LD L, А . значение L.

Cl PASS FOP ВС N __ ; Восстановление счетчика

; столбцов.

ЮСС DJHZ LOOF_l ;Переход к столбцу слева.

01 POP ВС ;Восстановление счетчика рядов.

ЮС4 DJNZ LOOP :Переход к верхнему ряду.

FB EI ;Включение прерываний.

С9 RET ; Выход из подпрограммы.

Процедура ADDR.

Код Метка Мнемоника комментарий

7B ADDR LD А.Е (Координата у.

Е618 AND 18Н (Определяем номер сегмента эк-

; рана.

F640 OR 40Н (Выставляем начальный адрес

(дисплейного Файла.
67 LD Н.А (Результат выставили в Н.

7B LD А. Е ;Координата У.

Е607 AND 07 (Номер ряда в сегменте.

B7 OR А (Сброс Флага переноса.

IF RRA (Перемешаем номер

IF RRA (ряда в три старших

IF RRA ; бита.

IF RRA (

82 add a.d (Заполняем пять младших

(битов номером столбца.
6F LD L. А (Результат выставляем в L.

С9 RET ; Возврат.

Процедура VERT.

Код Метка мнемоника комментарий

Е5 VERT PUSH HL (Запомнили HL на стеке.

0608 LD В. 08 ; Счетчик на 8 байтов для верти-

кального блока.
7Е LOOP LD A. (HL) (Взяли то. что уже есть на

( экране в текущем знакоместе.

F6F0 OR FOH ; Наложили на него вертикальный

; блок.

77 LD (HL),л поместили результат в текущее

; знакоместо.

24 INC Н ; перешли к новой линии.

10F9 DJHZ LOOP ; Если не все 6 линий йерерабо-

; таны, то возврат на LOOP.

7В LD А. Е ; Номер текущей строки.

ЗС INC А проверка, не

6F LD L.А ;последняя ли

7Е LD A. (HL) ; это строка.

FE16 CP 16Н ;

3014 JR NC, PASS ; Если да. то обход.

El POP hl ; Восстановили со стека адрес

;первой линии знакоместа.

Е5 PUSH HL ; И снова его запомнили.

7D LD A.L ;Перешли к первой линии в

С620 ADD А. 2ОН ; нижележащем

6F LD L, А ; знакоместе.

7Е LD A.(HL) ; Что там содержится?

FEAA CP ААН ;Если там число 170. то здесь

2609 jr z. pass ; печатать угловую тень не на-

. до. Во всех же остальных
;случаях она здесь нужна.

0604 LD В. 04 ; Цикл в 4 шага для печати уг-

; лового блока.

7Е LOOP.l LD A.(HL) ; взяли то, что есть в текущей

; линии.

F6F0 OR FOH наложили угловой блок.

77 LD (HL).A Поместили на экран.

24 INC Н ;Перешли к новой линии.

10F9 djnz loop.i ; Если не все линии напечатаны.

;возврат на LOOP.l.

El PASS POP HL ;Перед выходом восстановили

исходное содержимое HL.

09 RET ; возврат.

Процедура HORIZ.

Код Нетка мнемоника комментарий

Е5 HORIZ PUSH HL :Запомнили HL на стеке.

0604 LD В. 04 ; Счетчик на 4 байта для гори-

;зонтального блока.

7Е LOOP LD A.(HL) :Взяли то. что уже есть на

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

F6FF OR FFH :Наложили на него горизонталь-

; ныи блок.

77 LD (HL), А ;Поместили результат в текущее

; знакоместо.

24 IHC Н ; Перешли к новой линии.

10F9 DJHZ LOOP :Если не все 4 линии перерабо-

: таны, то возврат на LOOP.

El POP HL ;Восстановление HL перед выхо-

;дом из процедуры.

С9 RET ; Возврат.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Scene - каннибализм на сцене: "лагерь спектрума разбит на две тусовки: западную, европейскую сцену и русскую..."
Дискуссия - IBM is the BEST???
IS DOS - Проблемы и решения
Вступление - содержание номера.
Авторы

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