5.6 СПРАЙТЫ Мультипликация является единственным подлинным искусством в настоящее время,потому что в ней, и только в ней, художник абсолютно свободен в своей фантазии и может делать все, что угодно. Ч. Чаплин "Оживление" изображения при мультипликации основано на использовании набора обычных "неподвижных" картинок,каждая последующая из которых очень незначительно отличается от предыдущей.Если последовательно просматривать эти картинки, очень быстро сменяя одну другой,то отдельные картинки будут сливаться друг с другом, создавая впечатление непрерывного плавного движе- ния. Далее с помощью кинокамеры снимают все отдельные картинки, нарисован- ные от руки или полученные каким-либо другим способом. После этого с помо- щью кинопроектора можно показывать мультфильм на экране. Для синтеза динамического изображения на MSX-компьютере можно также ис- пользовать кинокамеру и описанную выше технику:с помощью операторов PSET, LINE, CIRCLE, PAINT и DRAW можно рисовать на экране дисплея отдельные кар- тинки и по очереди фотографировать их кинокамерой.Однако для MSX-компьюте- ра существует более удобный подход к "оживлению" изображения, позволяющий обойтись и без кинокамеры, и без проектора,используя лишь возможности язы- ка программирования MSX-BASIC. Для того,чтобы создать впечатление движущегося по экрану объекта,следу- ет каждый раз сначала стирать его изображение с экрана,а затем снова выво- дить его на экран в новом месте. При этом местоположение объекта при каж- дом последующем выводе должно очень незначительно отличаться от его место- положения при предыдущем выводе, иначе вместо плавного перемещения будет лишь видно, как изображение объекта исчезнет в одном месте,а затем появля- ется в другом.Эту идею нетрудно реализовать с помощью циклической програм- мы, использующей рассмотренные нами ранее графические операторы. Однако, для того, чтобы движение изображения не было "дергающимся",отдельные кад- ры должны очень быстро сменять друг друга. Используя только базовые опера- торы графики, это требование выполнить очень трудно. Смотрите! П р и м е р [14]. Бегущий человечек. WWWWWWWWWWW 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'WW▐ 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 'WW▐ 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'WW▐ 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 включены дополнительные сред- ства вывода на экран графической информации - с п р а й т ы. 5.6.1 Ф о р м и р о в а н и е з н а ч е н и я с п р а й т а Эльфы - в германских народных поверьях духи природы,населяющие воз- дух,землю,горы,леса,жилища людей и обычно благожелательные людям. Советский Энциклопедический Словарь В MSX-BASIC используются специальные нумерованные строковые переменные, называемые с п р а й т а м и. Для записи и м е н и спрайта используется псевдопеременная SPRITE$(), синтаксис которой: SPRITE$(n) , где: 1) SPRITE("sprite"-"эльф") - служебное слово; 2) n - арифметическое выражение, целая часть значения которого опре- деляет номер спрайта. Рассмотрим семантику оператора присваивания SPRITE$(n)=║ ,(O) где ║ - строковое выражение. В дальнейшем вместо фразы "длина значения спрайта"мы будем употреблять фразу "д л и н а с п р а й т а". При выполнении (O), значение ║ выравнивается, если это требуется,до на- ибольшей длины спрайта за счет отбрасывания его лишних правых байтов или, наоборот,за счет добавления справа необходимого количества нулевых байтов (00000000). Полученное значение присваивается спрайту с заданным номером. Например: 1) 10 SCREEN1:SPRITE$(5)="12345678" 2) 10 SCREEN2:FOR S=0 TO 63:SPRITE$(S)="ABCDEFGHIJKL":NEXT Для значений спрайтов отводится определенное место в оперативной памя- ти, называемое с п р а й т о в о й областью и имеющее объем 2Кбайта (на- помним, что 1Кб = 1024 байта). Оператор присваивания ═=SPRITE$(n) , где: 1) ═-строковая переменная или элемент строкового массива; 2) n-арифметическое выражение, целая часть значения которого опреде- ляет номер спрайта; позволяет при недостатке строкового пространства хра- нить значения простых строковых переменных и элементов строковых массивов в спрайтовой области. Думаем, что теперь Вам совершенно ясен семантический смысл, например, конструкции вида: SPRITE$(12)=SPRITE$(7) ! 5.6.2 В ы в о д с п р а й т а на э к р а н Intelligenti pausa Лат. поговорка Значения спрайтов можно выводить на экран SCREEN1 при помощи "тривиаль- ного" оператора PRINT. П р и м е р 1. WWWWWWWWWWWWW 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. WWWWWWWWWWWWW NEW XWWWWWWWWWWWWWWWY Ok V1 1 0 0 1 0 0 1V"и" ⌡⌡ ⌡ ⌡ 10 SCREEN1:SPRITE$(4) V1 1 0 0 1 1 1 0V"н" ⌡⌡ ⌡⌡⌡ ="интеграл":FOR I=1TO V1 1 0 1 0 1 0 0V"т" ⌡⌡ ⌡ ⌡ 8:?BIN$(ASC(MID$(SPRI V1 1 0 0 0 1 0 1V"е" ⌡⌡ ⌡ ⌡ TE$(4),I,1))):NEXT V1 1 0 0 0 1 1 1V"г" ⌡⌡ ⌡⌡⌡ run V1 1 0 1 0 0 1 0V"р" ⌡⌡ ⌡ ⌡ 11001001 V1 1 0 0 0 0 0 1V"а" ⌡⌡ ⌡ 11001110 V1 1 0 0 1 1 0 0V"л" ⌡⌡ ⌡⌡ 11010100 ZWWWWWWWWWWWWWWW[ 11000101 Двоичная интерпретация Образ спрайта на 11000111 значения спрайта экране дисплея 11010010 11000001 11001100 Ok П р и м е р 3. WWWWWWWWWWWWW Что мы желаем Процесс кодирования образа спрайта впоследствии XWRWRWRWRWRWRWRWY XWRWRWRWY XWRWRWRWY увидеть на V V V V⌡V⌡V V V V V V V V⌡V V⌡V V V VWW▐ &H18 экране дисплея! VWVWVWVWVWVWVWVWV ZWQWQWQW[ ZWQWQWQW[ V V V⌡V⌡V⌡V⌡V V V XWRWRWRWY XWRWRWRWY ⌡⌡ VWVWVWVWVWVWVWVWV V V V⌡V⌡V V⌡V⌡V V VWW▐ &H3C ⌡⌡⌡⌡ V V⌡V⌡V⌡V⌡V⌡V⌡V V ZWQWQWQW[ ZWQWQWQW[ ⌡⌡⌡⌡⌡⌡ VWVWVWVWVWVWVWVWV XWRWRWRWY XWRWRWRWY ⌡⌡⌡⌡⌡⌡⌡⌡ V⌡V⌡V⌡V⌡V⌡V⌡V⌡V⌡V V V⌡V⌡V⌡V V⌡V⌡V⌡V VWW▐ &H7E ⌡⌡ VWVWVWVWVWVWVWVWV ZWQWQWQW[ ZWQWQWQW[ ⌡⌡ V V V V⌡V⌡V V V V GGG GGG GGG ⌡⌡ VWVWVWVWVWVWVWVWV GGG GGG GGG ⌡⌡ V V V V⌡V⌡V V V V XWRWRWRWY XWRWRWRWY VWVWVWVWVWVWVWVWV V V V V⌡V V⌡V V V VWW▐ &H18 V V V V⌡V⌡V V V V ZWQWQWQW[ ZWQWQWQW[ VWVWVWVWVWVWVWVWV XWRWRWRWY XWRWRWRWY V V V V⌡V⌡V V V V V V V V⌡V V⌡V V V VWW▐ &H18 ZWQWQWQWQWQWQWQWQ ZWQWQWQW[ ZWQWQWQW[ ▌ ▌ ▌ Происхождение этих непонятных (пока!) символов WWWWWWWWW[W[W[ разъ- ясняет следующая таблица: Рисунок Шестнадцатеричный код Рисунок WWWWWWW WWWWWWWWWWWWWWWWWWWWW WWWWWWW XWRWRWRWY XWRWRWRWY V V V V V WW▐ 0 8 ░WW V⌡V V V V ZWQWQWQW[ ZWQWQWQW[ XWRWRWRWY XWRWRWRWY V V V V⌡V WW▐ 1 9 ░WW V⌡V V V⌡V ZWQWQWQW[ ZWQWQWQW[ XWRWRWRWY XWRWRWRWY V V V⌡V V WW▐ 2 A ░WW V⌡V V⌡V V ZWQWQWQW[ ZWQWQWQW[ XWRWRWRWY XWRWRWRWY V V V⌡V⌡V WW▐ 3 B ░WW V⌡V V⌡V⌡V ZWQWQWQW[ ZWQWQWQW[ XWRWRWRWY XWRWRWRWY V V⌡V V V WW▐ 4 C ░WW V⌡V⌡V V V ZWQWQWQW[ ZWQWQWQW[ XWRWRWRWY XWRWRWRWY V V⌡V V⌡V WW▐ 5 D ░WW V⌡V⌡V V⌡V ZWQWQWQW[ ZWQWQWQW[ XWRWRWRWY XWRWRWRWY V V⌡V⌡V V WW▐ 6 E ░WW V⌡V⌡V⌡V V ZWQWQWQW[ ZWQWQWQW[ XWRWRWRWY XWRWRWRWY V V⌡V⌡V⌡V WW▐ 7 F ░WW V⌡V⌡V⌡V⌡V ZWQWQWQW[ ZWQWQWQW[ Думаем, что самое время напомнить Вам, что перед шестнадцатеричным чис- лом в языке MSX-BASIC употребляется префикс &H ! И, наконец, завершающий этап! Определим образ спрайта: SPRITE$(1)=CHR$(&H18)+CHR$(&H3C)+CHR$(&H7E)+CHR$(&HFF)+ CHR$(&H18)+CHR$(&H18)+CHR$(&H18)+CHR$(&H18) Пусть теперь длина спрайта не превосходит 32 байтов.Расположим его дво- ичное значение в виде квадрата 16\16 в двa столбца по 16 байтов в столбце так, как это показано в следующем примере. Тем же способом, что и раньше, этому значению сопоставим на экране некоторый блок из 16\16 точек и в нем конкретный геометрический образ. П р и м е р 4. WWWWWWWWWWWWW NEW Ok 10 SCREEN1,2:SPRITE$(255)=" Никто не обнимет необъятного! " 15 FOR I=1 TO LEN(SPRITE$(255))-16 20 PRINT RIGHT$("00000000"+BIN$(ASC(MID$(SPRITE$(255),I ,1))),8)" "; RIGHT$("00000000"+BIN$(ASC(MID$(SPRITE$(255),I+16,1))),8):NEXT run XWWWWWWWWWWRWWWRWWWRWWWWWWWWWWWY 00100000 11010100 V 1-й байт V V т V 17-й байт V 11101110 00100000 V 2-й байт V Н V V 18-й байт V 11001001 11001110 V 3-й байт V и V н V 19-й байт V 11001011 11000101 V 4-й байт V к V е V 20-й байт V 11010100 11001111 V 5-й байт V т V о V 21-й байт V 11001111 11000010 V 6-й байт V о V б V 22-й байт V 00100000 11011111 V 7-й байт V V ъ V 23-й байт V 11001110 11010001 V 8-й байт V н V я V 24-й байт V 11000101 11010100 V 9-й байт V е V т V 25-й байт V 00100000 11001110 V10-й байт V V н V 26-й байт V 11001111 11001111 V11-й байт V о V о V 27-й байт V 11000010 11000111 V12-й байт V б V г V 28-й байт V 11001110 11001111 V13-й байт V н V о V 29-й байт V 11001001 00100001 V14-й байт V и V ! V 30-й байт V 11001101 00100000 V15-й байт V м V V 31-й байт V 11000101 00100000 V16-й байт V е V V 32-й байт V Ok ZWWWWWWWWWWQWWWQWWWQWWWWWWWWWWW[ ⌡ ⌡⌡ ⌡ ⌡ ⌡⌡⌡ ⌡⌡⌡ ⌡ ⌡⌡ ⌡ ⌡ ⌡⌡ ⌡⌡⌡ ⌡⌡ ⌡ ⌡⌡ ⌡⌡ ⌡ ⌡ Образ спрайта на экране ⌡⌡ ⌡ ⌡ ⌡⌡ ⌡⌡⌡⌡ дисплея ⌡⌡ ⌡⌡⌡⌡ ⌡⌡ ⌡ ⌡ ⌡⌡ ⌡⌡⌡⌡⌡ ⌡⌡ ⌡⌡⌡ ⌡⌡ ⌡ ⌡ ⌡⌡ ⌡ ⌡ ⌡⌡ ⌡ ⌡ ⌡ ⌡⌡ ⌡⌡⌡ ⌡⌡ ⌡⌡⌡⌡ ⌡⌡ ⌡⌡⌡⌡ ⌡⌡ ⌡ ⌡⌡ ⌡⌡⌡ ⌡⌡ ⌡⌡⌡ ⌡⌡ ⌡⌡⌡⌡ ⌡⌡ ⌡ ⌡ ⌡ ⌡ ⌡⌡ ⌡⌡ ⌡ ⌡ ⌡⌡ ⌡ ⌡ ⌡ Блок размером 16\16 рассматривается как совокупность четырех блоков, каждый из которых имеет размер 8\8. Эти блоки объединяются вместе в после- довательности, указанной на рисунке: 8 V░WWWWWWW▐V W▌WXWWWWWWWWWRWWWWWWWWWWYW▌W V V V V V 8V V 1 V 3 V V V V V V V W█WVWWWWWWWWWVWWWWWWWWWWV V 16 V V V V V 2 V 4 V V Рис.4 V V V V WWWWW ZWWWWWWWWWQWWWWWWWWWW[W█W П р и м е р 5. WWWWWWWWWWWWW XWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWY Что мы желаем впоследствии увидеть V V V V V V V V V V V V V V V V V на экране дисплея! VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV V V V V V V V V V V V V V⌡V⌡V V V ⌡⌡ VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV ⌡⌡⌡⌡⌡ ⌡⌡⌡ V V V V V⌡V⌡V⌡V⌡V⌡V V V⌡V⌡V⌡V V V ⌡⌡ ⌡⌡⌡⌡ ⌡ VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV ⌡⌡ ⌡ ⌡⌡ ⌡ V V V V⌡V⌡V V V V⌡V⌡V⌡V⌡V V⌡V V V ⌡⌡ ⌡ ⌡ ⌡ VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV ⌡⌡⌡ ⌡⌡⌡ ⌡ V V V⌡V⌡V V⌡V V V V⌡V⌡V V V⌡V V V ⌡⌡ ⌡⌡⌡⌡⌡ ⌡⌡ VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV ⌡⌡ ⌡⌡⌡⌡⌡ ⌡⌡⌡ V V V⌡V⌡V V⌡V V V V⌡V V V⌡V V V V ⌡⌡⌡⌡ ⌡⌡⌡ ⌡⌡⌡ VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV ⌡⌡⌡⌡⌡ ⌡⌡⌡ V⌡V⌡V⌡V V V V V V V V⌡V⌡V⌡V V⌡V V ⌡ ⌡⌡⌡ ⌡⌡ ⌡ VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV ⌡⌡ ⌡ ⌡⌡⌡⌡ ⌡ V⌡V⌡V V V V V V⌡V⌡V⌡V⌡V⌡V V V⌡V⌡V ⌡ ⌡⌡ ⌡⌡⌡⌡⌡⌡ VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV ⌡⌡⌡⌡⌡ ⌡⌡⌡ V V⌡V⌡V V V⌡V⌡V⌡V⌡V⌡V V V V⌡V⌡V⌡V ⌡⌡⌡ ⌡⌡⌡ VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV V V V V⌡V⌡V⌡V⌡V V⌡V⌡V⌡V V V⌡V⌡V⌡V OO VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV OOOOO OOO V V V V V V V V⌡V⌡V⌡V⌡V⌡V V⌡V⌡V⌡V OO OOOO O VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV OO O OO O V V V V V⌡V V⌡V⌡V⌡V V⌡V⌡V V V⌡V V OO O O O VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV OOO OOO O V V V V V⌡V⌡V V⌡V V⌡V⌡V⌡V⌡V V⌡V V OO OOOOO OO VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV OO OOOOO OOO V V V V⌡V V⌡V⌡V V⌡V⌡V⌡V⌡V⌡V⌡V V V OOOO OOO OOO VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV OOOOO OOO V V V V⌡V⌡V⌡V⌡V⌡V V V⌡V⌡V⌡V V V V O OOO OO O VWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWV OO O OOOO O V V V V V⌡V⌡V⌡V V V⌡V⌡V⌡V V V V V O OO OOOOOO ZWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQW[ OOOOO OOO OOO OOO Завершающий этап! Определение образа спрайта: 30 X$=CHR$(&H0) +CHR$(&H0) +CHR$(&HF) +CHR$(&H18)+ CHR$(&H34)+CHR$(&H34)+CHR$(&HE0)+CHR$(&HC1) 40 Y$=CHR$(&H67)+CHR$(&H1E)+CHR$(&H1) +CHR$(&HB)+ CHR$(&HD) +CHR$(&H16)+CHR$(&H1F)+CHR$(&HE) 50 Z$=CHR$(&H0) +CHR$(&HC) +CHR$(&H9C)+CHR$(&HF4)+ CHR$(&H64)+CHR$(&H48)+CHR$(&HCA)+CHR$(&HF3) 60 W$=CHR$(&HC7)+CHR$(&HE7)+CHR$(&HF7)+CHR$(&HB2)+ CHR$(&H7A)+CHR$(&HFC)+CHR$(&H38)+CHR$(&H70) 70 SPRITE$(1)=X$+Y$+Z$+W$ Отметим,что размер спрайтов определяется оператором SCREEN [n][,s] , где: 1) n - арифметическое выражение,целая часть значения которого принад- лежит отрезку [0,3] и указывает режим экрана; 2) s - арифметическое выражение,целая часть значения которого принад- лежит [0,3] и определяет размеры спрайтов. Возможны следующие случаи: s=0: спрайты длиной 8 байтов, занимающие 8\8 точек экрана; s=1: спрайты длиной 8 байтов, такие же как и при s=0, но с двухкратным увеличением размеров по обоим направлениям и занимающие поэтому 16\16 то- чек экрана; s=2: спрайты длиной 32 байта,занимающие 16\16 точек экрана; s=3: спрайты длиной 32 байта, такие же,как и при s=2, но с двухкратным увеличением размеров по обоим направлениям и занимающие поэтому 32\32 точ- ки экрана. З а м е ч а н и я. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWY V 1) Оператор SCREEN ,s не очищает экран, однако с т и р а е т V V образы спрайтов из памяти компьютера. V V 2) Оператор SCREEN n очищает экран б е з с т и р а н и я V V образов спрайтов из памяти компьютера. V ZWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW[ Опишем синтаксис и семантику оператора, служащего для вывода на экраны 1,2 и 3 образов спрайтов (коротко - с п р а й т о в): PUT SPRITE t,[[@][STEP](X,Y)],[C][,n] , где: 1) PUT("to put"-"выводить"), SPRITE - служебные слова; 2) t - арифметическое выражение,целая часть значения которого должна принадлежать отрезку [0,31]; она задает "экранный" номер спрайта (sprite plane namber"); 3) n - арифметическое выражение,целая часть значения которого опреде- ляет номер одного из сформированных в оперативной памяти спрайтов, образ которого выведен на экран под номером t ("sprite pattern number").По умол- чанию значение n совпадает со значением t; 4) (X,Y) или STEP(X,Y) - элементы, определяющие координаты верхнего левого угла блока точек на экране, в котором размещается образ спрайта, причем элементы (X,Y) и STEP(X,Y) могут задавать точку (X0,Y0) с коорди- натами, удовлетворяющими условиям -32768ЁX0,Y0Ё32767. Однако,в отличие от других графических операторов для спрайтов характерен неприятный эффект "свертывания" изображения на экране, который состоит в том, что, если мы попытаемся высветить спрайт за правой границей экрана, то этот спрайт вы- светится с левой стороны экрана,т.е. компьютер вычисляет координаты спрай- та (X,Y) по формулам: X=INT(ABS(X0)MOD255), Y=INT(ABS(Y0)MOD191) (для экрана SCREEN2); Заметим, что координата Y спрайта с д в и н у т а на одну позицию,то есть для изображения спрайта, левый верхний угол которого будет иметь ко- ординаты (X,Y), необходимо использовать оператор: PUT SPRITE t,(X,Y-1),C,n 5) C - арифметическое выражение,целая часть значения которого принад- лежит отрезку [0,15] и определяет цвет спрайта; 6) @ - необязательный элемент оператора PUT SPRITE,никак не влияющий на его выполнение. Отметим, что только t является необходимым аргументом, остальные могут быть опущены. При выполнении оператора PUT SPRITE спрайт с номером n получает "экран- ный" номер t и размещается с позиции, определяемой элементами (X,Y) или STEP(X,Y), причем, точки, соответствующие его единичным битам, раскрашива- ются цветом C. Обратите особое внимание на следующий пример! П р и м е р 6. Формирование образа спрайта с помощью оператора DATA. WWWWWWWWWWWWW Следующие три программы формируют и выводят на экран об- раз одного и того же спрайта! ═) NEW ║) NEW Ok Ok 10 COLOR 1,15,8:SCREEN 2,1 10 COLOR 1,15,8:SCREEN 2,1 15 DATA 11000000 20 Y$="алгоритм" 20 DATA 11001100 130 SPRITE$(0)=Y$ 25 DATA 11000111 140 PUT SPRITE 0,(110,85),8 30 DATA 11000100 150 GOTO 150 35 DATA 11010010 40 DATA 11001001 ╖) NEW 45 DATA 11010100 Ok 50 DATA 11001101 10 COLOR 1,15,8:SCREEN 2,1 100 FOR S=1 TO 8:READ R$ 20 DATA 193,204,199,207,210 110 Y$=Y$+CHR$(VAL("&B"+R$)) ,201,212,205 120 NEXT 100 FOR I=1 TO 8:READ R:Y$= 130 SPRITE$(0)=Y$ Y$+CHR$(R):NEXT:SPRITE$(0)= 140 PUT SPRITE 0,(110,85),8,0 Y$:PUT SPRITE 0,(110,85),8 150 GOTO 150 150 GOTO 150 Очевидно, что программа ═ дает наглядное представление об образе спрай- та уже на стадии составления программы.Если же Вы умеете пользоваться ин- струментальным средством - программой "Редактор спрайтов", то лучше всего формировать спрайт при помощи десятичных кодов (пример - программа ╖). И, наконец, программа ║ выводит на экран графический образ спрайта со значе- нием "алгоритм"; при этом пользователь, разумеется, не может заранее пре- дугадать вид "пятна" (образа спрайта), образующегося на экране! П р и м е р 7. WWWWWWWWWWWWW NEW Ok 10 KEY OFF:COLOR15,1,5:SCREEN1,2 20 DATA 96,144,191,160,159,159,79,79,39,23,10,7,1,1,7,31,6,9,253,5,233, 233,210,210,164,168,80,224,128,128,224,248 30 FOR I=1 TO 32:READ A:A$=A$+CHR$(A):NEXT:SPRITE$(1)=A$ 40 PUT SPRITE 1,(120,90) П р и м е р 8 [4]. Двенадцать одинаковых спрайтов. WWWWWWWWWWWWW NEW Ok 10 COLOR 1,15,8:SCREEN 2,3 20 W$="Двенадцатьспрайтов-четыревстроке":SPRITE$(40)=W$ 40 S=0:FOR I=20 TO 230 STEP 60:FOR J=20 TO 170 STEP 60 60 PUT SPRITE S,(I,J),13-S,40:S=S+1:NEXT J,I 'Обратите внимание на то, что параметр t ("экранный" номер спрайта) изменяется! 80 GOTO 80 Итак, одному значению n может соответствовать несколько значений пара- метра t, находящегося в одном или нескольких операторах PUT SPRITE.Это по- зволяет при необходимости "размножать" спрайт в виде нескольких одинако- вых образов на экране дисплея. П р и м е р 9. Спрайты с псевдослучайными образами. WWWWWWWWWWWWW 10 COLOR 1,15,8:SCREEN 2,3:FOR K=1 TO 12:Y$="":FOR Z=1TO32 40 Y$=Y$+CHR$(INT(RND(1)*256)):NEXTZ:SPRITE$(K)=Y$:NEXTK 70 S=1:FOR I=20 TO 230 STEP 60:FOR J=20 TO 170 STEP 60 90 PUT SPRITE S,(I,J),13-S:S=S+1:NEXTJ,I 110 GOTO 110 П р и м е р 10. Движение спрайта по горизонтали. WWWWWWWWWWWWWW 10 COLOR 1,15,8:SCREEN 2,3 20 X$="терминал":SPRITE$(0)=X$+X$+X$+X$ 40 FOR K=1 TO255:PUT SPRITE 5,(K,80),4,0'Обратите внимание на то,что з начения параметров t и n не меняются! 90 NEXT:GOTO 40 П р и м е р 11. Надеемся, что приведенный ниже пример доставит Вам WWWWWWWWWWWWWW большое эстетическое наслаждение! 10 ' OOOOO C o l o r OOOOO 20 COLOR 15,1,1:SCREEN 2,2 30 OPEN "GRP:" AS #1 40 FOR S=1 TO 2:A$="":FOR P=1 TO 32:READ D$ 60 A$=A$+CHR$(VAL("&H"+D$)):NEXT 70 SPRITE$(S)=A$:NEXT 80 FOR K=15 TO 2 STEP-1:Y=K*11+13:FOR X=10 TO 75+K*5 STEP 2 100 PUT SPRITE K,(X,Y),K,1:PUT SPRITE K+15,(X+8,Y-16),K,2 120 LINE (X-4,Y+3)-(X-2,Y+12),K,BF:NEXT 130 READ D$:PSET(X+30,Y-13),1: PRINT #1,D$ 140 S=50+K*2:PLAY"v9n=s;32":NEXT '░WW Как, и музыка здесь! 150 DRAW "bm15,15":PRINT #1,"Transparent" 160 DRAW "bm15,26":PRINT #1,"Black" 170 DRAW "bm27,0":PRINT #1,"Press RETURN key" 180 IF INKEY$<>CHR$(13) THEN 180 190 COLOR 15,4,7:END 200 DATA 1,2,4,D,17,13,21,23,47,4C,F0,C0,0,0,0,0,3F,7E,FC,F8,F0,E0,C0, 80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,4,9,13,27,4F,9F,0,0,0,0,10,28,4 C,9E,3F,7E,FC,F8,F0,E0,C0,80 260 DATA White,Gray,Magenta,Dark Green,Light Yellow,Dack Yellow, Light Red,Medium Red,Sky Blue,Dark Red,Light Blue,Dark Blue,Light Green,Medi um Green