(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), которые,
можно сказать, определяют "яр-
кость" пламени, перекодируются в
соответствующие значения атрибу-
тов в соответствии с этой палит-
рой.
Хотя этот эффект (как и все,
рассмотренные в статье) не син-
хронизируется по прерываниям,
они должны быть разрешены - это
нужно для опроса клавиатуры.