2.1.3 Печать спрайта.
Прежде, чей заниматься анимацией спрайта, попробуем его хотя бы просто распечатать.
В этой книге мы будем придерживаться тех же принципов объединения БЕЙСИКа и машинного кода, которые были нами прмене-ны в книгах "Элементарная графика" и "Прикладная графика" и которые основаны на передаче параметров в машинный код из БЕЙСИКа с помощью функций пользователя FN (), - см. "Элементарная графика" , с. 109-111.
Итак, предположим, что где-то в оперативной
памяти, например начиная с адреса 8PADR (в наших примерах принято
54600) и выше, у Вас хранится таблица иэ нескольких спрайтов.
Предположим для определенности, что в этой таблице всего 10 спрайтов и
вся таблица занимает 63*10=630 байтов.
Процедура FN f(x,y,n) предназначена для печати
спрайта с номером п иэ таблицы спрайтов таким образом, чтобы его
верхний левый угол (позиция печати) приходился на знакоместо экрана с
координатами х и у.
X - горизонтальная координата. Задается в
знакоместах. Поскольку спрайт сам по себе имеет ширину в три
знакоместа, не следует задавать параметр х больше, чем 28.
у - вертикальная координата. Задается в знакоместах. Не может быть более, чем 20.
Листинг 5 Пример использования процедуры печати спрайта.
10 LET adr=54100 20 LET long=75: 30 LET check=60377:
REM адрес загрузки процедуры REM длина процедуры REM контрольная сумма
40 LET sum=0
30 FOR к=0 ТО long-1:
REM счетчик контрольной сунны
READ а: 40 POKE (adr+k),а: 50 LET sum=sum+a
REM ввод данных в компьютер REM формирование машинного кода REM накопление контрольной суммы
60 NEXT к
70 IF Gumocheck THEN PRINT "??": STOP 80 REM
100 REM *** Пример использования процедуры
110 DEF FN f(x,y,n)=USR 54100
120 BORDER 4: PAPER 4: INK 0: CLS
130 FOR p=l TO 10
140 FOR k=l TO 5
150 RANDOMIZE FN f(k*3-3, (k*4)-3, p)
160 NEXT к
170 NEXT p
180 PAUSE 0
190 CLS
200 RANDOMIZE FN f(10,10,9) 210 PAUSE 10
220 RANDOMIZE FN f(10,10,10) 230 PAUSE 0 240 GO TO 200
300 REM *** Данные для машинного кода
310 DATA 042,011,092,001,004
320 DATA 000,009,086,001,008
330 DATA 000,009,094,237,083
340 DATA 148,211,009,126,050
350 DATA 150,211,123,230,024
360 DATA 246,064,103,123,230
370 DATA 007,183,031,031,031
380 DATA 031,130,111,034,146
390 DATA 211,058,150,211,071
400 DATA 017,063.000.033.009
410 DATA 213,025,016,253,237 420 DATA
091.146,211,195,001 430 DATA 212,201,174,072,013 440 DATA
014,003,000,000,000 450 DATA 060,000,000,000,000
Если Вы предварительно потрудитесь и
"закачаете" в буфер спрайтов, начиная с адреса 54600 и далее десяток
шаблонов спрайтов, что займет 630 байтов, то сможете немного
поэкспериментировать с приведенной здесь программой. Для того, чтобы
было с чем "экспериментировать", мы привели несколько шаблонов
спрайтов. Можете также воспользоваться теми спрайтами, которые есть в
Приложении к данной книге.
Строка 10 определяет адрес процедуры печати спрайта. Она передает три параметра в машинный код - координаты х и у,
а также номер спрайта (от 1 до 10) иэ набора, находящегося в буфере.
Строки 130 и 140 обеспечивают циклы, в которых происходит печать
спрайтов.
Строки 200 и 220 демонстрируют пример
простейшей анимации. Спрайт не двигается по экрану, а видоизменяется
стоя на месте. Для того, чтобы Вам увидеть этот эффект, поместите в
свой буфер в качестве девятого и десятого спрайтов какую-либо пару из
приведенных на рис. 1, например "наездника".
Управлять скоростью анимации Вы можете изменяя
параметр в операторе PAUSE. Поэкспериментируйте с ним, добиваясь
наилучшего впечатления.
Рис. 5 Моноплан
Данные для ввода
|
спрайта
|
|
000
|
000
|
000
|
000
|
000
|
000
|
128
|
129
|
030
|
127
|
255
|
126
|
006
|
128
|
128
|
001
|
006
|
006
|
000
|
000
|
000
|
000
|
000
|
000
|
000
|
000
|
000
|
232
|
079
|
095
|
255
|
063
|
195
|
252
|
192
|
128
|
000
|
000
|
000
|
000
|
000
|
000
|
000
|
000
|
000
|
000
|
000
|
001
|
003
|
007
|
255
|
255
|
255
|
196
|
002
|
000
|
000
|
000
|
000
|
000
|
000
|
000
|
000
|
|
Данные для ввода спрайта
Рнс. 6 Биплан-1
ООО
|
255
|
255
|
036
|
038
|
035
|
033
|
033
|
033
|
255
|
255
|
001
|
001
|
001
|
003
|
003
|
003
|
002
|
002
|
ООО
|
ООО
|
036
|
255
|
255
|
ООО
|
024
|
126
|
231
|
255
|
255
|
255
|
195
|
126
|
024
|
036
|
066
|
129
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
255
|
255
|
036
|
100
|
196
|
132
|
004
|
004
|
255
|
255
|
128
|
128
|
128
|
192
|
192
|
192
|
064
|
064
|
ООО
|
ООО
|
|
Данные для ввода спрайта
Рис. 7 Биплан-2
ООО
|
255
|
255
|
051
|
051
|
025
|
103
|
243
|
243
|
121
|
112
|
048
|
127
|
028
|
004
|
005
|
014
|
018
|
018
|
012
|
ООО
|
ООО
|
192
|
128
|
ООО
|
ООО
|
128
|
152
|
063
|
063
|
159
|
007
|
015
|
255
|
064
|
128
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
003
|
135
|
255
|
226
|
252
|
132
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
|
Данные для ввода спрайта
Рис. 8 Вертолет 1
ООО
|
255
|
ООО
|
ООО
|
ООО
|
ООО
|
004
|
007
|
004
|
ООО
|
001
|
001
|
003
|
005
|
029
|
128
|
002
|
ООО
|
002
|
002
|
ООО
|
ООО
|
255
|
016
|
016
|
016
|
056
|
056
|
199
|
124
|
254
|
017
|
017
|
017
|
017
|
147
|
254
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
ООО
|
254
|
ООО
|
ООО
|
ООО
|
ООО
|
064
|
192
|
064
|
ООО
|
ООО
|
ООО
|
128
|
064
|
112
|
112
|
128
|
ООО
|
128
|
128
|
ООО
|
|
Данные для ввода спрайта
Рис. 9 Вертолет-2
000
|
000
|
000
|
255
|
000
|
000
|
000
|
000
|
007
|
010
|
018
|
098
|
255
|
127
|
015
|
000
|
001
|
001
|
000
|
000
|
000
|
000
|
000
|
000
|
255
|
032
|
032
|
112
|
240
|
252
|
131
|
129
|
254
|
008
|
240
|
096
|
000
|
128
|
128
|
000
|
000
|
000
|
000
|
000
|
000
|
252
|
000
|
000
|
008
|
005
|
018
|
254
|
145
|
004
|
000
|
000
|
000
|
000
|
000
|
000
|
000
|
000
|
000
|
|
Данные для ввода спрайта
Рис. 10 Вагон
000
|
000
|
031
|
033
|
127
|
036
|
036
|
036
|
036
|
036
|
036
|
063
|
055
|
060
|
063
|
191
|
255
|
191
|
019
|
019
|
012
|
060
|
024
|
255
|
000
|
255
|
036
|
036
|
036
|
036
|
036
|
036
|
255
|
247
|
060
|
255
|
255
|
255
|
255
|
036
|
036
|
195
|
000
|
000
|
248
|
132
|
254
|
036
|
036
|
036
|
036
|
036
|
036
|
252
|
244
|
060
|
252
|
253
|
255
|
253
|
200
|
200
|
048
|
|
Данные для ввода спрайта
000 ООО 002 255 127 073 073 073 073 127 127 065 255 255 156 034
095 073 065 034 028 000 000 032 113 113 112 244 255 255 225 255
001 255 255 059 068 226 146 130 068 056 096 240 240 248 248 240
096 240 240 248 252 248 240 240 224 240 024 108 150 151 096
Рис. 11 Паровоз
Данные для ввода спрайта
Рис. 12 Военный корабль
ООО
|
ООО
|
062
|
062
|
062
|
062
|
062
|
ООО
|
120
|
123
|
123
|
123
|
003
|
171
|
255
|
255
|
126
|
063
|
030
|
015
|
007
|
120
|
120
|
ООО
|
252
|
252
|
252
|
252
|
252
|
ООО
|
254
|
254
|
254
|
254
|
254
|
254
|
254
|
ООО
|
255
|
219
|
255
|
255
|
048
|
ООО
|
120
|
120
|
120
|
ООО
|
252
|
252
|
252
|
252
|
ООО
|
085
|
127
|
127
|
127
|
127
|
127
|
255
|
126
|
254
|
252
|
|
Данные для ввода спрайта
ООО ООО ООО ООО 008 028 062 127 007 003 001 001
003 015 022 040 ОВО 160 032 ООО ООО ООО ООО ООО 192 240 056 220 140 211
233 245 255 255 131 ООО ООО ООО ООО ООО ООО ООО ООО ООО ООО ООО ООО ООО
ООО ООО 128 224 208 200 228 098 184 072 036 018 001 ООО ООО
Данные для ввода спрайта
ООО ООО ООО ООО 008 028 062 127 007 003 003 001
ООО 001 001 ООО ООО ООО ООО ООО ООО ООО ООО 192 240 060 092 200 147 233
245 255 251 241 193 033 146 069 042 004 ООО ООО ООО ООО ООО ООО ООО ООО
ООО 128 192 224 208 208 136 072 064 128 ООО ООО ООО ООО ООО
Рис. 14 Наездник-2
Теперь рассмотрим подробно, как работает
процедура печати спрайтов на экране. Итак, входными параметрами
являются п~ номер спрайта и х, у - координаты левого верхнего угла, выраженные в знакоместах.
Листинг 6 Процедура печати спрайта
Адрес Наш.код Метка Мнемоника
010400 09
56 010800 09 5Е
ED5394D3
D365 D366 D367
D36A D36B D36D D36F D370 D371
09 7Е
3296D3 7В
Е618 F640 С/ 7В
Е607
D357 D35A
D35B D35C D35F D360 D361
LD HL,(#5С0В)
LD ВС #0004 ADD HL.ВС
D,(HL) ВС,#0008 HL,BC
E,(HL) (COORD),DE
ADD
LD
LD
LD
AND
OR
LD
LD
AND
HL,BC A,(HL) (NUMB),A
A,E #18 #40 H,A A, E #07
;DEFADD - системная переменная, указывающая на ;тс, где находятся параметры функции пользователя. Ее адрес: #5С0В ;(23563)
;Сдвиг от DEFADD на 4 ;байта, переход к первому параметру. ;Координата х. ;Сдвиг еще на 8 байтов ко ;второму параметру ;Координата у ;Запомнили координаты левого верхнего угла спра-;йта в программной переменной .
;Сдвиг к 3-му параметру. :Номер спрайта. :Запомнили его в програм-; мной переменной.
Алгоритм расчета адреса в экранном файле, когда координаты заданы в знакоместах и выставлены в регистровой паре DE.
Адрес Маш.код Метка Мнемоника
D373 В7 OR А
D374 IF RRA
D375 IF RRA
D376 IF RRA
D377 IF RRA
D378 82 ADD
D379 6F LD
D37A 2292D3 LD
D37D 3A96D3 LD
D380 47 LD
D381 113F00 LD
D384 2109D5 LD
D387 19 LOOP ADD
D388 10FD D3NZ
D38A ED5B92D3 LD
D38E C301D4 DP
D391 C9 RET
A.D L, А
(S ADR), HL
A,(NUMB)
B,А
DE,#003F HL,SPADR HL.DE LOOP
DE,(S_ADDR) S PRT
Комментарий
Адрес образуется в регистровой паре HL.
;Запомнили экранный адрес ;в переменной. ;Взяли номер спрайта. ;В регистре В создаем ;счетчик.
;#3F = 63 - это длина ;одного шаблона спрайта. ;Базовый адрес таблицы ;спрайтов.
;Смещение на длину одного спрайта.
;Возврат к началу цикла. ;Адрес в экранном файле. ;Переход на печать ;спрайта. ;Возврат.
S_ADR DEFW #48АЕ
D393 111В COORD DEFW #ODOE D395 NUMB DEFB
03 ;Адрес в экранном файле, соответствующий координатам, заданным в
знако-;местах.
.•Координаты левого верхнего угла спрайта. ;Номер спрайта.
Процедура SPRT.
Адрес Маш.код Метка Мнемоника
LD В,#03 LOOP-S PUSH DE PUSH ВС
LD С,#03 LD В,#08
LOOP-R PUSH DE LOOP LD A, (HL) LD (DE), A
INC D
D411 D413 D414 D415 D416 D417 D419 D41B
ЗЕ20
83
5F
79
3D
FE01 2005 0605
LD
ADD
LD
LD
DEC
CP
3R
LD
INC HL D3NZ LOOP
POP DE
A,#20 A, E E,A
A,С A #01
NZ,NEXT
D40C 14
D40D 23 •D40E 10FA
D410 D1
B, #05
C,A
;Создаем счетчик столбцов. ;Сохранение адреса в
экранном файле и параметра ;внешнего цикла на стеке. ;Счетчик рядов.
;Счетчик линий в знакоместе
;Переброска линии ;иэ буфера спрайта на ;экран.
;Приращение старшего бай-;та экранного адреса означает, что следующая ;линия рисуется не рядом ;с предыдущей, а под ;ней.
;Следующая линия. ;Конец цикла для 8-ми ;линий
одного знакоместа. ;Восстановление адреса ;левого верхнего угла.
;Переход к соседнему знакоместу снизу.
;Уменьшение счетчика знакомест по вертикали.
:Если это не третий ;ряд, то переход. ;Если же он - третий, ;то в нем
надо печатать ;только пять линий. ;Запомнили счетчик.
Адрес Маш.код Метка Мнемоника
D41E 18Е9
D420 D422 D423 D425 D427 D428
0608 4F
FE00 20Е2 С1 D1
D429 13
D42A 10D7
D42C С9
B,#08
C, A
#00
NZ,LOOP R
ВС
DE ;Возврат для печати знакоместа третьего ряда.
Счетчик восьми линий. ;Запомнили счетчик. ;Все
ряды напечатаны? ;Если нет, то возврат. ;Все ряды в столбце напечатаны.
Надо восстановить счетчики и адрес ;в экранном файле, прежде ;чем
перейти к очередному ;столбцу.
;Приращение младшего бай-;та адреса дисплейного
;файла означает, что очередная линия рисуется ;справа от предыдущей
;Если счетчик столбцов ;еще не обнулился, следу-,ет возврат к началу
вне ;шнего цикла. ;возврат.