|
Анимаци в растровой графике - Перемещение спрайтов двойной высоты.
|
2.1.7. Перемещение спрайтов двойной высоты.
Для перемещения по экрану такого спрайта
подготовим процедуру FN j(x,y,d,l,s,c,n). Все параметры, задаваемые при
вызове процедуры, те же самые, что и в процедуре FN i(), см. с.61.
Листинг 15. Загрузчик иашинного кода процедуры. управляющей перемещением спрайтов двойной высоты.
10 REM *** Загрузчик машинного кода
20 LET adr=52100: LET long=230: LET
check=76012: 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
|
000,
|
042,
|
011,
|
092
|
,017
|
120
|
DATA
|
004,
|
000,
|
025,
|
078
|
,030
|
130
|
DATA
|
008,
|
025,
|
070,
|
025
|
,126
|
140
|
DATA
|
230,
|
003,
|
050,
|
103
|
,204
|
150
|
DATA
|
025,
|
126,
|
050,
|
104
|
,204
|
160
|
DATA
|
025,
|
126,
|
230,
|
001
|
,050
|
170
|
DATA
|
105,
|
204,
|
025,
|
126
|
,230
|
180-
|
DATA
|
001,
|
050,
|
101,
|
204
|
,025
|
190
|
DATA
|
126,
|
017,
|
063,
|
000
|
,033
|
200
|
DATA
|
009,
|
213,
|
025,
|
061
|
,032
|
210
|
DATA
|
252,
|
175,
|
050,
|
102
|
,204
|
220
|
DATA
|
205,
|
093,
|
210,
|
205
|
,086
|
230
|
DATA
|
204,
|
197,
|
229,
|
017
|
,063
|
240
|
DATA
|
000,
|
025,
|
062,
|
021
|
,128
|
250
|
DATA
|
071,
|
205,
|
093,
|
210
|
,205
|
260
|
DATA
|
086,
|
204,
|
225,
|
193
|
,197
|
270
|
DATA
|
229,
|
006,
|
001,
|
118
|
,016
|
280
|
DATA
|
253,
|
225,
|
193,
|
000
|
,000
|
290
|
DATA
|
118,
|
205,
|
196,
|
209
|
,197
|
300
|
DATA
|
229,
|
017,
|
063,
|
000
|
,025
|
310 DATA 062,021,128,071,205 3?0 DATA 196.209.225.193.058
330
|
DATA
|
103,
|
204,
|
254
|
,000,
|
040
|
340
|
DATA
|
019,
|
254,
|
001
|
,040,
|
026
|
350
|
DATA
|
254,
|
002,
|
040
|
,033,
|
005
|
360
|
DATA
|
005,
|
005,
|
120
|
,230,
|
252
|
370
|
DATA
|
040,
|
051,
|
195
|
,041,
|
204
|
380
|
DATA
|
013,
|
013,
|
013
|
,121,
|
230
|
390
|
DATA
|
252,
|
040,
|
040
|
,195,
|
041
|
400
|
DATA
|
204,
|
012,
|
012
|
,012,
|
121
|
410
|
DATA
|
214,
|
231,
|
048
|
,029,
|
195
|
420
|
DATA
|
041,
|
204,
|
004
|
,004,
|
004
|
430
|
DATA
|
120,
|
214,
|
132
|
,048,
|
018
|
440
|
DATA
|
058,
|
102,
|
204
|
,254,
|
000
|
450
|
DATA
|
032,
|
011,
|
058
|
,104,
|
204
|
460
|
DATA
|
061,
|
050,
|
104
|
,204,
|
254
|
470
|
DATA
|
000,
|
032,
|
128
|
,058,
|
105
|
480
|
DATA
|
204,
|
237,
|
067
|
,130,
|
203
|
490
|
DATA
|
254,
|
000,
|
200
|
,118,
|
205
|
500
|
DATA
|
093,
|
210,
|
017
|
,063,
|
000
|
510
|
DATA
|
025,
|
062,
|
021
|
,128,
|
071
|
520
|
DATA
|
11B,
|
205,
|
093
|
,210,
|
201
|
530
|
DATA
|
254,
|
000,
|
200
|
,058,
|
101
|
540
|
DATA
|
204,
|
254,
|
000
|
,200,
|
062
|
550
|
DATA
|
001,
|
050,
|
102
|
,204,
|
201
|
560
|
DATA
|
000,
|
000,
|
001
|
,000,
|
000
|
Листинг 16 Процедура, управляющая перемещением спрайтов двойной высоты.
Адрес Наш-код Метка Мнемоника_Комментарий
СВ82 0000 YXLAST DEFW #0000 ;Последние координаты
;у и X. ;По ним можно ;определить, например, ;где произошла коллизия
Адрес
|
Маш.код
|
Метка
|
Мнемоника
|
Комментарий.
|
СВ84
|
00
|
|
NOP
|
|
|
СВ85
|
2А0В5С
|
|
LD
|
HL,(#5C0B)
|
|
СВ88
|
110400
|
|
LD
|
DE,#0004
|
|
СВ8В
|
19
|
|
ADD
|
HL,DE
|
Ввод параметров
|
СВ8С
|
4Е
|
|
LD
|
C,(HL)
|
|
CB8D
|
1Е08
|
|
LD
|
E, #08
|
из БЕЙСИКа.
|
CB8F
|
19
|
|
ADD
|
HL,DE
|
|
СВ90
|
46
|
|
LD
|
B,(HL)
|
|
СВ91
|
19
|
|
ADD
|
HL,DE
|
Настройка
|
СВ92
|
7Е
|
|
LD
|
A,(HL)
|
|
СВ93
|
Е603
|
|
AND
|
#03
|
программных
|
СВ95
|
3267СС
|
|
LD
|
(DIREC),A
|
|
СВ98
|
19
|
|
ADD
|
HL, DE
|
переменных
|
СВ99
|
7Е
|
|
LD
|
A,(HL)
|
|
СВ9А
|
3268СС
|
|
LD
|
(DISTN),A
|
|
CB9D
|
19
|
|
ADD
|
HL, DE
|
|
СВ9Е
|
7Е
|
|
LD
|
A,(HL)
|
|
CB9F
|
Е601
|
|
AND
|
#01
|
|
СВА1
|
3269СС
|
|
LD
|
(SWTCH),A
|
|
СВА4
|
19
|
|
ADD
|
HL,DE
|
|
СВА5
|
7Е
|
|
LD
|
A,(HL)
|
|
СВА6
|
Е601
|
|
AND
|
#01
|
|
СВА8
|
3265СС
|
|
LD
|
(FLAG) ,A
|
|
СВАВ
|
19
|
|
ADD
|
HL.DE
|
|
СВАС
|
7Е
|
|
LD
|
A,(HL)
|
|
CBAD
|
113F00
|
|
LD
|
DE,#003F
|
Отыскание начала шабло
|
СВВО
|
2109D5
|
|
LD
|
HL,#D509
|
на спрайта по его
|
СВВЗ
|
19
|
LOOP
|
ADD
|
HL.DE
|
номеру.
|
СВВ4
|
3D
|
|
DEC
|
A
|
|
СВВ5
|
20FC
|
|
OR
|
NZ,LOOP
|
|
СВВ7
|
AF
|
|
XOR
|
A
|
Инициализация програм
|
СВВ8
|
3266СС
|
|
LD
|
(COLLIZ) ,A
|
мной переменной.
|
СВВВ
|
CD5DD2
|
BEGIN
|
CALL
|
SPRDRV-P
|
Печать спрайта.
|
СВВЕ
|
CD56CC
|
|
CALL
|
COLTST .Проверка была коллизия
|
;или нет.
Адрес Маш .код Метка Мнемоника_Комментарий
СВС1
|
С5
|
PUSH
|
ВС
|
Временное сохранение
|
СВС2
|
Е5
|
PUSH
|
HL
|
регистров.
|
свсз
|
113F00
|
LD
|
DE,#003F
|
Определение адреса на
|
CBC6
|
19
|
ADD
|
HL.DE
|
чала шаблона второго
|
|
|
|
|
спрайта.
|
СВС7
|
ЗЕ15
|
LD
|
A,#15
|
Увеличение координаты
|
СВС9
|
80
|
ADD
|
А,В
|
у на 21 пункт для опре
|
|
|
|
|
деления координат пе
|
СВСА
|
47
|
LD
|
В, A
|
чати второго спрайта.
|
СВСВ
|
CD5DD2
|
CALL
|
SPRDRV-P
|
Печать 2-го спрайта.
|
СВСЕ
|
CD56CC
|
CALL
|
COLTEST
|
Проверка коллизии.
|
CBD1
|
Е1
|
POP
|
HL
|
восстановление регистров
|
CBD2
|
С1
|
POP
|
ВС
|
со стека без очищения
|
CBD3
|
С5
|
PUSH
|
ВС
|
стека.
|
CBD4
|
Е5
|
PUSH
|
HL
|
|
CBD5
|
0601
|
LD
|
В.#01
|
|
CBD7
|
76
|
HALT
|
|
|
CBD8
|
10FD
|
D3NZ
|
#CBD7
|
Краткая
|
CBDA
|
Е1
|
POP
|
HL
|
|
CBDB
|
С1
|
POP
|
ВС
|
пауза и восстановление
|
CBDC
|
00
|
NOP
|
|
|
CBDD
|
00
|
NOP
|
|
координат 1-го спрайта
|
CBDE
|
76
|
HALT
|
|
|
CBDF
|
CDC4D1
|
CALL
|
SPRDRV- S
|
Стирание первого спрайта
|
СВЕ2
|
С5
|
PUSH
|
ВС
|
Сохранение регистров
|
СВЕЗ
|
Е5
|
PUSH
|
HL
|
на стеке.
|
СВЕ4
|
113F00
|
LD
|
DE,#003F
|
Определение адреса начала
|
СВЕ7
|
19
|
ADD
|
HL,DE
|
шаблона 2-го спрайта.
|
СВЕ8
|
ЗЕ15
|
LD
|
A,#15
|
Смещение на экране
|
СВЕА
|
80
|
ADD
|
А,В
|
на 21 пиксел
|
СВЕВ
|
47
|
LD
|
В,А ;вниэ.
|
СВЕС
|
CDC4D1
|
CALL
|
SPR-DRV-S
|
Стирание второго спрайта.
|
CBEF
|
Е1
|
POP
|
HL
|
восстановление регистров
|
CBFO
|
С1
|
POP
|
ВС
|
|
CBF1
|
ЗА67СС
|
LD
|
A,(DIREC)
|
Направление движения.
|
Адрес Маш.код Метка Мнемоника
CBF4
|
FE00
|
CP
|
#00
|
;Влево?
|
CBF6
|
2813
|
JR
|
Z,LEFT
|
;Переход, если так.
|
CBF8
|
FE01
|
CP
|
#01
|
,Вправо?
|
CBFA
|
281А
|
JR
|
Z,RIGHT
|
;Переход, если так.
|
CBFC
|
FE02
|
CP
|
#02
|
;Вверх?
|
CBFE
|
2821
|
OR
|
Z,UP
|
;Переход, если так.
|
ССОО
|
05
|
DEC
|
В
|
;Последний вариант -
|
СС01
|
05
|
DEC
|
В
|
;вниз. Уменьшаем на
|
СС02
|
05
|
DEC
|
В
|
;3 пункта координату у
|
ССОЗ
|
78
|
LD
|
А,В
|
; Проверка на выход за
|
СС04
|
E6FC
|
AND
|
#FC
|
Пределы экрана.
|
СС06
|
2833
|
JR
|
Z, END
|
;Если выход произошел,
|
|
|
|
|
;заканчиваем работу.
|
СС08
|
С329СС
|
JP
|
CONT
|
;Иначе продолжаем.
|
ССОВ
|
0D
|
LEFT DEC
|
С
|
Уменьшаем на 3 пункта
|
ССОС
|
0D
|
DEC
|
С
|
;координату х.
|
CC0D
|
0D
|
DEC
|
С
|
;
|
ССОЕ
|
79
|
LD
|
А,С
|
;Проверка на выход за
|
CC0F
|
E6FC
|
AND
|
#FC
|
пределы экрана.
|
СС11
|
2828
|
JR
|
Z, END
|
;Если выход произошел.
|
;Иначе продолжаем. Увеличиваем на 3 пункта ;координату х.
;Проверка на выход за ;пределы экрана. :Если
выход произошел, .'заканчиваем работу. ;Иначе продолжаем. ; Увеличиваем
на 3 пункта ;координату у.
; Проверка на выход за ;пределы экрана.
СС13 СС16 СС17 СС18 СС19 СС1А СС1С
СС1Е СС21 СС22 f'C23 JC24 СС25
С329СС
ОС
ОС
ОС
79
D6E7 ЗОЮ
С329СС
04
04
04
78
D684
JP
INC
INC
INC
LD
SUB
JR
JP
INC
INC
INC
LD
SUB
CONT
С С С
А,С #E7
NC,END
CONT В В В
А,В #84
Адрес Маш.код Метка Мнемоника
ЗА66СС
FE00
200В
ЗА68СС
3D
3268СС
FE00
2080
ЗА69СС
ED4382CB
FE00
С8
76
CD5DD2
СС49 СС4С CC4D CC4F СС 50 СС51 СС52
LD
ADD
LD
ADD
LD
HALT CALL
RET
113F00 19
ЗЕ15 80 47 76
CD5DD2
СС29 СС2С СС2Е СС30 ССЗЗ СС 34 СС37 СС39 ССЗВ ССЗЕ
СС42 СС44 СС45 СС46
LD
CP
3R
LD
DEC
LD
CP
JR
LD
LD
CP RET HALT CALL
A,(COLLIZ) #00
NZ,END A, (DISTN) A
(DISTN), A #00
NZ,BEGIN A, (SWTCH) (YXLAST) ,ВС
#00 z
SPRDRV-P
DE,#003F HL.DE A,#15
A,В
B,A
SPRDRV-P ;Если выход произошел, ;заканчиваем
работу. ;Проверяем, была коллизия или нет. ;Если была, то на выход
.-Иначе продолжаем работу. ;Уменьшаем дистанцию ;перемещения спрайта.
;Если не весь путь пока ;пройден - возврат. ;Проверяем параметр а.
;Запомнили последние ;координаты. ;Если в=0, то можно ;выходить из
процедуры.
Иначе надо напечатать спрайт последний раз. Печать верхней половины. Переход к нижней половине спрайта.
Печать нижней половины спрайта.
Окончательный выход.
СС56 FE00 COLTST CP #00
СС58 С8 RET Z
СС59 ЗА65СС
LD A,(FLAG) CP #00
СС5С FE00
;Проверка на ноль и возврат, если коллизии не ;было.
;Если была, проверяем ;флаг детекции коллизии. ;Если он выключен, нет
Адрес Маш.код Метка Мнемоника
Комментарий.
СС5Е
|
С8
|
|
RET
|
Z
|
;вопросов и возврат.
|
CC5F
|
ЗЕ01
|
|
LD
|
A,#01
|
; Иначе включаем перемен'
|
СС61
|
3266СС
|
|
LD
|
(COLLIZ) ,A
|
;ную, фиксирующую факт
|
|
|
|
|
|
;коллизии.
|
СС64
|
С9
|
|
RET
|
|
;Возврат
|
СС65
|
00
|
FLAG
|
DEFB
|
00
|
|
СС66
|
00
|
COLLIZ
|
DEFB
|
00
|
|
СС67
|
00
|
DIREC
|
DEFB
|
00
|
|
СС68
|
00
|
DISTN
|
DEFB
|
00
|
|
СС69
|
00
|
SWTCH
|
DEFB
|
00
|
|
|
|