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).




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Умора - Сколько будет?...
Новости - David Saphier изобрел полезную утилиту для игроделов, использующих Arcade Game Desinger (AGD).
Железо - Последовательный порт -VCOM- для Спектрума.

В этот день...   26 сентября