ZX Forum #04
19 ноября 1997

Экранные эффекты - Бегущая строка из R-Type.

<b>Экранные эффекты</b> - Бегущая строка из R-Type.
┌──────────────────────────────┐
│                              │
│      ЭКРАННЫЕ  ЭФФЕКТЫ       │
│                              │
└──────────────────────────────┘

   В поисках оригинальных эффек-
тов обратимся  к  тому, что  уже
создано.  Действительно, незачем
заново изобретать велосипед.  За
примерами далеко ходить не надо.
Игровые программы  -  это  такая
кладезь  идей, что  можно  взять
любую  и  "раскручивать"  ее  до
бесконечности. Вы найдете столь-
ко маленьких хитростей, что хва-
тит надолго. Даже не нужно "вле-
зать в  дебри"  программы, можно
брать то, что  лежит  на  повер-
хности. При  повторении  предла-
гаемых программ у Вас  неизбежно
появятся новые идеи и Вы  сможе-
те придумать что-то действитель-
но новенькое.
   Сейчас мы поговорим  о  кодо-
вых фрагментах - процедурах, ко-
торые позволяют получить различ-
ные оригинальные эффекты в прог-
раммах, связанные с очисткой или
прорисовкой экрана, выводом тек-
ста.  Все процедуры, приведенные
ниже, "вытащены"  из  конкретных
игровых программ. Причем  акцент
был сделан не  на  академическую
сторону вопроса, то есть  не  на
то, как работает эта  процедура,
а на совершенно практическую, то
есть, как воспроизвести конкрет-
ный эффект  в  своей  программе.
Это привело к тому, что в исход-
ных процедурах произведены опре-
деленные изменения адресов и уч-
тены некоторые иные моменты, ко-
торые  позволяют  блокам   кодов
функционировать полностью самос-
тоятельно. Так что тем, кто  за-
хочет использовать  их  в  своих
программах, останется только на-
бить и запустить  их.  Для  всех
процедур приводятся Бейсик-прог-
раммы, позволяющие получить пре-
длагаемые блоки кодов для  запи-
си на магнитофон и програмы  для
демонстрации.  Владельцы   БЕТА-
ДИСК интерфейсов  (TR-DOS)  сами
смогут перед SAVE или LOAD  под-
ставить   стандартный    префикс
"RANDOMIZE USR 15619 :  REM  :".
Несколько слов к Бейсик-програм-
мам для получения блоков  кодов.
В строке 10  после  DATA  заданы
следующие  параметры:   значение
RAMTOP, имя блока кодов, исполь-
зуемое при записи на магнитофон,
адрес загрузки и длина блока ко-
дов. Собственно коды для  набора
находятся в строках DATA с 100.

             R-TYPE

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

   Вот  немного  измененный   (с
целью объединения в  непрерывный
блок) листинг этой процедуры:
1423.
   8CC0  21858D   LD   HL,#8D85
   8CC3  CDCD8C   CALL #8CCD
   8CC6  21658D   LD   HL,#8D65
   8CC9  CDCD8C   CALL #8CCD
   8CCC  C9       RET
---------------------------
   8CCD  CB7E     BIT  7,(HL)
   8CCF  C0       RET  NZ
   8CD0  CBFE     SET  7,(HL)
   8CD2  E5       PUSH HL
   8CD3  011F16   LD   BC,#161F
   8CD6  CD0F8D   CALL #8D0F
   8CD9  0604     LD   B,#04
   8CDB  C5       PUSH BC
   8CDC  21DF50   LD   HL,#50DF
   8CDF  CDFE8C   CALL #8CFE
   8CE2  21FF50   LD   HL,#50FF
   8CE5  CDFE8C   CALL #8CFE
   8CE8  21DF50   LD   HL,#50DF
   8CEB  CDFE8C   CALL #8CFE
   8CEE  21FF50   LD   HL,#50FF
   8CF1  CDFE8C   CALL #8CFE
   8CF4  76       HALT
   8CF5  C1       POP  BC
   8CF6  10E3     DJNZ #8CDB
   8CF8  E1       POP  HL
   8CF9  CBBE     RES  7,(HL)
   8CFB  23       INC  HL
   8CFC  18CF     JR   #8CCD
---------------------------------
   8CFE  0E08     LD   C,#08
   8D00  E5       PUSH HL
   8D01  0620     LD   B,#20
   8D03  A7       AND  A
   8D04  CB16     RL   (HL)
   8D06  2B       DEC  HL
   8D07  10FB     DJNZ #8D04
   8D09  E1       POP  HL
   8D0A  24       INC  H
   8D0B  0D       DEC  C
   8D0C  20F2     JR   NZ,#8D00
   8D0E  C9       RET
---------------------------------
   8D0F  7E       LD   A,(HL)
   8D10  E67F     AND  #7F
   8D12  E5       PUSH HL
   8D13  2600     LD   H,#00
   8D15  6F       LD   L,A
   8D16  29       ADD  HL,HL
   8D17  29       ADD  HL,HL
   8D18  29       ADD  HL,HL
   8D19  11003C   LD   DE,#3C00
   8D1C  19       ADD  HL,DE
   8D1D  78       LD   A,B
   8D1E  E6F8     AND  #F8
   8D20  C640     ADD  A,#40
   8D22  57       LD   D,A
   8D23  78       LD   A,B
   8D24  E607     AND  #07
   8D26  0F       RRCA
   8D27  0F       RRCA
   8D28  0F       RRCA
   8D29  81       ADD  A,C
   8D2A  5F       LD   E,A
   8D2B  C5       PUSH BC
   8D2C  3A648D   LD   A,(#8D64)
   8D2F  A7       AND  A
   8D30  280A     JR   Z,#8D3C
   8D32  0608     LD   B,#08
   8D34  7E       LD   A,(HL)
   8D35  12       LD   (DE),A
   8D36  14       INC  D
   8D37  23       INC  HL
   8D38  10FA     DJNZ #8D34
   8D3A  1814     JR   #8D50
   8D3C  7A       LD   A,D
   8D3D  08       EX   AF,AF'
   8D3E  CD598D   CALL #8D59
   8D41  08       EX   AF,AF'
   8D42  57       LD   D,A
   8D43  7B       LD   A,E
   8D44  C620     ADD  A,#20
   8D46  5F       LD   E,A
   8D47  3004     JR   NC,#8D4D
   8D49  7A       LD   A,D
   8D4A  C608     ADD  A,#08
   8D4C  57       LD   D,A
   8D4D  CD598D   CALL #8D59
   8D50  C1       POP  BC
   8D51  0C       INC  C
   8D52  E1       POP  HL
   8D53  CB7E     BIT  7,(HL)
   8D55  23       INC  HL
   8D56  C0       RET  NZ
   8D57  18B6     JR   #8D0F
--------------------------------
   8D59  0604     LD   B,#04
   8D5B  7E       LD   A,(HL)
   8D5C  12       LD   (DE),A
   8D5D  14       INC  D
   8D5E  12       LD   (DE),A
   8D5F  14       INC  D
   8D60  23       INC  HL
   8D61  10F8     DJNZ #8D5B
   8D63  C9       RET
--------------------------------
   8D64  00       Режим (высота)
--------------------------------
   8D65  ...Текст бегущей строки
2
   Запускается бегущая строка  с
адреса загрузки  8CC0H  (36032).
Вызывающая  процедура  (8CC0H  -
8CCCH), кстати, может находиться
в любом другом месте Вашей прог-
раммы. В  регистре  HL  задается
начальный адрес  текста  сообще-
ния, затем происходит вызов про-
цедуры бегущая строка.  Это  мо-
жет происходить  многократно  из
разных мест Вашей программы. При
этом любое  текстовое  сообщение
необходимо завершать печатью  32
пробелов в конце, это предотвра-
тит остановку бегущей строки "на
полуслове". Вообще нужен 31 про-
бел, так  как  последнее  знако-
место  автоматически   очищается
при  выполнении  горизонтального
скроллинга. Если бегущая  строка
вызывается  много  раз,  то  это
создает ощутимый расход  памяти.
Поэтому печать 31 пробела  выде-
лена в отдельную часть, она дол-
жна выполняться всякий раз  пос-
ле печати текста. Это Вы  видите
по адресу 8CC6H.
   Текстовые сообщения  находят-
ся с  адреса  8D65H  (36197).  В
конце каждого текстового сообще-
ния должен быть  поставлен  мар-
кер конца - любое число с  вклю-
ченным 7 битом.  Например, прос-
то FFH (255).
   Собственно процедура "бегущая
строка" (8CCDH) начинается с ко-
манды проверки маркера конца.  В
зависимости  от  этого  происхо-
дит либо выход из процедуры, ли-
бо дальнейшая работа.
   В команде по адресу  8CD3H  в
регистре BC  задается  начальная
позиция  для  печати  (строка  и
столбец), в приведенном  примере
соответственно 16H  (22)  и  1FH
(31), то есть строка выводится в
нижней части экрана.  Вы  можете
изменить их (ниже мы  рассмотрим
вариант такого  изменения).  За-
тем происходит  вызов  процедуры
печати 8D0FH.
   При  двойной  высоте  символа
особенно   будет  заметно,  если
скроллинг будет происходить  не-
достаточно плавно - это сразу же
проявится в виде искажений  вер-
тикальных линий. Поэтому  скрол-
линг происходит с  дискретностью
в 1 пиксел сначала верхней поло-
вины символа (1 знакоместо), за-
тем сразу же нижней. При  вызове
процедуры скроллинга  -  8CFEH -
предварительно в регистре HL за-
дается адрес в дисплейном файле,
соответствующий верхней пиксель-
ной линии сдвигаемого  знакомес-
та (в примере это 22-я строка  и
31-е знакоместо). После выполне-
ния пары циклов скроллинга  сле-
дует команда HALT, которая необ-
ходима  не  только  для  задания
скорости  бегущей  строки, но  и
для синхронизации изображения  с
кадровой  разверткой  телевизора
для устранения искажений  симво-
лов. После этого происходит  за-
цикливание для печати  очередно-
го символа текстового сообщения.
   Несколько  слов  о  процедуре
печати 8D0FH. В команде по адре-
су 8D19H в регистре DE  задается
адрес, соответствующий  значению
CHARS того  символьного  набора,
которым  будет  выполняться  пе-
чать текста бегущей строки.  При
использовании загружаемого  сим-
вольного набора необходимо  учи-
тывать, что  высота  символов  -
двойная, поэтому то, что  краси-
во  для одиночной  высоты, может
казаться искаженным при  двойной
высоте.
   Авторами при разработке  про-
цедуры  был  заложен  интересный
момент: введена системная  ячей-
ка, определяющая  высоту  симво-
лов бегущей  строки.  Она  может
быть двойная или одиночная.  Оп-
ределяет высоту содержимое ячей-
ки 8D64H (36196). Если там ноль,
то высота - двойная. Любое нену-
левое значение задает  одиночную
высоту  символов.  Эта  проверка
выполняется по адресу  8D2CH.  В
зависимости от этого  происходит
выполнение  разных  блоков:  при
одиночной высоте  -  8D32H...8D-
3AH, а при двойной - 8D3CH...8D-
4DH.  Принципиальным   различием
этих блоков  является  однократ-
ное или двукратное  обращение  к
процедуре перенесения 8 байт  на
экран 8D59H.
   Обратите внимание, что  нигде
в программе не происходит  изме-
нение в области цветовых атрибу-
тов экрана. Они являются  "проз-
рачными", то есть  такими, какие
были заданы ранее в  этих  пози-
циях экрана.

   Теперь несколько слов об  из-
менении параметров бегущей стро-
ки. Предположим, что необходимо,
чтобы бегущая строка  располага-
лась в  самом  верху  экрана, но
чтобы занимала  не всю строку, а
лишь знакоместа с 10 по  21  (то
есть только 12 знакомест в сере-
дине строки). Для  этого  прежде
всего изменим  позицию  для  на-
чальной печати:
1423.
   8CD3  011500   LD   BC,#0015
2
   Кроме того, необходимо в  со-
ответствии с этим изменить адре-
са в дисплейном файле для скрол-
линга:
1423.
   8CDC  211540   LD   HL,#4015
   8CE2  213540   LD   HL,#4035
   8CE8  211540   LD   HL,#4015
   8CEE  213540   LD   HL,#4035
2
   Также  необходимо  ограничить
зону скроллинга 12-ю знакоместа-
ми:
1423.
   8D01  060C     LD   B,#0C
2
   Число печатаемых в конце про-
белов можно теперь уменьшить  до
11, установив  маркер  конца  на
новом месте.
   Испытываем  получившийся  ва-
риант и видим, что при небольшой
длине выводимого на  экран  тек-
ста  скорость  перемещения   его
слишком велика  -  стало  трудно
читать. Скорость можно  снизить,
если внести следующие изменения:
1423.
   8CD9  0608     LD   B,#08

   8CE8  00       NOP
   ....  ..       ...
   8CF3  00       NOP
2
   Теперь команда HALT будет вы-
полняться не после пары, а  пос-
ле каждого  вызова  подпрограммы
скроллинга,  и  скорость  вывода
текста замедлится в два раза.
   Теперь все в  порядке.  Оста-
лось только оформить при  помощи
ART-STUDIO получившуюся  зону  с
бегущей строкой (включая  INK  и
PAPER  тех знакомест, где  будет
выводиться текст)  в  виде  таб-
ло или дисплея, который является
частью кабины  космического  ко-
рабля или иначе - по сюжету  Ва-
шей игры.

   Программа на Бейсике для  по-
лучения  блока  кодов   "бегущая
строка":

   1 READ ram: CLEAR ram: READ f
$: READ st: READ len: FOR a=st T
O st+len-1: READ b: POKE a,b: NE
XT a: SAVE f$CODE st,len
   2 RANDOMIZE USR st
  10 DATA 36031,"rt",36032,268
 100 DATA
033,133,141,205,205,140,033,101,
141,205,205,140,201,203,126,192,
203,254,229,001,031,022,205,015,
141,006,004,197,033,223,080,205
 110 DATA
254,140,033,255,080,205,254,140,
033,223,080,205,254,140,033,255,
080,205,254,140,118,193,016,227,
225,203,190,035,024,207,014,008
 120 DATA
229,006,032,167,203,022,043,016,
251,225,036,013,032,242,201,126,
230,127,229,038,000,111,041,041,
041,017,000,060,025,120,230,248
 130 DATA
198,064,087,120,230,007,015,015,
015,129,095,197,058,100,141,167,
040,010,006,008,126,018,020,035,
016,250,024,020,122,008,205,089
 140 DATA
141,008,087,123,198,032,095,048,
004,122,198,008,087,205,089,141,
193,012,225,203,126,035,192,024,
182,006,004,126,018,020,018,020
 150 DATA
035,016,248,201,000,032,032,032,
032,032,032,032,032,032,032,032,
032,032,032,032,032,032,032,032,
032,032,032,032,032,032,032,032
 160 DATA
032,032,032,032,255,085,078,065,
085,084,072,079,082,073,083,069,
068,032,068,073,083,067,076,079,
083,085,082,069,032,079,070,032
 170 DATA
084,072,073,083,032,073,078,070,
079,082,077,065,084,073,079,078,
032,073,083,032,080,085,078,073,
083,072,065,066,076,069,032,066
 180 DATA
089,032,068,069,065,084,072,032,
033,033,033,255




Другие статьи номера:

Help - Описание оболочки электронного издания "ZX-FORUM 4".

Секреты успешного дизайна - глава для книги "Дизайн Ваших программ"

Экранные эффекты - Бегущая строка из R-Type.

Экранные эффекты - гашения экрана из Zynaps.

Экранные эффекты - "сворачивание" экрана из Comando Tracer.

Экранные эффекты - плавное "затухание" экрана из Сommando Tracer.

Экранные эффекты - модификация символьного набора для получения оригинального стилизованного шрифта из игры Rockstar.

Экранные эффекты - "выбегающая строка" из игры Rockstar.

Экранные эффекты - "наливающийся" экран из игры Rockstar.

Экранные эффекты - сложный многоступенчатый эффект из игры Bubbler.

Новые 40 лучших процедур - скроллинг экрана, слияние двух картинок, инвертирование экрана, поворот символов, замена атрибутов, заливка замкнутого контура, вычисление адресов в экране, копирование части экрана и т.д.

Технология спрайтов - часть 1: введение.

Технология спрайтов - часть 2: охота на спрайты (поиск и выдирание).

Технология спрайтов - часть 3: форматы спрайтов.

Технология спрайтов - часть 4: форматы спрайтов с маской.

Технология спрайтов - часть 5: структура спрайтовых блоков (как уживаются в памяти спрайт и маска, какие данные помогают нам оперативно находить адрес спрайта в памяти и многое другое.)

Технология спрайтов - часть 6: подготовка данных к печати.

Технология спрайтов - часть 8: печать спрайтов (координаты заданы в знакоместах).

Технология спрайтов - часть 9: печать спрайтов (координаты заданы в пикселях).

Технология спрайтов - часть 10: обзор программ для работы со спрайтами и графикой.

Мир звуков Спектрума - глава 1: Физика звука.

Мир звуков Спектрума - глава 2: Оператор BEEP, Создание эффектов на BEEPе, Создание музыки на BEEPе.

Мир звуков Спектрума - глава 3: Как получается звук (устройство BEEP'ра и способы звукоизвлечения).

Мир звуков Спектрума - глава 4: Программирование звука на ассемблере.

Мир звуков Спектрума - глава 4.1: Программирование звуковых эффектов - Тон, Шум, Комплексы эффектов.

Мир звуков Спектрума - глава 4.2: Программирование звуковых эффектов - Управление громкостью.

Мир звуков Спектрума - глава 4.3: Программирование звуковых эффектов - Управление тембром.

Мир звуков Спектрума - глава 4.4: Программирование звуковых эффектов - Программирование музыки.

Мир звуков Спектрума - глава 4.5: Программирование звуковых эффектов - Многоголосые мелодии (полифония).

Мир звуков Спектрума - глава 4.6: Обработка внешних сигналов - оцифровка.

Мир звуков Спектрума - глава 4.7: Обработка внешних сигналов - Реверберация.

Мир звуков Спектрума - глава 4.8: Синтезирование речи.

Мир звуков Спектрума - глава 4.9: воспроизведение звука на прерываниях.

Мир звуков Спектрума - глава 5: Оператор PLAY для музыкального сопроцессора AY- 3-8910 (AY-3-8912).

Мир звуков Спектрума - глава 5.1: Создание эффектов оператором PLAY.

Мир звуков Спектрума - глава 5.2: Создание музыки на PLAYе.

Мир звуков Спектрума - глава 6.1: описание регистров музыкального сопроцессора AY- 3-8910 (AY-3-8912).

Мир звуков Спектрума - глава 6.2: Программирование эффектов и музыки под музыкальный сопроцессор AY- 3-8910 (AY-3-8912).

Мир звуков Спектрума - глава 7: Обзор программного обеспечения ZX-Spectrum для создания звуков и музыки.

Мир звуков Спектрума - глава 7.1: Редактор звуковых эффектов SUPER SOUND.

Мир звуков Спектрума - глава 7.2: Музыкальный редактор Wham the Music Box.

Мир звуков Спектрума - приложения 1, 2: листинги звуковых эффектов SUPER SOUND'а, советы по использованию ассемблера.


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

Похожие статьи:
Coding - Texture Mapping - реализация от SaiR00S/EI.
Тест - Состояние вашей пищеварительной системы...
Печатается с продолж. - Как ломаются полуоси (окончание, часть 3).
interview - gas13
CODING - Почему он так режет? (о выводе картинок на экран).

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