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).
Other articles:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Similar articles:
В этот день... 21 November