┌──────────────────────────────┐ │ │ │ ЭКРАННЫЕ ЭФФЕКТЫ │ │ │ └──────────────────────────────┘ В поисках оригинальных эффек- тов обратимся к тому, что уже создано. Действительно, незачем заново изобретать велосипед. За примерами далеко ходить не надо. Игровые программы - это такая кладезь идей, что можно взять любую и "раскручивать" ее до бесконечности. Вы найдете столь- ко маленьких хитростей, что хва- тит надолго. Даже не нужно "вле- зать в дебри" программы, можно брать то, что лежит на повер- хности. При повторении предла- гаемых программ у Вас неизбежно появятся новые идеи и Вы сможе- те придумать что-то действитель- но новенькое. Сейчас мы поговорим о кодо- вых фрагментах - процедурах, ко- торые позволяют получить различ- ные оригинальные эффекты в прог- раммах, связанные с очисткой или прорисовкой экрана, выводом тек- ста. Все процедуры, приведенные ниже, "вытащены" из конкретных игровых программ. Причем акцент был сделан не на академическую сторону вопроса, то есть не на то, как работает эта процедура, а на совершенно практическую, то есть, как воспроизвести конкрет- ный эффект в своей программе. Это привело к тому, что в исход- ных процедурах произведены опре- деленные изменения адресов и уч- тены некоторые иные моменты, ко- торые позволяют блокам кодов функционировать полностью самос- тоятельно. Так что тем, кто за- хочет использовать их в своих программах, останется только на- бить и запустить их. Для всех процедур приводятся Бейсик-прог- раммы, позволяющие получить пре- длагаемые блоки кодов для запи- си на магнитофон и програмы для демонстрации. Владельцы БЕТА- ДИСК интерфейсов (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