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

Анимаци в растровой графике - Перемещение спрайтов двойной ширины.


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

Спрайт 1

Спрайт 2

Для перемещения по экрану такого спрайта подготовим процедуру 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

LD

C,(HL)

Ввод параметров

ССВ8

1Е08

LD

E, #08

ССВА

19

ADD

HL.DE

из БЕЙСИКа.

ССВВ

46

LD

B,(HL)

ССВС

19

ADD

HL,DE

*

CCBD

LD

A,(HL)

Настройка

ССВЕ

Е603

AND

#03

СССО

3294CD

LD

(DIREC),A

программных

сссз

19

ADD

HL.DE

ССС4

LD

A,(HL)

переменных

ССС5

3295CD

LD

(DISTN),A

ССС8

19

ADD

HL,DE

ССС9

LD

A,(HL)

СССА

Е601

AND

#01

СССС

3296CD

LD

(SWTCH),A

CCCF

19

ADD

HL.DE

CCD0

LD

A,(HL)

CCD1

Е601

AND

#01

CCD3

3292CD

LD

(FLAG),A

CCD6

19

ADD

HL.DE

CCD7

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

CD62 CD65 CD66 CD69 CD6B

NEXT

CD60 200С

3A95CD

3D

3295CD FE0O

С2Е6СС

CD6E 3A96CD END CD71 ED43AECC

CD75 CD77 CD78

CD"'

FE00 С8

76

CD5DD2

CD44 CD45 CD47

CD4 9 CD4C CD4D CD4E CD4F CD50 CD52

CD54 CD57 CD59 CD5B CD5E

C0NT

А,С *CF

NC,END

3P CONT

INC В

INC В

INC В

LD А,В

SUB #96

JR NC,END

LD CP JR LD CP

A,(COLLIZ) #00

Z,NEXT A,(FLAG) #00

LD

DEC

LD

CP

JP

LD LD

JR NZ,END

A,(DISTN) A

(DISTN),A #00

NZ,BEGIN

A (SWTCH) (YXLAST),BC

CP #00 RET Z HALT

CALL SPRDRV-P

LD

SUB 3R

Проверка на выход за пределы экрана. Если выход произошел, заканчиваем работу. Иначе продолжаем. Увеличиваем на 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




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Реклама - Реклама и объявления...
PROFI CP/M - О экране компьютера "Profi".
For Coderz - Маленькие программерские хитрости.
Вступление - содержание номера.
Этюды - Программа обработки @-бейсик файлов.

В этот день...   28 апреля