|
Faultless
#08
29 ноября 1997 |
|
Ассемблер - демо эффект "летание сетки"

Предисловие
───────────
Во многих демухах , например , U.S.,ICE
CREAM; во многих boot'ах вы наверняка
встречали такой эффект , как "летание
сетки" по плавной траектории, попросту
говоря - "PUSH'евский EFFECT" , как его
еще называют.
Принцип его не очень сложен, как может
показаться на первый раз , на самом деле
"фундаментом" в нем является все та же
команда PUSH,которая за один раз, как вы
знаете,могет копировать 2 байта.
Так вот,в этом тексте я приведу приме-
ры программ,которые вам помогут сделать
такой эффект (PUSH'овский). Так давайте
перейдем непосредственно к делу:
Сначала мы должны построить табличку,
по которой будет летать ваш спрайт
(слухайся своеi спрагы , пый спрайт),
спрайт должен быть размером 2*16 ( по
X - 2,Y - 16 ).Табличка строится обыкно-
венной программкой на БЕЙСИК'е:
10 LET adr1=30000:LET adr2=30500
20 FOR n=0 TO 2*PI STEP PI/64
30 POKE adr1,128+127*SIN n:POKE adr2,8
8+87*COS n
40 PLOT PEEK adr1,PEEK adr2
50 LET adr1=adr1+1:LET adr2=adr2+1:NEXT
n
В результате этого примера в памяти
под адресом 30000 будут координаты X
таблички , а под 30500 - соответственные
ей координаты Y. Более понятливые могут
поэкспериментировать с 30 - ой строкой,
меняя в ней значения SIN и COS и добав-
ляя что-то свое. Теперь спрайт у вас
есть,табличка есть,осталось самое глав-
ное - коды; перейдем к ним....
Для летания нам необходимо 256 спрай-
тов,сдвинутых циклически таким образом:
сначала сдигается первоначальный спрайт
16 раз вправо,затем на одну точку ниже,
и опать 16 раз , если вы все проделали
правильно,то,выгрузив этот блок спрай-
тов у вас должно получится 256 спрайтов
общей длиной 8192 (длина спрайта * кол-
ичество = общая длина ). Кто не хочет,
либо не может вручную сдигать этакую
армаду спрайтов,привожу программу, кото-
рая все сделает за вас , т.е. правильно
сдвинет все спрайты:
ORG 25000
LD HL,адрес вашего спрайта
LD DE,буфер размером 8192 для сдвину-
того спрайта (допустим #C000)
LD BC,длина спрайта (32)
PUSH DE
LDIR
POP HL
LD C,16
CALL CRUNCH2 <--DEC1
LD B,16
CALL CRUNCH1 <--DEC2
DJNZ DEC2
DEC C
JR NZ,DEC1
RET
PUSH BC <--CRUNCH1
LD BC,32
LDIR
PUSH HL
LD B,16
INC HL <--CR1
LD A,(HL)
RRA
DEC HL
RR (HL)
INC HL
RR (HL)
INC HL
DJNZ CR1
POP HL
POP BC
RET
PUSH BC <--CRUNCH2
PUSH DE
PUSH HL
LD BC,#001E
ADD HL,BC
LD E,(HL)
INC HL
LD D,(HL)
PUSH DE
LD D,H
LD E,L
DEC HL
DEC HL
LDDR
EX DE,HL
POP DE
LD (HL),D
DEC HL
LD (HL),E
POP HL
POP DE
POP BC
RET
После выполнения этой программки ,у вас
под адресом 49152 будут расположены эти
самые сдвинутые спрайты.Значит так, таб-
личка у вас есть,спрайты тоже есть , те-
перь процедура,которая рассчитывает но-
мер спрайта и выводит его из буфера, ку-
да его предварительно копирует.
ORG 30000
LD HL,30000 <-- START1;адрес таблички
по X
LD A,(HL)
AND A
JR NZ,LET1
LD HL,30000
LD (START1+1),HL
JR START1
<-- LET1
LD (START1+1),HL
AND #0F
LD H,0
LD L,A
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE,#C000
ADD HL,DE
PUSH HL
LD HL,30500 <-- START2;адрес таблички
по Y
LD A,(HL)
AND A
JR NZ,LET2
LD HL,30500
LD (START2+1),HL
JR START2
<-- LET2
LD (START2+1),HL
AND #0F
LD H,0
LD L,A
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
POP DE
ADD HL,DE
LD DE,#FFFF-32 ;адрес буфера одного
спрайта (32 байта)
LDI ;32 раза LDI
LD (STACK+1),SP ;запоминаем STACK
LD SP,#4000
LD HL,(65503+00);адрес буфера +0
PUSH HL ;8 раз
LD SP,#4100
LD HL,(65503+02);адрес буфера +2
PUSH HL ;8 раз
LD SP,#4200
LD HL,(65503+04);адрес буфера +4
PUSH HL ;8 раз
LD SP,#4300
LD HL,(65503+06);адрес буфера +6
PUSH HL ;8 раз
LD SP,#4400
LD HL,(65503+08);адрес буфера +8
PUSH HL ;8 раз
LD SP,#4500
LD HL,(65503+10);адрес буфера +10
PUSH HL ;8 раз
LD SP,#4600
LD HL,(65503+12);адрес буфера +12
PUSH HL ;8 раз
LD SP,#4700
LD HL,(65503+14);адрес буфера +14
PUSH HL ;8 раз
LD SP,#4020
LD HL,(65503+16);адрес буфера +16
PUSH HL ;8 раз
LD SP,#4120
LD HL,(65503+18);адрес буфера +18
PUSH HL ;8 раз
LD SP,#4220
LD HL,(65503+20);адрес буфера +20
PUSH HL ;8 раз
LD SP,#4320
LD HL,(65503+22);адрес буфера +22
PUSH HL ;8 раз
LD SP,#4420
LD HL,(65503+24);адрес буфера +24
PUSH HL ;8 раз
LD SP,#4520
LD HL,(65503+26);адрес буфера +26
PUSH HL ;8 раз
LD SP,#4620
LD HL,(65503+28);адрес буфера +28
PUSH HL ;8 раз
LD SP,#4720
LD HL,(65503+30);адрес буфера +30
PUSH HL ;8 раз
.......................................
и так далее вы можете размножать эту
процедуру таким образом чтобы адрес
буфера был с периодом 0 - 30, после 30-
опять 0 и т.д.
В самом конце вы должны поставить так
LD SP,0 <-- STACK ; восстановле-
ние STACK'а
RET
Теперь если вы это запустите в цикле,
то у вас на экране будет летать весьма
красивая штучка,сотоящая из вашего пер-
воначального спрайта.
Послесловие
───────────
Как вы могли заметить , в меню журнала
летает сетка с красивого спрайтом , этот
эффект сделан по точно такому-же алго-
ритму как и этот,вышеприведенный текст.
В приложении журнала есть все необходи-
мые исходники для написания такого эф-
фекта,включая табличку,спрайт , програм-
му - сдвигалку и летание.Вам стоит толь-
ко запустить TASM4.0 (BY XLD) и дерзать!
────────────────────────────────────────
С уважением Баженов Станислав
(AKA ACTIVATOR).
Другие статьи номера:
Похожие статьи:
В этот день... 1 ноября
Dnieprobite #03,
ACNews #13,
ZX Time #10,
Echo #07,
Funeral #1.5,
Info Guide #02,
ZX Guide #02,
Plutonium #14,
Crossroads #07,
ZX Club #09,
Black Crow #02,
Spectrum Expert #01,
C-Net Week #03,
Maximum #46,
Review #01,
Anigdot #46,
Nicron #05,
Spectrum Land #02,
Crysral Dream #01,
Platinum #02,
Oberon #02,
Echo #01,
Emulate #03,
ZX Format #01,
Speccy #02,
ZX Panorama #01