V.6. СПРАЙТЫ Мультипликация является единственным подлинным искусством в настоящее время,потому что в ней, и только в ней, художник абсолютно свободен в своей фантазии и может делать все, что угодно. Ч. Чаплин "Оживление" изображения при мультипликации основано на использовании набора обычных "неподвижных" картинок,каждая последующая из которых очень незначительно отличается от предыдущей.Если последовательно просматривать эти картинки, очень быстро сменяя одну другой,то отдельные картинки будут сливаться друг с другом, создавая впечатление непрерывного плавного движе- ния. Далее с помощью кинокамеры снимают все отдельные картинки, нарисован- ные от руки или полученные каким-либо другим способом. После этого с помо- щью кинопроектора можно показывать мультфильм на экране. Для синтеза динамического изображения на MSX-компьютере можно также ис- пользовать кинокамеру и описанную выше технику:с помощью операторов PSET, LINE, CIRCLE, PAINT и DRAW можно рисовать на экране дисплея отдельные кар- тинки и по очереди фотографировать их кинокамерой.Однако для MSX-компьюте- ра существует более удобный подход к "оживлению" изображения, позволяющий обойтись и без кинокамеры, и без проектора,используя лишь возможности язы- ка программирования MSX-BASIC. Для того,чтобы создать впечатление движущегося по экрану объекта,следу- ет каждый раз сначала стирать его изображение с экрана,а затем снова выво- дить его на экран в новом месте. При этом местоположение объекта при каж- дом последующем выводе должно очень незначительно отличаться от его место- положения при предыдущем выводе, иначе вместо плавного перемещения будет лишь видно, как изображение объекта исчезнет в одном месте,а затем появля- ется в другом.Эту идею нетрудно реализовать с помощью циклической програм- мы, использующей рассмотренные нами ранее графические операторы. Однако, для того, чтобы движение изображения не было "дергающимся",отдельные кад- ры должны очень быстро сменять друг друга. Используя только базовые опера- торы графики, это требование выполнить очень трудно. Смотрите! П р и м е р [14]. Бегущий человечек. ─────────── NEW Ok 20 DIM X1(15),Y1(15),X2(15),Y2(15):XM=255 40 FOR K=1 TO13:READ X1(K),Y1(K):NEXT 70 FOR K=1 TO 12:READ X2(K),Y2(K):NEXT 100 XO=0 110 COLOR15:SCREEN2 120 IF XO+X1(12)>XM THEN 740 130 GOSUB210:GOSUB330 'Рисуем, а затем стираем положение 1 150 XO=XO+15 160 IF XO+X2(11)>XM THEN 740 170 GOSUB 460:GOSUB 570 'Рисуем,а затем стираем положение 2 190 XO=XO+20 200 GOTO 130 210 '¤¤¤¤¤ Рисунок первой позиции ¤¤¤¤¤ 230 FORK=1TO2:LINE(XO+X2(K),Y2(K))-(XO+X2(K+1),Y2(K+1)):NEXT 260 LINE (XO+X2(4),Y2(4))-(XO+X2(5),Y2(5)) 270 LINE (XO+X2(5),Y2(5))-(XO+X2(6),Y2(6)) 280 FORK=7TO10:LINE(XO+X2(K),Y2(K))-(XO+X2(K+1),Y2(K+1)) 300 NEXTK 310 CIRCLE(XO+X2(12),Y2(12)),10:RETURN'──▶ 330 '¤¤¤¤¤ Уничтожение первой позиции ¤¤¤¤¤ 350 FOR K=1 TO2:LINE (XO+X2(K),Y2(K))-(XO+X2(K+1),Y2(K+1)),4 370 NEXT K 380 LINE (XO+X2(4),Y2(4))-(XO+X2(5),Y2(5)),4 390 LINE (XO+X2(5),Y2(5))-(XO+X2(6),Y2(6)),4 400 FOR K=7 TO10:LINE(XO+X2(K),Y2(K))-(XO+X2(K+1),Y2(K+1)),4 420 NEXTK:CIRCLE(XO+X2(12),Y2(12)),10,4:RETURN 460 '¤¤¤¤¤ Рисунок второй позиции ¤¤¤¤¤ 470 FORK=1TO3:LINE(XO+X1(K),Y1(K))-(XO+X1(K+1),Y1(K+1)):NEXT 500 LINE (XO+X1(5),Y1(5))-(XO+X1(6),Y1(6)) 510 LINE (XO+X1(6),Y1(6))-(XO+X1(7),Y1(7)) 520 FORK=8TO11:LINE(XO+X1(K),Y1(K))-(XO+X1(K+1),Y1(K+1)) 540 NEXT K 550 CIRCLE(XO+X1(13),Y1(13)),10:RETURN '──▶ 570 '¤¤¤¤¤ Уничтожение второй позиции ¤¤¤¤¤ 590 FOR K=1 TO3:LINE(XO+X1(K),Y1(K))-(XO+X1(K+1),Y1(K+1)),4 610 NEXTK 620 LINE(XO+X1(5),Y1(5))-(XO+X1(6),Y1(6)),4 630 LINE(XO+X1(6),Y1(6))-(XO+X1(7),Y1(7)),4 640 FOR K=8TO11:LINE(XO+X1(K),Y1(K))-(XO+X1(K+1),Y1(K+1)),4 660 NEXT K 670 CIRCLE (XO+X1(13),Y1(13)),10,4:RETURN'──▶ 700 DATA 14,150,20,133,15,120,20,93,5,145,25,133,15,120 710 DATA 20,115,10,110,19,92,20,108,30,113,20,83 720 DATA 2,132,25,136,40,93,43,150,50,130,30,120 730 DATA 30,111,22,103,38,95,43,110,58,104,40,83 740 XO=0:X2=0:GOTO 120 Убедились?В связи с этим в язык MSX-BASIC включены дополнительные сред- ства вывода на экран графической информации - с п р а й т ы. V.6.1. Ф о р м и р о в а н и е з н а ч е н и я с п р а й т а Э л ь ф ы - в германских народных поверьях духи природы, населяющие воздух,землю,горы,леса,жилища людей и обычно благожелательные людям. Советский Энциклопедический Словарь В MSX-BASIC используются специальные нумерованные строковые переменные, называемые с п р а й т а м и. Для записи и м е н и спрайта используется псевдопеременная SPRITE$(), синтаксис которой: SPRITE$(n) где: SPRITE("sprite"-"эльф") - служебное слово; n - арифметическое выражение, целая часть значения которого опреде- ляет номер спрайта. Рассмотрим семантику оператора присваивания SPRITE$(n)=β (∗) где β - строковое выражение. В дальнейшем вместо фразы "длина значения спрайта"мы будем употреблять фразу "д л и н а с п р а й т а". При выполнении (∗), значение β выравнивается, если это требуется,до на- ибольшей длины спрайта за счет отбрасывания его лишних правых байтов или, наоборот,за счет добавления справа необходимого количества нулевых байтов (00000000). Полученное значение присваивается спрайту с заданным номером. Например: 1) 10 SCREEN1:SPRITE$(5)="12345678" 2) 10 SCREEN2:FOR S=0 TO 63:SPRITE$(S)="ABCDEFGHIJKL":NEXT Для значений спрайтов отводится определенное место в оперативной памя- ти, называемое с п р а й т о в о й областью и имеющее объем 2Кб (напом- ним, что 1Кб = 1024 байтам). Оператор присваивания A=SPRITE$(n) где: A - строковая переменная или элемент строкового массива; n - арифметическое выражение, целая часть значения которого опреде- ляет номер спрайта; позволяет при недостатке строкового пространства хра- нить значения простых строковых переменных и элементов строковых массивов в спрайтовой области. Думаем, что теперь Вам совершенно ясен семантический смысл, например, конструкции вида: SPRITE$(12)=SPRITE$(7) ! V.6.2. В ы в о д с п р а й т а на э к р а н Intelligenti pausa Лат. поговорка Значения спрайтов можно выводить на экран SCREEN1 при помощи "тривиаль- ного" оператора PRINT. П р и м е р 1. ───────────── 10 SCREEN1'Но не SCREEN0! 10 SCREEN1'Но не SCREEN0! 20 SPRITE$(50)="screen1" 20 SPRITE$(20)="Алгоритмическ 30 PRINT SPRITE$(50) ий язык":PRINT SPRITE$(20) run run screen1 Алгоритм Ok Ok Можно, конечно, выводить значение спрайта и в режиме SCREEN 0. Но для этого его значение нужно вначале определить в режиме SCREEN 1! Однако, обычно, выводятся не сами значения спрайтов,а некоторые геомет- рические образы, порождаемые специальной двоичной интерпретацией этих зна- чений. Вначале опишем форму представления значений спрайтов при выводе на экран дисплея. Пусть длина спрайта ≤8 байтам. Расположим его двоичное значение в виде "квадрата" размером 8╳8 следующим образом: в первой строке - 1-й байт, во второй строке - 2-й байт и т.д. Значению спрайта сопоставим геометрический образ на экране,выделив там б л о к из 8╳8 точек и раскрасив одним и тем же цветом все его точки, ко- торым соответствует бит "1", и не изменив цвета других точек. П р и м е р 2. ───────────── NEW ┌───────────────┐ Ok │1 1 0 0 1 0 0 1│"и" ██ █ █ 10 SCREEN1:SPRITE$(4) │1 1 0 0 1 1 1 0│"н" ██ ███ ="интеграл":FOR I=1TO │1 1 0 1 0 1 0 0│"т" ██ █ █ 8:?BIN$(ASC(MID$(SPRI │1 1 0 0 0 1 0 1│"е" ██ █ █ TE$(4),I,1))):NEXT │1 1 0 0 0 1 1 1│"г" ██ ███ run │1 1 0 1 0 0 1 0│"р" ██ █ █ 11001001 │1 1 0 0 0 0 0 1│"а" ██ █ 11001110 │1 1 0 0 1 1 0 0│"л" ██ ██ 11010100 └───────────────┘ 11000101 Двоичная интерпретация Образ спрайта на 11000111 значения спрайта экране дисплея 11010010 11000001 11001100 Ok П р и м е р 3. ───────────── Что мы желаем Процесс кодирования образа спрайта впоследствии ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ увидеть на │ │ │ │█│█│ │ │ │ │ │ │ │█│ │█│ │ │ │──▶ &H18 экране дисплея! ├─┼─┼─┼─┼─┼─┼─┼─┤ └─┴─┴─┴─┘ └─┴─┴─┴─┘ │ │ │█│█│█│█│ │ │ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ██ ├─┼─┼─┼─┼─┼─┼─┼─┤ │ │ │█│█│ │█│█│ │ │──▶ &H3C ████ │ │█│█│█│█│█│█│ │ └─┴─┴─┴─┘ └─┴─┴─┴─┘ ██████ ├─┼─┼─┼─┼─┼─┼─┼─┤ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ████████ │█│█│█│█│█│█│█│█│ │ │█│█│█│ │█│█│█│ │──▶ &H7E ██ ├─┼─┼─┼─┼─┼─┼─┼─┤ └─┴─┴─┴─┘ └─┴─┴─┴─┘ ██ │ │ │ │█│█│ │ │ │ ··· ··· ··· ██ ├─┼─┼─┼─┼─┼─┼─┼─┤ ··· ··· ··· ██ │ │ │ │█│█│ │ │ │ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ ├─┼─┼─┼─┼─┼─┼─┼─┤ │ │ │ │█│ │█│ │ │ │──▶ &H18 │ │ │ │█│█│ │ │ │ └─┴─┴─┴─┘ └─┴─┴─┴─┘ ├─┼─┼─┼─┼─┼─┼─┼─┤ ┌─┬─┬─┬─┐ ┌─┬─┬─┬─┐ │ │ │ │█│█│ │ │ │ │ │ │ │█│ │█│ │ │ │──▶ &H18 └─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┘ └─┴─┴─┴─┘