X-Files
#02
31 марта 1998 |
|
Программирование - Эффект "Летающий спрайт".
==============================> ^|||||| ПРОГРАММИРОВАНИЕ ||||||` &\\\\\\\\\\\\\\\@ ________________________________ Лимонов Константин (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).
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября