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

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


2.1.8. Полная анимация спрайтов.

До сих пор мы занимались только перемещением спрайтов. Это в какой то степени является динамической графикой. но все таки не совсем, поскольку так можно изображать далеко не все объекты. Этот метод был хорош для движения самолетов, кораблей, ав томобилей, локомотивов и пр. технических устройств. Большинство же объектов живой природы в процессе перемещения меняют не только свои координаты, но и свою форму. Поэтому для того, чтобы, например, изобразить скачущего всадника, нам надо не только обеспечить перемещение спрайта по экрану. Но и выполнить переключение нескольких спрайтов, в которых изображены разные фазы движения.

Анимация, как и большинство прочих технологий в компьютерной графике, связана с обманом зрения. Быстрая смена нескольких статичных изображений создает иллюзию движения. Но анимация может быть исполнена и без движения, представьте себе, например человечка, подпрыгивающего на одном месте.

Как только Вы начнете ставить свои эксперименты. Вы увиди те, что даже очень малые изменения в спрайтах дают весьма ощу тимые результаты. Посмотрите на кадры наездника, приведенные на рис. 17. Практически вое тело лошади и сам наездник остаются неподвижны. Изменения касаются только ног и хвоста. Если 6ej мы попробовали внести изменения и в положение тела, то результирующая последовательность кадров была бы очень неплавной.

Во многих случаях Вам вполне достаточно иметь два кадра, изображающих две фазы движения, и переключать их с тем, чтобы получить анимационный эффект. Но мы здесь рассмотрим более общий случай и подготовим процедуру, позволяющую иметь столько кадров, сколько нам понадобится, правда не более, чем есть в таблице спрайтов. Кроме прочих параметров, рассмотренных в вышеприведенных процедурах, здесь появятся два новых параметра -f - количество кадров (frames) в анимационной последовательности и v (velocity) - скорость анимации. Обратите внимание на этот параметр. Он интересен для постановки собственных экспериментов. Изменяя его, можно достигать самых разных результатов.

Рис. 17 Пять фаз движения спрайта

Формат процедуры: FN k(x,y,a,l,s,f,c,v,ii)

х,у - координаты исходной позиции спрайта. Они относятся к левому верхнему углу и задаются в пикселах.

d - direction - параметр, определяющий направление перемещения.

d=0 - перемещение справа налево. d=l - перемещение слева направо. d=2 - перемещение снизу вверх. d=l - перемещение сверху вниз.

1 - параметр, определяющий дистанцию, иа которую перемещается спрайт. За единицу принято перемещение на три пиксела. Таким образом, если установить здесь например число 20, то спрайт продвинется на 60 пикселов и остановится.

а - switch - параметр, определяющий остается спрайт на экране после окоичаиия перемещения или иет. Если s=0, то он останется на экране. Если 6=1, то спрайт исчезнет.

f - количество кадров в анимациониой последовательности. Оно не может быть больше, чем число спрайтов в таблице (=<10)

с - collision - флаг детекции коллизии. Если его включить (с=1), то при столкновении с любым препятствием (со включенными пикселами экрана) спрайт остановится после того, как три пиксела спрайта "наедут" на препятствие. Если его отключить (с=0), то спрайт будет проходить через любое препятствие.

v - скорость анимации (l<=v<-255, самая медленная).

п - номер первого спрайта из Вашей кадровой последовательности. Если у Вас в таблице спрайтов задано несколько табло-нов, то здесь достаточно указать на нужный Ван номер спрайта.

Листинг 17 Загрузчик машинного кода процедуры анимации спрайта-

10 REM »»» Загрузчик машинного кода

20 LET adr=51700: LET long=275: LET check=82463: 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

042

,011

,092,

017

,004

120

DATA

000

,025

,078,

030

,008

1^30

DATA

025

,070

,025,

126

,230

140

DATA

003

,050

,209,

202

,025

150

DATA

126

,050

,211,

202

,025

160

DATA

126

,230

,001,

050

,212

170

DATA

202

,025

,126,

050

,216

180

DATA

202

,050

,215,

202

,025

190

DATA

126

,230

,001,

050

,210

200

DATA

202

,025

,126,

050

,217

210

DATA

202

,025

,126,

017

,063

220

DATA

000

,033

,202,

212

,025

230

DATA

061

,032

,252,

034

,213

240

DATA

202

,058

,215,

202

,061

250

DATA

050

,215

,202,

254

,000

260

DATA

032

,009

,058,

216

,202

270

DATA

050

,215

,202,

042

,213

280

DATA

202

,017

,063,

000

,025

290

DATA

205

,093

,210,

254

,000

300 DATA 040.019.058.210.202

310 DATA 254,000,040,012,038 320 DATA 212,202,198,001,230 330 DATA 001,050,212,202,024 340 DATA 090,229,213,197,058 350 DATA 217,202,071,017,000 360 DATA 000,033,000,000,237

370 DATA 176,193,209,225,118

380

DATA

205,

196,

209,

058

,209

390

DATA

202,

254,

000,

040

,019

400

DATA

254,

001,

040,

026

,254

410

DATA

002,

040,

033,

005

,005

420

DATA

005,

120,

230,

252

,040

430

DATA

045,

195,

182,

202

,013

440

DATA

013,

013,

121,

230

,252

450

DATA

040,

034,

195,

182

,202

460

DATA

012,

012,

012,

121

,214

470

DATA

231,

048,

023,

195

,182

480

DATA

202,

004,

004,

004

,120

490

DATA

214,

150,

048,

012

,058

500

DATA

211,

202,

061,

050

,211

510

DATA

202,

254

,000,

194,

054

520

DATA

202,

058

,212,

202,

237

530

DATA

067,

242

,201,

254,

ООО

540

DATA

200,

118

,205,

093,

210

550

DATA

201

001

.000,

000,

001

560

DATA

194,

214

,001,

003,

050

570

DATA

231 ,

048

,022,

195,

232

580

DATA

202,

004

,004,

004,

120

590

DATA

214,

150

,048,

Oil,

058

600

DATA

003,

203

,061,

050,

003

610

DATA

203

,254

,000,032,

155

620

DATA

058

,004

,203,237,

067

630

DATA

086

,202

,254,000,

200

640

DATA

118

,205

,093,210,

201

CLO

DATA

000

.000

.000,000.

000

Листинг 18 Процедура, управляющая аиииацией спрайтов.

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

Комментарий

C9F2 0000

C9F4 2А0В5С

110400

19

1Е08

19

46

C9F7 C9FA C9FB C9FC C9FE C9FF CA00

19

СА01 7Е СА02 Е603

СА04 32D1CA

СА07 19

СА08 7Е СА09 32D3CA

CA0C 19

CAOD 7Е CAOE E601

LD HL,(#5С0Б)

DE,#0004

HL,DE

C,(HL)

E, #08

HL,DE

B,(HL)

HL,DE

LD A,(HL)

AND #03

LD (DIREC) ,A

ADD HL,DE

LD A,(HL)

LD (DISTN),A

YXLAST DEFW #0000

LD

ADD

LD

LD

ADD

LD

ADD

ADD HL,DE

LD AND

A,(HL) #01 ;Последние координаты ;y и x. ;По ним можно ;определить, например, ;где произошла коллизия ;с препятствием. ;Указание на адрес, в котором располагаются параметры функции пользо-;вателя FN к() ;Вычисление адреса пер-;вого параметра. ;Прием параметра х. ;Смещение ко второму ;параметру. ;Прием параметра у. ;Смещение к третьему ;параметру. ;Прием параметра d. ;Маскирование старших ;битов.

;Выставление программной

;переменной.

;Смещение к четвертому

;параметру.

;Прием параметра 1.

;Выставление программной

;переменной.

;Смещение к пятому

;параметру.

;Прием параметра S-

;Наскирование старших

САЮ 32D4CA

С А 1.1 19

32D8CA 32D7CA

19

Е601

3PD2CA 19

СА14 СА15 СА18 СА1В

СА1С CAID

CA1F СА22

СА23 СА24

32D9CA

СА27 19

СА28 7Е

СА29 113F00 СА2С 21CAD4

CA2F 19 CA30 3D

LD (SWTCH).А

ADD HL.DE

LD A,(HL)

LD (FRAMES),A

LD (FRAM-1),A

ADD HL.DE

LD A,(HL)

AND #01

LD (FLAG).A

ADD HL.DE

LD A,(HL)

LD (RATE), A

ADD HL, DE

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

LD A, (HL)

LOOP ADD HL,DE DEC A

LD DE,#Q03F ID HL,#D4CA

;битов.

:Выставление программной ;переменной. ;Смещение к шестому ;параметру. ;Прием параметра f. ;Выставление программных ;переменных. ;Смещение к седьмому ;параметру. ;Прием параметра с. :Маскирование старших ;битов.

.Выставление переменной. ;Переход к восьмому ;параметру. ;Прием параметра v. ;Выставление программной ;переменной. ;Переход к девятому параметру.

;Прием номера первого ;спрайта из последовательности.

;Длина шаблона спрайта. .Адрес указывает на 126 ;байтов ниже, чем начало ;таблицы спрайтов. Каждый спрайт занимает 63 ;байта, поэтому адрес ;указывает на две длины ;спрайта ниже, чем начало • таблицы.

I! Отыскание адреса начала шаблона спрайта по

Комментарий

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

СА31 20FC JR NZ,LOOP

СА58 СА5А СА5С CA5F СА61 СА63

FEOO

2 8 ОС

3AD4CA

С601

Е601

32D4CA

CP

3R

LD

ADD

AND

LD

САЗЗ

22D5CA

LD

(ADRES),HL

СА36

3AD7CA

BEGIN

LD

A,(FRAM-1)

СА39

3D

DEC

A

САЗА

32D7CA

LD

(FRAM-1),A

CA3D

FEOO

CP

#00

CA3F

2009

3R

NZ,BYPASS

СА41

3AD8CA

LD

A,(FRAMES)

СА44

32D7CA

LD

(FRAM-1),A

СА47

2AD5CA

LD

HL,(ADRES)

СА4А

113F00

BYPASS

LD

DE,#003F

CA4D

19

ADD

HL,DE

СА4Е

CD5DD2

CALL

SPRDRV P

СА51

FE00

CP

#00

СА53

2813

JR

Z,CONT

CA5S 3AD2CA

LD A, (FLAG)

#00

Z,CONT A,(SWTCH) A, #01 #01

(SWTCH),A

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

его номеру. В результате HL указывает на одну длину спрайта ниже, чей его истинное положение в таблице. Выставление программной переменной.

Сколько кадров осталось напечатать? Уменьшить на 1 и запомнить.

Если ие все кадры напечатаны , то обход. Если все, то надо освежить переменную FRAM-1.

Теперь HL указывает точно на начало нужного спрайта в таблице шаблонов .

Вызов процедуры печати спрайта (см. с.44). При печати спрайта была коллизия с каким-либо объектом иа экране? Если нет, переход. Если была, надо проверить флаг детекции коллизии. Если он выключен продолжить работу. Если он включен, подготавливаем выход из процедуры.

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

Комментарий

СА66 185А

СА68 Е5 CONT

СА69 D5

СА6А С5

СА6В 3AD9CA

СА6Е 47

CA6F 110000

СА72 210000

СА75 EDB0

СА77 С1

СА78 D1

СА79 Е1

СА7А 76

СА7В CDC4D1

СА7Е 3AD1CA

СА81 FE00

СА83 2813

СА85 FE01

СА87 281А

СА89 FE02

СА8В 2821

05 05 05 78

E6FC 282D

CA8D СА8Е CA8F СА90

СА91 СА93

JR END PUSH HL PUSH DE PUSH ВС LD A,(RATE) LD В, A LD DE,#0000 LD HL,#0000 LDXR

POP ВС POP DE POP HL HALT

CALL SPRDRV-S

LD A,(DIREC)

CP #00

JR Z,LEFT

CP #01

JR Z,RIGHT

CP #02

JR Z,UP

DEC В

DEC В

DEC В

LD А,В

AND #FC

JR Z,END

Сохранение основных регистров от повреждения командой LDIR. Скорость анимации.

Это не блочная переброска по команде LDIR, а обыкновенная затяжка времени. Чем больше число в регистре В, тем длительнее пауза. Восстановление регистров со стека

;Краткая пауза. ;Стирание спрайта (см. ;стр. 40)

;В каком направлении ;движется спрайт? ;Влево?

;Переход, если так. ;Вправо?

;Переход, если так. ;Вверх?

;Переход, если так. ;Во всех прочих случаях остается только ;движение вниз .•Уменьшение координаты :у на три пункта.

;Проверка на выход за ;пределы экрана. ;Конец работы, если так.

/on.ec Наш.кои М»т»а_Щ—аМММ_КйПИИИУИЙ

СА95

СЗВ6СА

JP

NEXT

Иначе продолжаем.

СА98

0D

LEFT

DEC

С

Уменьшение координаты,

СА99

0D

DEC

С

х иа три пункта.

СА9А

0D

DEC

С

СА9В

79

LD

А,С

Проверка на выход за

СА9С

E6FC

AND

#FC

пределы экрана.

СА9Е

2822

JR

Z,END

Конец работы, если так

СААО

СЗВ6СА

JP

NEXT

Иначе продолжаем.

СААЗ

ОС

RIGHT

INC

С

увеличение координаты

САА4

ОС

INC

С

х на три пункта

САА5

ОС

INC

С

САА6

79

LD

А,С

Проверка на выход за

САА7

D6E7

SUB

#E7

пределы экрана.

САА9

3017

JR

NC,END

Конец работы, если так

СААВ

СЗВ6СА

JP

NEXT

Иначе продолжаем.

СААЕ

04

UP

INC

В

увеличение координаты

CAAF

04

INC

В

у на три пункта.

САВО

04

INC

В

САВ1

78

LD

А,В

Проверка на выход за

САВ2

D696

SUB

# 96

пределы экрана.

САВ4

300С

JR

NC,END

Конец работы, если так

CAB 6

3AD3CA

NEXT

LD

A,(DISTN)

Уменьшаем счетчик

САВ9

3D

DEC

A

пройденного расстояния

САВА

32D3CA

LD

(DISTN),A

CABD

FEOO

CP

#00

Проверяем его на конец

CABF

С236СА

JP

NZ,BEGIN

Если не конец, то возврат.

С АС 2

3AD4CA

END

LD

A. (SWTCH)

Проверка параметра s.

САС5

ED43F2C9

LD

(YXLAST),BC

Запомнили координаты

последней точки в про

граммной переменной.

САС9

FEOO

CP

#00

Если «=0, то ничего больше делать ие надо

САСВ

С8

RET

Z

Окончательный выход.

СЛСС

76

HALT

Если ш=1, напечатаем

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

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

CACD CD5DD2 CADO С9

CALL SPRDRV-P RET ;спрайт в последний раз. ;Вызов процедуры печати. ;Выход из процедуры.

Программная переменная, указывающая направление ;перемещения спрайта. ;Флаговая переменная ;флаг детекции коллизии. Программная переменная, указывающая дистанцию перемещения спрайта. Параметр s.

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

Программная переменная, .хранящая количество ;кадров (спрайтов) в анимационной последователь-;ности.

.Программная переменная, ;хранящая частоту смены ;кадров. Чем она больше, ;тем медленнее анимация.

CAD1 00

DIREC DEFB 00

FLAG DEFB 00

CAD3

DISTN DEFB 00

SWTCH DEFB 00 ADRES DEFW 0000

CAD4 00 CAD5 0000

FRAM-1 DEFB 00

CAD7 00

CAD8 00

FRAMES DEFB 00

RATE

CAD9 00

DEFB 00

Как же работает эта процедура? Отдельные спрайты, которых столько же, сколько кадров в анимационной последовательности, берутся из таблицы спрайтов и по-очереди печатаются на экране.

Сначала печатается первый спрайт. Далее он стирается и, вместо того, чтобы напечатать его же со смещением в три пиксела в заданном направлении, печатается второй спрайт, затем третий и т д Процесс повторяется до тех пор, пока не будет напечатан последний спрайт из кадровой последовательности, после чего вновь печатается первый.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
От автора - Последний день лета...
Об этом - обзор системных программ: PCX Viewer, Screen Viewer, ESV Crushers, Magic Fields, X-Player, Doom Mania.
Tutorials - Больше цвета!!! Описание паковщика цветного видео из демки Weed.
Письмо №312 - Москва
О разном - Не понос, так золотуха.

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