|
Анимаци в растровой графике - Перемещение спрайтов двойной ширины.
|
2.1.6. Перемещение спрайтов двойной ширины.
Итак, Вы уже убедились, чего можно достичь
путем перемещения по экрану спрайтов размером 24 X 21 пиксел. В целом
это более 500 пикселов и в этом объеме можно выразить очень многое (см.
например некоторые образцы спрайтов в Приложении), но все же легко
представить себе случай, когда этого недостаточно.
К сожалению, "Спектрум" ие та машина, на
которой можно работать со спрайтами очень больших размеров
(недостаточное быстродействие приводит к неплавности перемещений), но
немного увеличить размеры спрайтов все-таки можно. Так, наприиер, можно
представить себе составной спрайт, состоящий как бы из двух спрайтов.
На рис. 16 представлен составной спрайт паровоза, состоящий из двух
отдельных спрайтов.
Рис. 16 Образец спрайта двойной ширины.
ООО
|
000
|
252
|
126
|
075
|
075
|
075
|
075
|
126
|
127
|
098
|
127
|
127
|
127
|
255
|
024
|
036
|
090
|
090
|
036
|
024
|
000
|
128
|
160
|
160
|
255
|
255
|
255
|
000
|
255
|
000
|
255
|
255
|
220
|
162
|
065
|
128
|
136
|
159
|
065
|
034
|
028
|
000
|
024
|
126
|
255
|
255
|
255
|
255
|
000
|
255
|
000
|
255
|
255
|
014
|
017
|
032
|
195
|
196
|
255
|
032
|
017
|
014
|
|
|
ООО
|
000
|
000
|
009
|
255
|
255
|
255
|
001
|
255
|
001
|
255
|
255
|
007
|
008
|
144
|
255
|
098
|
252
|
144
|
008
|
007
|
031
|
015
|
015
|
255
|
255
|
255
|
255
|
255
|
255
|
255
|
255
|
255
|
063
|
159
|
255
|
047
|
036
|
043
|
075
|
132
|
003
|
128
|
000
|
064
|
224
|
224
|
240
|
232
|
232
|
232
|
240
|
224
|
224
|
240
|
217
|
255
|
237
|
146
|
109
|
109
|
146
|
012
|
|
|
Для перемещения по экрану такого спрайта
подготовим процедуру FN i(x,y,d,l,s,c,n). Все параметры, задаваемые при
вызове процедуры, те же самые, что и в процедуре FN g(), см. с. 32.
Единственное отличие связано с параметром п. Если раньше он определял
номер спрайта из таблицы спрайтов, то здесь речь идет уже о двух
спрайтах, а ие об одном и потому ои определяет только номер первого спрайта. Предполагается, что шаблон второго спрайта расположен непосредственно за первым
Листинг 13 Загрузчик машинного кода процедуры, управляющей перемещением спрайтов двойной ширины.
10 REM *** Загрузчик машинного кода
20 LET adr=52400: LET long=235: LET check=77522: LET Bum=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 130 DATA 025,070,025,126,230 140 DATA
003,050,148,205,025 150 DATA 126,050,149,205,025 160 DATA
126,230,001,050,150 170 DATA 205,025,126,230,001 180 DATA
050,146,205,025,126 190 DATA 017,063,000,033,009 200 DATA
213,025,061,032,252
210 DATA 175,050,147,205,205 220 DATA 093,210,205,137,205 230 DATA 197,229,017,063,000 240 DATA 025.062.024.129.079
250
|
DATA
|
205,
|
093,
|
210,
|
205,
|
137
|
260
|
DATA
|
205,
|
225,
|
193,
|
197,
|
229
|
270
|
DATA
|
006,
|
001,
|
118,
|
016,
|
253
|
280
|
DATA
|
225,
|
193,
|
000,
|
000,
|
118
|
290
|
DATA
|
205,
|
196,
|
209,
|
197,
|
229
|
300
|
DATA
|
017,
|
063,
|
000,
|
025,
|
062
|
310
|
DATA
|
024,
|
129,
|
079,
|
205,
|
196
|
320
|
DATA
|
209,
|
225,
|
193,
|
058,
|
148
|
330
|
DATA
|
205,
|
254,
|
000,
|
040,
|
019
|
340
|
DATA
|
254,
|
001,
|
040,
|
026,
|
254
|
350
|
DATA
|
002,
|
040,
|
033,
|
005,
|
005
|
360
|
DATA
|
005,
|
120,
|
230,
|
252,
|
040
|
370
|
DATA
|
059,
|
195,
|
084,
|
205,
|
013
|
380
|
DATA
|
013,
|
013,
|
121,
|
230,
|
252
|
390
|
DATA
|
040,
|
048,
|
195,
|
084,
|
205
|
400
|
DATA
|
012,
|
012,
|
012,
|
121,
|
214
|
410
|
DATA
|
207,
|
048,
|
037,
|
195,
|
084
|
420
|
DATA
|
205,
|
004,
|
004,
|
004,
|
120
|
430
|
DATA
|
214,
|
150,
|
048,
|
026,
|
058
|
440
|
DATA
|
147,
|
205,
|
254,
|
000,
|
040
|
450
|
DATA
|
007,
|
058 .
|
146,
|
205,
|
254
|
460
|
DATA
|
000,
|
032,
|
012,
|
058,
|
149
|
470
|
DATA
|
205,
|
061,
|
050,
|
149,
|
205
|
480
|
DATA
|
254,
|
000,
|
194,
|
230,
|
204
|
490
|
DATA
|
058,
|
150,
|
205,
|
237,
|
067
|
500
|
DATA
|
174,
|
204,
|
254,
|
000,
|
200
|
510
|
DATA
|
118,
|
205,
|
093,
|
210,
|
017
|
520
|
DATA
|
063,
|
000,
|
025,
|
062,
|
024
|
530
|
DATA
|
129,
|
079,
|
118,
|
205,
|
093
|
540 DATA 210,201,254,000,200 550 DATA 062,001,050,147,205 560 DATA 201,000,000,000,000 570 DATA 000.000.000.000.000
ЛИСТИНГ14
Процедура, управляющая перемещением спрайтов двойной ширины.
Адрес Маш .код Метка Мнемоника_Комментарий.
ССАЕ 0000 YXLAST DEFW #0000 .Последние координаты
;у и х- ;По ним можно ;определить, например, ;где произошла коллизия ;с препятствием.
ссво
|
2А0В5С
|
LD
|
HL,(#5C0B)
|
|
ссвз
|
110400
|
LD
|
DE,#0004
|
|
ССВ6
|
19
|
ADD
|
HL.DE
|
|
ССВ7
|
4Е
|
LD
|
C,(HL)
|
Ввод параметров
|
ССВ8
|
1Е08
|
LD
|
E, #08
|
|
ССВА
|
19
|
ADD
|
HL.DE
|
из БЕЙСИКа.
|
ССВВ
|
46
|
LD
|
B,(HL)
|
|
ССВС
|
19
|
ADD
|
HL,DE
|
*
|
CCBD
|
7Е
|
LD
|
A,(HL)
|
Настройка
|
ССВЕ
|
Е603
|
AND
|
#03
|
|
СССО
|
3294CD
|
LD
|
(DIREC),A
|
программных
|
сссз
|
19
|
ADD
|
HL.DE
|
|
ССС4
|
7Е
|
LD
|
A,(HL)
|
переменных
|
ССС5
|
3295CD
|
LD
|
(DISTN),A
|
|
ССС8
|
19
|
ADD
|
HL,DE
|
|
ССС9
|
7Е
|
LD
|
A,(HL)
|
|
СССА
|
Е601
|
AND
|
#01
|
|
СССС
|
3296CD
|
LD
|
(SWTCH),A
|
|
CCCF
|
19
|
ADD
|
HL.DE
|
|
CCD0
|
7Е
|
LD
|
A,(HL)
|
|
CCD1
|
Е601
|
AND
|
#01
|
|
CCD3
|
3292CD
|
LD
|
(FLAG),A
|
|
CCD6
|
19
|
ADD
|
HL.DE
|
|
CCD7
|
7Е
|
LD
|
A,(HL)
|
|
CCD8
|
113F00
|
LD
|
DE,#003F
|
Отыскание начала табло
|
CCDB
|
2109D5
|
LD
|
HL,#D509
|
на спрайта по его
|
Адрес
|
Маш.код
|
Метка
|
Мнемоника
|
CCDE
|
19
|
LOOP
|
ADD
|
HL.DE
|
CCDF
|
3D
|
|
DEC
|
A
|
ССЕО
|
20FC
|
|
3R
|
NZ,LOOP
|
ССЕ2
|
AF
|
|
XOR
|
A
|
ССЕЗ
|
3293CD
|
|
LD
|
(COLLIZ)
|
ССЕ6
|
CD5DD2
|
BEGIN
|
CALL
|
SPRDRV-P
|
ССЕ9
|
CD89CD
|
|
CALL
|
COL-ON
|
ССЕС
|
С5
|
|
PUSH
|
ВС
|
CCED
|
Е5
|
|
PUSH
|
HL
|
ССЕЕ
|
113F00
|
|
LD
|
DE,#003F
|
CCF1
|
19
|
|
ADD
|
HL.DE
|
CCF2
|
ЗЕ18
|
|
LD
|
A, #18
|
CCF4
|
81
|
|
ADD А,С
|
CCF5
|
4F
|
|
LD
|
C,A
|
CCF6
|
CD5DD2
|
|
CALL
|
SPRDRV-P
|
CCF9
|
CD89CD
|
|
CALL
|
COL-ON
|
CCFC
|
Е1
|
|
POP HL
|
CCFD
|
С1
|
|
POP
|
ВС
|
CCFE
|
С5
|
|
PUSH
|
ВС
|
CCFF
|
Е5
|
|
PUSH
|
HL
|
CDOO
|
0601
|
|
LD
|
В,#01
|
CD02
|
76 LOOP-1
|
HALT
|
|
CD03
|
10FD
|
|
DJNZ
|
LOOP-1
|
CD05
|
Е1
|
|
POP
|
HL
|
CD06
|
С1
|
|
POP
|
ВС
|
CD07
|
00
|
|
NOP
|
|
CD08
|
00
|
|
NOP
|
|
CD09
|
76
|
|
HALT
|
|
CDOA
|
CDC4D1
|
|
CALL
|
SPRDRV-S
|
CDOD
|
С5
|
|
PUSH
|
ВС
|
Комментарий.
номеру.
Инициализация программной переменной. Печать
спрайта. Включение переменной COLLIZ, если произошло столкновение
спрайта с каким-либо объектом. Временное сохранение регистров.
Определение адреса начала шаблона второго спрайта.
Увеличение координаты X на 24 пункта для печати второго спрайта. Печать второго спрайта. Выставление переменной COLLIZ.
Восстановление регистров со стека без очищения стека.
Краткая
пауза и восстановление
координат 1-го спрайта
Стирание первого спрайта Сохранение регистров
Адрес Маш, код Метка Мнемоника_Комментарий -
CD0E
|
Е5
|
|
PUSH
|
HL
|
;на стеке.
|
CD0F
|
113F00
|
|
LD
|
DE,#003F
|
Определение адреса нача
|
CD12
|
19
|
|
ADD
|
HL,DE
|
ла шаблона 2-го спрайта.
|
CD13
|
ЗЕ18
|
|
LD
|
A,#18
|
;смещение на экране
|
CD15
|
81
|
|
ADD
|
А,С
|
;на три знакоместа
|
CD16
|
4F
|
|
LD
|
С.A
|
;вправо
|
CD17
|
CDC4D1
|
|
CALL
|
SPRDRV-S
|
;Стирание второго спрайта
|
CD1A
|
Е1
|
|
POP
|
HL
|
:Восстановление регистров
|
CD1B
|
С1
|
|
POP
|
ВС
|
;
|
CD1C
|
3A94CD
|
|
LD
|
A,(DIREC)
|
;Направление движения.
|
CD1F
|
FE00
|
|
CP
|
#00
|
;Влево?
|
CD21
|
2813
|
|
OR
|
Z,LEFT
|
;Переход, если так.
|
CD23
|
FE01
|
|
CP
|
#01
|
;Вправо?
|
CD25
|
281А
|
|
JR
|
Z,RIGHT
|
;Переход, если так.
|
CD27
|
FE02
|
|
CP
|
#02
|
;Вверх?
|
CD29
|
2821
|
|
JR
|
Z,UP
|
;Переход, если так.
|
CD2B
|
05
|
|
DEC
|
в
|
;Последний вариант
|
CD2C
|
05
|
|
DEC
|
в
|
;вниэ. Уменьшаем на
|
CD2D
|
05
|
|
DEC
|
в
|
;3 пункта координату у
|
CD2E
|
78
|
|
LD
|
А,В
|
;Проверка на выход за
|
CD2F
|
E6FC
|
|
AND
|
#FC
|
.пределы экрана.
|
CD31
|
283В
|
|
JR
|
Z, END
|
;Если выход произошел, заканчиваем работу.
|
CD33
|
C354CD
|
|
JP
|
CONT
|
;Иначе продолжаем.
|
CD36
|
0D
|
LEFT
|
DEC
|
С
|
;Уменьшаем на 3 пункта
|
CD37
|
0D
|
|
DEC
|
С
|
.координату х.
|
CD38
|
0D
|
|
DEC
|
С
|
;
|
CD39
|
79
|
|
LD
|
А,С
|
;Проверка на выход за
|
CD ЗА
|
E6FC
|
|
AND
|
#FC
|
;пределы экрана.
|
CD3C
|
2830
|
|
JR
|
Z,END
|
;Если выход произошел, заканчиваем работу.
|
CD3E
|
C354CD
|
|
JP
|
CONT
|
;Иначе продолжаем.
|
CD41
|
ОС
|
RIGHT
|
INC
|
С
|
увеличиваем на 3 пункта
|
CD42
|
ОС
|
|
INC
|
С
|
;координату х.
|
CD43
|
ОС
|
|
INC
|
С
|
|
Адрес Маш код Метка Мнемоника
79
D6CF 3025
C354CD
04
04
04
78
D696 301А
3A93CD
FE00
2807
3A92CD
FE00
CD60 200С
3A95CD
3D
3295CD FE0O
С2Е6СС
CD6E 3A96CD END CD71 ED43AECC
FE00 С8
76
CD5DD2
CD44 CD45 CD47
CD4 9 CD4C CD4D CD4E CD4F CD50 CD52
CD54 CD57 CD59 CD5B CD5E
А,С *CF
NC,END
3P CONT
INC В
INC В
INC В
LD А,В
SUB #96
JR NC,END
A,(COLLIZ) #00
Z,NEXT A,(FLAG) #00
JR NZ,END
A,(DISTN) A
(DISTN),A #00
NZ,BEGIN
A (SWTCH) (YXLAST),BC
CP #00 RET Z HALT
CALL SPRDRV-P
Проверка на выход за пределы экрана. Если выход
произошел, заканчиваем работу. Иначе продолжаем. Увеличиваем на 3
пункта координату у.
Проверка на выход за пределы экрана. Если выход
произошел, заканчиваем работу. Проверяем, была коллизия или нет. Обход,
если нет. Если была, то надо проверить состояние флага детекции
коллизии. Если он был включен, то коллизия приводит к окончанию работы.
Иначе продолжаем работу. Уменьшаем дистанцию перемещения спрайта.
Если не весь путь пока пройден - возврат. Проверяем параметр а. Запомнили последние координаты. Если в=0, то можно выходить из процедуры.
Печать левой половины спрайта в последний раз
Адрес
|
Маш.код
|
Метка
|
Мнемоника
|
Комментарий.
|
CD7C
|
113F00
|
|
LD
|
DE,#003F
|
Переход к правой
|
CD7F
|
19
|
|
ADD
|
HL,DE
|
половине
|
CD80
|
ЗЕ18
|
|
LD
|
A,#18
|
спрайта.
|
CD82
|
81
|
|
ADD
|
А,С
|
|
CD83
|
4F
|
|
LD
|
С,A
|
|
CD84
|
76
|
|
HALT
|
|
|
CD85
|
CD5DD2
|
|
CALL
|
SPRDRV-P
|
Печать правой половины
|
|
|
|
|
|
спрайта.
|
CD88
|
С9
|
|
RET
|
|
Окончательный выход
|
CDS 9
|
FEOO
|
COL-ON
|
CP #00
|
Если произошла колли
|
CD8B
|
С8
|
|
RET
|
Z
|
зия , эта процедура
|
CD8C
|
ЗЕ01
|
|
LD
|
A, #01
|
включает переменную
|
CD8E
|
3293CD
|
|
LD
|
(COLLIZ) ,A
|
COLLIZ.
|
CD91
|
С9
|
|
RET
|
|
|
CD92
|
00
|
FLAG
|
DEFB
|
00
|
Флаг детекции коллизии.
|
CD93
|
00
|
COLLIZ
|
DEFB
|
00
|
Переменная, фиксирующая
|
|
|
|
|
|
факт прохождения колли
|
|
|
|
|
|
зии .
|
CD94
|
00
|
DIREC
|
DEFB
|
00
|
Направление перемещения
|
CD95
|
00
|
DISTN
|
DEFB
|
00
|
Дистанция перемещения.
|
CD96
|
00
|
SWTCH
|
DEFB
|
00
|
Переключатель s.
|
CD97
|
00
|
|
NOP
|
|
|
CD98
|
00
|
|
NOP
|
|
|
CD99
|
00
|
|
NOP
|
|
|
CD9A
|
00
|
|
NOP
|
|
|
|
|