X-Files #02
31 марта 1998

Программирование - Эффект "Летающий спрайт".

<b>Программирование</b> - Эффект
==============================>
^|||||| ПРОГРАММИРОВАНИЕ ||||||`
&\\\\\\\\\\\\\\\@
________________________________
Лимонов Константин (Smoke/CLV). 
________________________________
Привет всем поклонникам ассем-  
блера! В этом номере журнала,я  
(Smoke) хочу предложить Вашему  
вниманию процедуру небольшого,но
весьма выразительного эффекта - 
"ЛЕТАЮЩИЙ СПРАЙТ"!              
________________________________
Такой эффект Вы,наверняка,видели
в куче всяких INTRO и MUSICDEMO.
На ассемблере эти процедуры выг-
лядят по-разному,но принцип дей-
ствия у них почти один и тот же.
Я представляю свой вариант.Коне-
чно,он далеко не самый лучший и 
эффективный,но зато самый прос- 
той,и понятный каждому начинаю- 
щиму кодеру.Все строки программы
пронумерованы и Вы сможете пос- 
мотреть подробный комментарий к 
каждой из них после текста самой
программы.Итак приступим...     
________________________________
FLY     LD      DE,#0000      00
        CALL    CL_SP         01
PTX     LD      HL,POX        02
        LD      A,(HL)        03
        CP      #FF           04
        JR      NZ,LIP1       05
        LD      HL,POX        06
        LD      (PTX+#01),HL  07
        JR      PTX           08
LIP1    LD      D,A           09
PTY     LD      HL,POY        10
        LD      A,(HL)        11
        CP      #FF           12
        JR      NZ,LIP2       13
        LD      HL,POY        14
        LD      (PTY+#01),HL  15
        JR      PTY           16
LIP2    LD      E,A           17
        CALL    PLOT          18
        LD      (FLY+#01),HL  19
        PUSH    HL            20
        LD      DE,SPSIZE     21
        LD      HL,SPRT-SSIZE 22
LIP3    ADD     HL,DE         23
        DJNZ    LIP3          24
        POP     DE            25
        CALL    GET_SP        26
        LD      HL,(PTX+#01)  27
        INC     HL            28
        LD      (PTX+#01),HL  29
        LD      HL,(PTY+#01)  30
        INC     HL            31
        LD      (PTY+#01),HL  32
        RET                   33
PLOT    LD      A,#AF         34
        SUB     E             35
        AND     A             36
        RRA                   37
        SCF                   38
        RRA                   39
        AND     A             40
        RRA                   41
        XOR     E             42
        AND     #F8           43
        XOR     E             44
        LD      H,A           45
        LD      A,D           46
        RLCA                  47
        RLCA                  48
        RLCA                  49
        XOR     E             50
        AND     #C7           51
        XOR     E             52
        RLCA                  53
        RLCA                  54
        LD      L,A           55
        LD      A,D           56
        AND     #07           57
        LD      B,A           58
        INC     B             59
        RET                   60
GET_SP  LD      B,VIS*#08     61
LIP4    PUSH    DE,BC         62
        LD      B,DLINA       63
LIP4_X  PUSH    BC            64
        LDI                   65
        POP     BC            66
        DJNZ    LIP4_X        67
        POP     BC,DE         68
        CALL    DE_LINE       69
        DJNZ    LIP4          70
        RET                   71
CL_SP   LD      BC,VIS*#800   72
LIP5    PUSH    BC,DE         73
        XOR     A             74
        LD      B,DLINA       75
LIP6    LD      (DE),A        76
        INC     DE            77
        DJNZ    LIP6          78
        POP     DE,BC         79
        CALL    DE_LINE       80
        DJNZ    LIP5          81
        RET                   82
;-------------------------------
DE_LINE INC     D             83
        LD      A,D           84
        AND     #07           85
        RET     Z             86
        LD      A,E           87
        ADD     A,#20         88
        LD      E,A           89
        RET     C             90
        LD      A,D           91
        SUB     #08           92
        LD      D,A           93
        RET                   94
;-------------------------------
SPRT    INCBIN  SPRITES       95
POX     INCBIN  COORD-X       96
POY     INCBIN  COORD-Y       97
;-------------------------------
Теперь рассмотрим эту процедуру 
более подробно.Итак,начнем с 0-й
строки.В этой строке в регистро-
вую пару DE загружается адрес в
экранной области,где в данный   
момент находится спрайт.Затем,в 
строке 01 вызывается процедура  
стирания спрайта.При этом,изоб- 
ражение находящееся под спрайтом
теряется.Поэтому лучше будет,ес-
ли Вы не будете распологать на  
месте,где будет "летать" спрайт,
какую-то графическую информацию.
В строке 02,в регистровую пару  
HL засылается адрес расположения
таблицы координат по оси 'X'.
(О том,как готовить таблицы ко- 
ординат,Вы прочтете ниже).      
В аккумулятор загружается коор- 
дината из таблицы и производится
проверка на конец таблицы (Кодом
конца таблицы является число    
#FF (255 DEC)).Если это конец   
таблицы,то строка 02 модернизи- 
руется таким образом,что в ре-  
гистровой паре HL устанавливает-
ся начало таблицы координат.    
Если же это одна из координат,то
происходит переход на строку 09.
Полученная X-координата здесь   
переносится в регистр D.Потом   
происходит аналогичная загрузка 
и проверка координаты Y.При пе- 
реходе к строке 17,мы имеем в   
регистре D координату X,а в ре- 
гистре E координату Y.Далее,в 18
строке производится вызов проце-
дуры PLOT.Она занимает строки с 
34-й по 60-ю.Процедура PLOT за- 
нимается расчетом адреса в эк-  
ранной области при координатах, 
заданных в пикселах.В регистро- 
вой паре HL она возвращает адрес
в экранной области,а в регистре 
B номер спрайта,который должен в
этот момент печататься на экране
монитора.Внимание! Программа ис-
пользует 8 спрайтов одинаковой  
ширины и высоты,но каждый из    
спрайтов сдвинут относительно   
предыдущего на один пиксел впра-
во.Это необходимо для плавного  
перемещения спрайта влево и     
вправо.Почему спрайтов восемь???
Да,потому что один байт состоит 
из восьми битов! Подготовить    
такой набор спрайтов можно,в    
принципе,в ART-STUDIO,но лучше  
использовать для этого,например,
программу группы Digital Reality
- "SpriteLand v1.xx".Но учтите,
что при здвиге спрайта,его шири-
на увеличится на один символ (!)
Помните об этом! При работе про-
граммы также надо знать длину   
одного спрайта в байтах.        
После вычисления адреса коорди- 
нат,он заносится в строку 00,где
он необходим для стирания спрай-
та.После этого этот же адрес от-
правляется на стек,а в строках с
21-й по 24-ю происходит поиск   
нужного спрайта из таблицы и по-
том,восстановив адрес печати,в  
строке 26,производится вызов    
процедуры печати спрайта.       
Процедура печати спрайта на эк- 
ране занимает строки с 61-й по  
71-ю.Она проста до предела.В    
строке 61 в регистр B загружает-
ся высота Вашего спрайта в зна- 
коместах умноженная на восемь.  
Ведь в одном знакоместе 8-мь ли-
ний,не так ли? В следующей стро-
ке сохраняем регистры DE и BC,а 
потом организуется еще один цикл
для печати каждой строки спрай- 
та.В принципе,Вы можете раскрыть
этот цикл стерев строки с 63-й  
по 67-ю,а вместо этого наберите 
в этом месте столько команд LDI,
сколько знакомест в ширину зани-
мает Ваш спрайт.Далее,в строке  
68-й,восстанавливаются регистры 
BC и DE,а потом идет вызов про- 
цедуры расчета адреса печати    
следующей линии спрайта,находя- 
щейся под предыдущей.Эта проце- 
дура настолько известна и прос- 
та,что описывать принцип ее ра- 
боты просто бессмысленно.Лучше  
читайте книги "Инфорком'А":     
"Элементарная графика","Приклад-
ная графика" и "Динамическая    
графика".Ну и,конечно,ZX-РЕВЮ!  
Со строки 72-й по 82-ю идет про-
цедура стирания спрайта.Она ра- 
ботает по тому же принципу,что и
процедура печати спрайта.Ну,во- 
общем,разберетесь! А то я сейчас
помру за клав'ой от такого умс- 
твенного напряжения.            
          ____________       
Ну пора рассказать Вам как сде- 
лать таблицы координат по кото- 
рым будет "летать" Ваш спрайт.  
В приложении журнала Вы найдете 
небольшую программу на Бейсике, 
которая поможет Вам на первых   
порах.Потом,на ее основе,Вы мо- 
жете создать что-то свое.Она на-
зывается - LISSADGU,и строит,так
называемые,фигуры Лиссажу.Чтобы 
понимать о чем идет речь,необхо-
димо хотя бы немного знать элек-
тротехнику.Так вот,объекты,кото-
рые появятся в результате работы
программы на экране,и есть те   
самые фигуры Лиссажу.Программа  
имеет некоторые переменные:     
________________________________
'K' - кратность.                
'G' - фазовый сдвиг.            
'A1' и 'A2' - амплитуды.        
________________________________
Попробуйте ввести,например,такие
параметры:K[5,G[0,A1[110,A2[70, 
или такие:K[2,G[1,A1[90,A2[75; и
сразу все будет понятно! Только 
запомните одно условие - спрайт 
будет печататься начиная от вер-
хнего левого угла,и именно в тех
точках,которые будут изображены 
на экране! Так что следите за   
тем,чтобы Ваш спрайт не вылез за
край экрана (на бордюр! Шутка!)!
Делайте соответственный отступ  
на столько пикселов,сколько име-
ет в ширину Ваш спрайт! Ну а по-
сле того,как программка предло- 
жит Вам сохранить созданные таб-
лицы на диск,Вы можете спокойно 
подставлять их имена в ассембле-
рный текст,в строки 96 и 97.А в 
строку 95 подставьте имя создан-
ной Вами таблицы спрайтов.И на  
этом,пожалуй,можно было бы за-  
кончить.Good luck,young coders! 
                                
                ________________
CUL8R!          Written by Smoke
                  18/11/97-00:07
                ________________
P.S. Имя ассемблерного файла на 
диске:(SPRFLY).   



Другие статьи номера:

От редакции - Почему так долго не было журнала?.. Авторы журнала Speccy ушли на PC.

Программирование - Эффект "Летающий спрайт".

Музыкальная шкатулка - Интервью, взятое у JAM'а.

Музыкальная шкатулка - О глюках музыкальных редакторов: PT2. Конкурс на лучшую мелодию.

Авторская разработка - Презентация нового копировщика CLV COPIER v1.0, и программы записывающей цифровой звук DSRv2.0.

Реклама - Реклама и объявления.

Почтовый ящик - О народном проекте - PROGRESS MEGADEMO.

UFOлогия - Конкурс на лучший рассказ (X-FILES...)

Постскриптум - О том, что будет в следующем номере.


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

Похожие статьи:
Netus - Список BBS сети NETUS.
Аперативчик - Новогодний выпуск DEJA VU...
Новенький - Groove - как у меня появился Speccy.
Обратная связь - контакты редакции.
Умора - Несколько признаков того, что вам необходимо воздержаться от общения с компьютером.

В этот день...   20 апреля