Динамическая графика 1994 г.

Анимаци в растровой графике - Печать спрайта.


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

D354 2А0В5С

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

LD

LD

ADD

LD

LD

;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АЕ

D392 ЗВ

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

D401 D403 D404

0603

D5

С5

D405 0Е03 D407 0608

D409 D40A D40B

D5 7Е 12

D40C 14

D40D 23 •D40E 10FA

D410 D1

B, #05

D41D 4F

C,A

;Создаем счетчик столбцов. ;Сохранение адреса в экранном файле и параметра ;внешнего цикла на стеке. ;Счетчик рядов. ;Счетчик линий в знакоместе

;Переброска линии ;иэ буфера спрайта на ;экран.

;Приращение старшего бай-;та экранного адреса означает, что следующая ;линия рисуется не рядом ;с предыдущей, а под ;ней.

;Следующая линия. ;Конец цикла для 8-ми ;линий одного знакоместа. ;Восстановление адреса ;левого верхнего угла. ;Переход к соседнему знакоместу снизу.

;Уменьшение счетчика знакомест по вертикали. :Если это не третий ;ряд, то переход. ;Если же он - третий, ;то в нем надо печатать ;только пять линий. ;Запомнили счетчик.

Адрес Маш.код Метка Мнемоника

Комментарий■

D41E 18Е9

JR

LD

LD

CP

JR

POP

POP

NEXT

D420 D422 D423 D425 D427 D428

0608 4F

FE00 20Е2 С1 D1

RET

D429 13

D42A 10D7

D42C С9

B,#08

C, A

#00

NZ,LOOP R

ВС

DE ;Возврат для печати знакоместа третьего ряда.

INC DE

D3NZ LOOP-S

Счетчик восьми линий. ;Запомнили счетчик. ;Все ряды напечатаны? ;Если нет, то возврат. ;Все ряды в столбце напечатаны. Надо восстановить счетчики и адрес ;в экранном файле, прежде ;чем перейти к очередному ;столбцу.

;Приращение младшего бай-;та адреса дисплейного ;файла означает, что очередная линия рисуется ;справа от предыдущей ;Если счетчик столбцов ;еще не обнулился, следу-,ет возврат к началу вне ;шнего цикла. ;возврат.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Rectime - вот и подошел к концу двенадцатый выпуск.
От автора - А не сходить ли вам?
Soft - описания навороченного плеера PT3 музыки - SPLAYЕR by SiRiL/4D.
Новинка - Презентация игры X-Reversy.
Outro - Авторы и контакты редакции.

В этот день...   23 ноября