ZX Review
#11-12
26 ноября 1997 |
|
Этюды - Эффект "пламя".
(c) Иван Рощин, Москва, 1997 Несколько графических эффектов 1. "Пламя" Существует множество вариан- тов этого эффекта (см., напри- мер, музыкальные demo F.S.R.D., INSANE, S4B, NOUMENON, EYE ACHE 2, RAGE и т.п.). Я же реализо- вал до сих пор нигде не встре- чавшийся: на экране находится некоторая картинка (скажем, зас- тавка программы), и на заднем фоне (а это участки картинки, окрашенные черным цветом) как раз и виднеется "пламя". Как это выглядит, вы можете увидеть, за- пустив "ZX FORUM 4" (эффект ис- пользуется в главном меню этого электронного издания). Итак, текст программы (при ее разработке я использовал фраг- менты процедуры "Пламя", взятой из статьи С.Телицына в ZX РЕВЮ 5-6 1997): 140. BUF1 EQU #8000 ;Здесь запоминаются ;атрибуты картинки. BUF2 EQU #8300 ;Массив, соотв. ;выводимому изобра- ;жению (длина #340). BUF3 EQU #8700 ;Палитра (младший ;байт адреса = 0!) LD HL,BUF3 EXX XOR A LD (23560),A LD HL,BUF3 ;формируем LD DE,BUF3+1 ;палитру LD (HL),0 LD BC,8 LDIR LD A,%1000 LD (BUF3+4),A LD (HL),A LD BC,8 LDIR LD (HL),%10000 LD BC,8 LDIR LD (HL),%11000 LD BC,#E7 LDIR LD HL,#9000 ;перебросили LD DE,#4000 ;картинку LD BC,#1B00 ;на экран LDIR LD HL,#5800 ;сохранили LD DE,BUF1 ;ее атрибуты LD BC,#300 LDIR LD HL,BUF2 ;обнулили LD (HL),0 ;рабочий LD DE,BUF2+1 ;буфер LD BC,#2FF LDIR SSAVER LD HL,BUF2+#320 ;заполняем LD (HL),-60 ;часть LD DE,BUF2+#321 ;буфера LD BC,#1F ;числом -60 ;(от его значения LDIR ;зависит вид эффекта) LD HL,0 ;исходное положение ;в ПЗУ ;Цикл обновления содержимого буфера BUF2: LOOP_1 LD DE,BUF2+#300 LD B,#20 LOOP_2 INC HL LD A,H AND #1F LD H,A LD A,(HL) ;сл.байт из ПЗУ AND %00111111 ADD A,%11000 JR NC,LL LD A,%11000 LL LD (DE),A INC DE DJNZ LOOP_2 PUSH HL LD IX,BUF2 LD DE,#5800 LD HL,BUF1 LD BC,#2FF LOOP_4 LD A,(IX+32) ADD A,(IX+33) ADD A,(IX+34) ADD A,(IX+65) SRL A SRL A JR Z,LOOP_5 DEC A LOOP_5 INC IX INC HL INC DE LD (IX),A ;Изменили значение байта в буфере, ;теперь изменяем соотв. атрибут на экране: PUSH BC EXX LD L,A ;адрес в палитре LD A,(HL) ;A = нужный цвет EXX LD B,A ;Для текущего атрибута устанавливаем ;вместо черного цвета INK или PAPER ;тот цвет, который взяли из палитры; ;т.о. черный цвет является как бы ;"прозрачным": LD A,(HL) ;атр. картинки AND %00111000 ;PAPER JP NZ,TST_2 ;JP-для скорости LD A,B ;теперь вместо OR (HL) ;черного - LD (DE),A ;другой цвет TST_2 LD A,(HL) AND %00000111 ;INK JR NZ,TST_Q LD A,B AND %00111000 RRCA RRCA RRCA OR (HL) LD (DE),A TST_Q POP BC DEC BC LD A,B OR C JP NZ,LOOP_4 POP HL ;Проверка клавиатуры: LD A,(23560) AND A JP Z,LOOP_1 RET 2 Что хотелось бы отметить: во- первых, нетрудно, изменив прог- рамму, объявить "прозрачным" не черный, а любой другой цвет (или даже сразу несколько цветов). Во-вторых, можно очень точно ре- гулировать цвет "пламени" с по- мощью палитры (массив BUF3). Каждый байт палитры содержит од- но из восьми значений, опреде- ляющее цвет: %000000,%001000,... %111000. В процессе работы прог- раммы значения из буфера BUF2 (числа от 0 до 255), которые, можно сказать, определяют "яр- кость" пламени, перекодируются в соответствующие значения атрибу- тов в соответствии с этой палит- рой. Хотя этот эффект (как и все, рассмотренные в статье) не син- хронизируется по прерываниям, они должны быть разрешены - это нужно для опроса клавиатуры.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября