|
Анимаци в растровой графике - Полная анимация спрайтов.
|
2.1.8. Полная анимация спрайтов.
До сих пор мы занимались только перемещением
спрайтов. Это в какой то степени является динамической графикой. но все
таки не совсем, поскольку так можно изображать далеко не все объекты.
Этот метод был хорош для движения самолетов, кораблей, ав томобилей,
локомотивов и пр. технических устройств. Большинство же объектов живой
природы в процессе перемещения меняют не только свои координаты, но и
свою форму. Поэтому для того, чтобы, например, изобразить скачущего
всадника, нам надо не только обеспечить перемещение спрайта по экрану.
Но и выполнить переключение нескольких спрайтов, в которых изображены
разные фазы движения.
Анимация, как и большинство прочих технологий в
компьютерной графике, связана с обманом зрения. Быстрая смена
нескольких статичных изображений создает иллюзию движения. Но анимация
может быть исполнена и без движения, представьте себе, например
человечка, подпрыгивающего на одном месте.
Как только Вы начнете ставить свои эксперименты. Вы увиди те, что даже очень малые изменения в спрайтах дают весьма ощу тимые результаты. Посмотрите на кадры наездника, приведенные на рис. 17. Практически вое тело лошади и сам наездник остаются неподвижны. Изменения касаются только ног и хвоста. Если 6ej мы попробовали внести изменения и в положение тела, то результирующая последовательность кадров была бы очень неплавной.
Во многих случаях Вам вполне достаточно иметь
два кадра, изображающих две фазы движения, и переключать их с тем,
чтобы получить анимационный эффект. Но мы здесь рассмотрим более общий
случай и подготовим процедуру, позволяющую иметь столько кадров,
сколько нам понадобится, правда не более, чем есть в таблице спрайтов.
Кроме прочих параметров, рассмотренных в вышеприведенных процедурах,
здесь появятся два новых параметра -f - количество кадров (frames) в анимационной последовательности и v (velocity)
- скорость анимации. Обратите внимание на этот параметр. Он интересен
для постановки собственных экспериментов. Изменяя его, можно достигать
самых разных результатов.
Рис. 17 Пять фаз движения спрайта
Формат процедуры: FN k(x,y,a,l,s,f,c,v,ii)
х,у - координаты исходной позиции спрайта. Они относятся к левому верхнему углу и задаются в пикселах.
d - direction - параметр, определяющий направление перемещения.
d=0 - перемещение справа налево. d=l - перемещение слева направо. d=2 - перемещение снизу вверх. d=l - перемещение сверху вниз.
1 - параметр, определяющий дистанцию, иа
которую перемещается спрайт. За единицу принято перемещение на три
пиксела. Таким образом, если установить здесь например число 20, то
спрайт продвинется на 60 пикселов и остановится.
а - switch - параметр, определяющий остается
спрайт на экране после окоичаиия перемещения или иет. Если s=0, то он
останется на экране. Если 6=1, то спрайт исчезнет.
f - количество кадров в анимациониой последовательности. Оно не может быть больше, чем число спрайтов в таблице (=<10)
с - collision - флаг детекции коллизии. Если
его включить (с=1), то при столкновении с любым препятствием (со
включенными пикселами экрана) спрайт остановится после того, как три
пиксела спрайта "наедут" на препятствие. Если его отключить (с=0), то
спрайт будет проходить через любое препятствие.
v - скорость анимации (l<=v<-255, самая медленная).
п - номер первого спрайта из Вашей кадровой
последовательности. Если у Вас в таблице спрайтов задано несколько
табло-нов, то здесь достаточно указать на нужный Ван номер спрайта.
Листинг 17 Загрузчик машинного кода процедуры анимации спрайта-
10 REM »»» Загрузчик машинного кода
20 LET adr=51700: LET long=275: LET
check=82463: LET sum=0 30 FOR k=0 TO long-1: READ a 40 POKE (adr+k),a:
LET sum=sum+a 50 NEXT k
60 IF sumocheck THEN PRINT ••??••: STOP 100 REM *** Данные для машинного кода
110
|
DATA
|
042
|
,011
|
,092,
|
017
|
,004
|
120
|
DATA
|
000
|
,025
|
,078,
|
030
|
,008
|
1^30
|
DATA
|
025
|
,070
|
,025,
|
126
|
,230
|
140
|
DATA
|
003
|
,050
|
,209,
|
202
|
,025
|
150
|
DATA
|
126
|
,050
|
,211,
|
202
|
,025
|
160
|
DATA
|
126
|
,230
|
,001,
|
050
|
,212
|
170
|
DATA
|
202
|
,025
|
,126,
|
050
|
,216
|
180
|
DATA
|
202
|
,050
|
,215,
|
202
|
,025
|
190
|
DATA
|
126
|
,230
|
,001,
|
050
|
,210
|
200
|
DATA
|
202
|
,025
|
,126,
|
050
|
,217
|
210
|
DATA
|
202
|
,025
|
,126,
|
017
|
,063
|
220
|
DATA
|
000
|
,033
|
,202,
|
212
|
,025
|
230
|
DATA
|
061
|
,032
|
,252,
|
034
|
,213
|
240
|
DATA
|
202
|
,058
|
,215,
|
202
|
,061
|
250
|
DATA
|
050
|
,215
|
,202,
|
254
|
,000
|
260
|
DATA
|
032
|
,009
|
,058,
|
216
|
,202
|
270
|
DATA
|
050
|
,215
|
,202,
|
042
|
,213
|
280
|
DATA
|
202
|
,017
|
,063,
|
000
|
,025
|
290
|
DATA
|
205
|
,093
|
,210,
|
254
|
,000
|
300 DATA 040.019.058.210.202
310 DATA 254,000,040,012,038 320 DATA
212,202,198,001,230 330 DATA 001,050,212,202,024 340 DATA
090,229,213,197,058 350 DATA 217,202,071,017,000 360 DATA
000,033,000,000,237
370 DATA 176,193,209,225,118
380
|
DATA
|
205,
|
196,
|
209,
|
058
|
,209
|
390
|
DATA
|
202,
|
254,
|
000,
|
040
|
,019
|
400
|
DATA
|
254,
|
001,
|
040,
|
026
|
,254
|
410
|
DATA
|
002,
|
040,
|
033,
|
005
|
,005
|
420
|
DATA
|
005,
|
120,
|
230,
|
252
|
,040
|
430
|
DATA
|
045,
|
195,
|
182,
|
202
|
,013
|
440
|
DATA
|
013,
|
013,
|
121,
|
230
|
,252
|
450
|
DATA
|
040,
|
034,
|
195,
|
182
|
,202
|
460
|
DATA
|
012,
|
012,
|
012,
|
121
|
,214
|
470
|
DATA
|
231,
|
048,
|
023,
|
195
|
,182
|
480
|
DATA
|
202,
|
004,
|
004,
|
004
|
,120
|
490
|
DATA
|
214,
|
150,
|
048,
|
012
|
,058
|
500
|
DATA
|
211,
|
202,
|
061,
|
050
|
,211
|
510
|
DATA
|
202,
|
254
|
,000,
|
194,
|
054
|
520
|
DATA
|
202,
|
058
|
,212,
|
202,
|
237
|
530
|
DATA
|
067,
|
242
|
,201,
|
254,
|
ООО
|
540
|
DATA
|
200,
|
118
|
,205,
|
093,
|
210
|
550
|
DATA
|
201
|
001
|
.000,
|
000,
|
001
|
560
|
DATA
|
194,
|
214
|
,001,
|
003,
|
050
|
570
|
DATA
|
231 ,
|
048
|
,022,
|
195,
|
232
|
580
|
DATA
|
202,
|
004
|
,004,
|
004,
|
120
|
590
|
DATA
|
214,
|
150
|
,048,
|
Oil,
|
058
|
600
|
DATA
|
003,
|
203
|
,061,
|
050,
|
003
|
610
|
DATA
|
203
|
,254
|
,000,032,
|
155
|
620
|
DATA
|
058
|
,004
|
,203,237,
|
067
|
630
|
DATA
|
086
|
,202
|
,254,000,
|
200
|
640
|
DATA
|
118
|
,205
|
,093,210,
|
201
|
CLO
|
DATA
|
000
|
.000
|
.000,000.
|
000
|
Листинг 18 Процедура, управляющая аиииацией спрайтов.
Адрес Наш.код Метка Мненоника
C9F2 0000
C9F4 2А0В5С
110400
19
4Е
1Е08
19
46
C9F7 C9FA C9FB C9FC C9FE C9FF CA00
19
СА01 7Е СА02 Е603
СА04 32D1CA
СА07 19
СА08 7Е СА09 32D3CA
CA0C 19
CAOD 7Е CAOE E601
LD HL,(#5С0Б)
DE,#0004
HL,DE
C,(HL)
E, #08
HL,DE
B,(HL)
HL,DE
LD A,(HL)
AND #03
LD (DIREC) ,A
ADD HL,DE
LD A,(HL)
LD (DISTN),A
ADD HL,DE
A,(HL) #01 ;Последние
координаты ;y и x. ;По ним можно ;определить, например, ;где произошла
коллизия ;с препятствием. ;Указание на адрес, в котором располагаются
параметры функции пользо-;вателя FN к() ;Вычисление адреса пер-;вого
параметра. ;Прием параметра х. ;Смещение
ко второму ;параметру. ;Прием параметра у. ;Смещение к третьему
;параметру. ;Прием параметра d. ;Маскирование старших ;битов.
;Выставление программной
;переменной.
;Смещение к четвертому
;параметру.
;Прием параметра 1.
;Выставление программной
;переменной.
;Смещение к пятому
;параметру.
;Прием параметра S-
;Наскирование старших
САЮ 32D4CA
С А 1.1 19
7Е
32D8CA 32D7CA
19
7Е Е601
3PD2CA 19
7Е
СА14 СА15 СА18 СА1В
СА1С CAID
CA1F СА22
СА23 СА24
32D9CA
СА27 19
СА28 7Е
СА29 113F00 СА2С 21CAD4
CA2F 19 CA30 3D
LD (SWTCH).А
ADD HL.DE
LD A,(HL)
LD (FRAMES),A
LD (FRAM-1),A
ADD HL.DE
LD A,(HL)
AND #01
LD (FLAG).A
ADD HL.DE
LD A,(HL)
LD (RATE), A
ADD HL, DE
Адрес Наш.код Метка Мненоника
LD A, (HL)
LD DE,#Q03F ID HL,#D4CA
;битов.
:Выставление программной ;переменной. ;Смещение
к шестому ;параметру. ;Прием параметра f. ;Выставление программных
;переменных. ;Смещение к седьмому ;параметру. ;Прием параметра с.
:Маскирование старших ;битов.
.Выставление переменной. ;Переход к восьмому
;параметру. ;Прием параметра v. ;Выставление программной ;переменной.
;Переход к девятому параметру.
;Прием номера первого ;спрайта из последовательности.
;Длина шаблона спрайта. .Адрес указывает на 126
;байтов ниже, чем начало ;таблицы спрайтов. Каждый спрайт занимает 63
;байта, поэтому адрес ;указывает на две длины ;спрайта ниже, чем начало
• таблицы.
I! Отыскание адреса начала шаблона спрайта по
Адрес Маш.код Метка мнемоника___
СА31 20FC JR NZ,LOOP
СА58 СА5А СА5С CA5F СА61 СА63
FEOO
2 8 ОС
3AD4CA
С601
Е601
32D4CA
САЗЗ
|
22D5CA
|
|
LD
|
(ADRES),HL
|
СА36
|
3AD7CA
|
BEGIN
|
LD
|
A,(FRAM-1)
|
СА39
|
3D
|
|
DEC
|
A
|
САЗА
|
32D7CA
|
|
LD
|
(FRAM-1),A
|
CA3D
|
FEOO
|
|
CP
|
#00
|
CA3F
|
2009
|
|
3R
|
NZ,BYPASS
|
СА41
|
3AD8CA
|
|
LD
|
A,(FRAMES)
|
СА44
|
32D7CA
|
|
LD
|
(FRAM-1),A
|
СА47
|
2AD5CA
|
|
LD
|
HL,(ADRES)
|
СА4А
|
113F00
|
BYPASS
|
LD
|
DE,#003F
|
CA4D
|
19
|
|
ADD
|
HL,DE
|
СА4Е
|
CD5DD2
|
|
CALL
|
SPRDRV P
|
СА51
|
FE00
|
|
CP
|
#00
|
СА53
|
2813
|
|
JR
|
Z,CONT
|
CA5S 3AD2CA
LD A, (FLAG)
#00
Z,CONT A,(SWTCH) A, #01 #01
(SWTCH),A
Комментарий.
его номеру. В результате HL указывает на одну
длину спрайта ниже, чей его истинное положение в таблице. Выставление
программной переменной.
Сколько кадров осталось напечатать? Уменьшить на 1 и запомнить.
Если ие все кадры напечатаны , то обход. Если все, то надо освежить переменную FRAM-1.
Теперь HL указывает точно на начало нужного спрайта в таблице шаблонов .
Вызов процедуры печати спрайта (см. с.44). При
печати спрайта была коллизия с каким-либо объектом иа экране? Если нет,
переход. Если была, надо проверить флаг детекции коллизии. Если он
выключен продолжить работу. Если он включен, подготавливаем выход из
процедуры.
Адрес Наш-код Метка Мнемоника
СА66 185А
СА68 Е5 CONT
СА69 D5
СА6А С5
СА6В 3AD9CA
СА6Е 47
CA6F 110000
СА72 210000
СА75 EDB0
СА77 С1
СА78 D1
СА79 Е1
СА7А 76
СА7В CDC4D1
СА7Е 3AD1CA
СА81 FE00
СА83 2813
СА85 FE01
СА87 281А
СА89 FE02
СА8В 2821
CA8D СА8Е CA8F СА90
СА91 СА93
JR END PUSH HL PUSH DE PUSH ВС LD A,(RATE) LD В, A LD DE,#0000 LD HL,#0000 LDXR
POP ВС POP DE POP HL HALT
CALL SPRDRV-S
LD A,(DIREC)
CP #00
JR Z,LEFT
CP #01
JR Z,RIGHT
CP #02
JR Z,UP
DEC В
DEC В
DEC В
LD А,В
AND #FC
JR Z,END
Сохранение основных регистров от повреждения командой LDIR. Скорость анимации.
Это не блочная переброска по команде LDIR, а
обыкновенная затяжка времени. Чем больше число в регистре В, тем
длительнее пауза. Восстановление регистров со стека
;Краткая пауза. ;Стирание спрайта (см. ;стр. 40)
;В каком направлении ;движется спрайт? ;Влево?
;Переход, если так. ;Вправо?
;Переход, если так. ;Вверх?
;Переход, если так. ;Во всех прочих случаях остается только ;движение вниз .•Уменьшение координаты :у на три пункта.
;Проверка на выход за ;пределы экрана. ;Конец работы, если так.
/on.ec Наш.кои М»т»а_Щ—аМММ_КйПИИИУИЙ
СА95
|
СЗВ6СА
|
|
JP
|
NEXT
|
Иначе продолжаем.
|
СА98
|
0D
|
LEFT
|
DEC
|
С
|
Уменьшение координаты,
|
СА99
|
0D
|
|
DEC
|
С
|
х иа три пункта.
|
СА9А
|
0D
|
|
DEC
|
С
|
|
СА9В
|
79
|
|
LD
|
А,С
|
Проверка на выход за
|
СА9С
|
E6FC
|
|
AND
|
#FC
|
пределы экрана.
|
СА9Е
|
2822
|
|
JR
|
Z,END
|
Конец работы, если так
|
СААО
|
СЗВ6СА
|
|
JP
|
NEXT
|
Иначе продолжаем.
|
СААЗ
|
ОС
|
RIGHT
|
INC
|
С
|
увеличение координаты
|
САА4
|
ОС
|
|
INC
|
С
|
х на три пункта
|
САА5
|
ОС
|
|
INC
|
С
|
|
САА6
|
79
|
|
LD
|
А,С
|
Проверка на выход за
|
САА7
|
D6E7
|
|
SUB
|
#E7
|
пределы экрана.
|
САА9
|
3017
|
|
JR
|
NC,END
|
Конец работы, если так
|
СААВ
|
СЗВ6СА
|
|
JP
|
NEXT
|
Иначе продолжаем.
|
СААЕ
|
04
|
UP
|
INC
|
В
|
увеличение координаты
|
CAAF
|
04
|
|
INC
|
В
|
у на три пункта.
|
САВО
|
04
|
|
INC
|
В
|
|
САВ1
|
78
|
|
LD
|
А,В
|
Проверка на выход за
|
САВ2
|
D696
|
|
SUB
|
# 96
|
пределы экрана.
|
САВ4
|
300С
|
|
JR
|
NC,END
|
Конец работы, если так
|
CAB 6
|
3AD3CA
|
NEXT
|
LD
|
A,(DISTN)
|
Уменьшаем счетчик
|
САВ9
|
3D
|
|
DEC
|
A
|
пройденного расстояния
|
САВА
|
32D3CA
|
|
LD
|
(DISTN),A
|
|
CABD
|
FEOO
|
|
CP
|
#00
|
Проверяем его на конец
|
CABF
|
С236СА
|
|
JP
|
NZ,BEGIN
|
Если не конец, то возврат.
|
С АС 2
|
3AD4CA
|
END
|
LD
|
A. (SWTCH)
|
Проверка параметра s.
|
САС5
|
ED43F2C9
|
LD
|
(YXLAST),BC
|
Запомнили координаты
|
|
|
|
|
|
последней точки в про
|
|
|
|
|
|
граммной переменной.
|
САС9
|
FEOO
|
|
CP
|
#00
|
Если «=0, то ничего больше делать ие надо
|
САСВ
|
С8
|
|
RET
|
Z
|
Окончательный выход.
|
СЛСС
|
76
|
|
HALT
|
|
Если ш=1, напечатаем
|
Адрес Маш.код Метка Иненоиика
CACD CD5DD2 CADO С9
CALL SPRDRV-P RET ;спрайт в последний раз. ;Вызов процедуры печати. ;Выход из процедуры.
Программная переменная, указывающая направление
;перемещения спрайта. ;Флаговая переменная ;флаг детекции коллизии.
Программная переменная, указывающая дистанцию перемещения спрайта.
Параметр s.
;Программная переменная, ;в которой хранится
адрес шаблона спрайта в ;таблице спрайтов. Программная переменная,
;хранящая количество недоказанных спрайтов из ;анимационной
последова-;тельности.
Программная переменная, .хранящая количество ;кадров (спрайтов) в анимационной последователь-;ности.
.Программная переменная, ;хранящая частоту смены ;кадров. Чем она больше, ;тем медленнее анимация.
DIREC DEFB 00
FLAG DEFB 00
DISTN DEFB 00
SWTCH DEFB 00 ADRES DEFW 0000
Как же работает эта процедура? Отдельные
спрайты, которых столько же, сколько кадров в анимационной
последовательности, берутся из таблицы спрайтов и по-очереди печатаются
на экране.
Сначала печатается первый спрайт. Далее он
стирается и, вместо того, чтобы напечатать его же со смещением в три
пиксела в заданном направлении, печатается второй спрайт, затем третий
и т д Процесс повторяется до тех пор, пока не будет напечатан последний
спрайт из кадровой последовательности, после чего вновь печатается
первый.
|
|