ПРИЛОЖЕНИЕ 2
простейший генератор шаблонов.
Спраитами называют графические объекты, которые ногут
воспроизводиться на экране и перемешаться по нему, не изменяя
изображения, которое там первоначально было, поскольку манипу-
ляции со спраитами служат для обеспечения мультипликации, то
изучение их не входит в рамки данной книги, а явится темой оче-
редного тона - "Динамическая графика". В то же время, если от
вопросов перемещения спрайтов по экрану пока отвлечься, то про-
грамму для их редактирования можно использовать и для создания
статических шаблонов.
Здесь рассматривается программа для создания шаблонов изо-
бражении размером £4Х£1 пиксел. Такой размер достаточно удобен
по целому ряду соображений. с одной стороны, это достаточно
большой размер, позволяющий реализовать художественные способ-
ности при создании образов, с другой стороны, он не настолько
велик, чтобы скорость операции печати шаблона стала заметно
критичной для программиста, в принципе, размер шаблонов 24X24
может быть был бы чуть более удобней при программировании, но
зато при размере 24X21 мы можем так организовать генератор,
чтобы на экране каждый пиксел будущего спрайта изображался од-
ним знакоместом.
Поскольку эта программа очень удобна для создания спрай-
тов для ваших программ, мы воспользуемся ею же и в третьем
тоне нашей книги - "Динамическая графика".
Программа состоит из двух частей. Первая часть - это го-
ловной управляющий блок, написанныи на БЕИСИКе. он приведен в
Листинге.1. Вторая часть - исполнительные процедуры в машинных
кодах, они выполняют такие операции, как инвертирование изобра-
жения. реверсирование изображения, переброску картинки из рабо-
чего буфера в отведенную для спрайтов область памяти, вызов их
оттуда в буфер на редактирование и т. п. Блок машинных кодов
приведен в листинге.2 вместе с загрузчикон.
Сначала наберите машиннокодовыи блок (/1истинг_г). Запусти-
те загрузчик командой RUN. Если все набрано правильно, вы полу-
чите сообщение STOP. Если же где-то Вы сделали ошибку, то полу-
чите сообщение "??". Не сошлась контрольная сумма - следует еше
раз внимательно проверить строки DATA. После того, как все
будет закончено. Вы можете сохранить олок на ленте командой
SAVE "sprcode" CODE 54200,350.
Теперь можете приступать к набору БЕИСИКа (Листинг_1). он
запускается командой RUN.
В этом редакторе вы можете одновременно создавать (редак-
тировать) и хранить до to спрайтов одновременно (обозначаются
буквами от "а" до "j">. Когда с одним из них Вы работаете, он
находится в рабочем буфере. По окончании работы с ним он
копируется в область таблицы спрайтов - это делает команда
RANDOMIZE USR 54317. Противоположное действие по вызову нужного
спрайта из таблицы в буфер на редактирование исполняет команда
RANDOMIZE USR 54353. Изображение на экране того, что находится
в буфере, исполняет команда RANDOMIZE USR 54200.
кроме- простого рисования спрайтов. вы можете в этой про-
грамме инвертировать изображение и реверсировать его. инверти-
рование выполняется по нажатию клавиш CAPS SHIFT "I" - при этом
изображение вместо "черным по белому" становится "белым по чер-
ному". реверсировать (переворачивать) изображение можно по
горизонтали (CAPS SHIFT "R") или по вертикали (CAPS SHIFT "U").
вернуться в исходное меню можно нажатием CAPS SHIFT "Z".
Перемещение курсора по полю выполняется курсорными клави-
шами 5, б. 7. в. При этом не происходит рисования. Перемещение
курсора с рисованием исполняет^- этими же клавишами при нажатой
клавише SYMBOL SHIFT.
Редактор удобен еше и тем. что рядом с увеличенным изобра-
жением спрайта выстраивается и его изображение в натуральную
величину.
спраиты хранятся в таблице, начинающейся с адреса 54600.
Поскольку каждый спрайт состоит из 504 124 X 21) эленеитов. то
для него необходимы 63 (63 х в = 504) байта. Таким образом, вся
таблица десяти спрайтов занимает область памяти размером 630
байтов. v
листинг. 1
Генератор (редактор) спрайтов.
10 LOAD "sprcode" CODE 54200.350
100 LET a=22529: LET J=0: LET S=a: LET p=S
110 GO SUB 1200
120 GO TO 560
130 POKE P. 233
140 LET h*=INKEY*
150 RANDOHIZE USR 54200
160 PAUSE 1. 5
170 LET P=s: LET J = PEEK P
160 IF h*="I" THEN RANDOHIZE USR 54422:
RANDOHIZE USR 54200
190 IF THEN RANDOHIZE USR 54436:
RANDOHIZE USR 54200
200 IF h*="U" THEN RANDOMIZE 54462'
RANDOMIZE USR 54200
210 IF hS^Z" THEN GO TO 460
220 IF h*<"4" OR h*>-6" THEN GO TO 240
230 GO TO 370
240 IF h*<"Z" OR h«>"(" THEN GO TO 140
, 250 IF THEN LET S=S-1
260 IF THEN LET S=S+32
270 IF THEN LET S=S-32
260 IF h*="(" THEN LET s=s+l
290 GO SUB 1160
300 IF w=0 THEN LET s=s*l: GO TO 140
310 IF w>24 THEN'LET s = s-l: GO TO 140
320 IF S<a THEN 1ET S"-S+32: GO TO 140
330 IF S>a-l*21«32 THEN LET s=S-32: GO TO 140
340 POKE P. 0
350 POKE S, 130
360 GO ТО 140
370 IF h«="5" THEN LET s=s-l
360 IF h*="6" THEN LET s=s+32
390 IF h*-"7" THEN LET s=s-32
400 IF h*-"6" THEN LET s-s*l
410 GO SUB 1160
420 IF W=0 THEN LET S=SM: GO TO 140
430 IF w>24 THEN LET S=S-1: GO TO 140
440 IF s<a THEN LET S=S+32
450 IF s>a-l*21«32 THEN LET S=S-32
460 POKE P, 56
470 POKE S,135: GO TO 140
460 PRINT AT 1.26: "SAVE "
490 PRINT AT 3,26; "a-J"
500 LET INKEY*
510 IF h«<"a" OR a$>"J" THEN GO TO 500
520 LET v=CODE hS-96: POKE 23300. V
530 RANDOHIZE USR 54317
540 BEEP . 4. 20
550 GO SUB 1000
560 PRINT AT 1.26; "E a-J"
570 PRINT AT 3.26, "1 SAVE"
560 PRINT AT 5,26; "2 LOAD"
590 LET h$=INKEY»
600 IF h*="l" THEN GO TO 1100
610 IF M-'Z" THEN GO TO 1130
620 IF h*<"a" OR h$>"J" THEN GO TO 590
630 LET V=CODE h»-96: POKE 23300.V
640 GO SUB 1000
650 RANDOMIZE USR 54353
660 PRINT AT 7.26; h$; " ";v;" "
670 BEEP . 4. 30
660 GO TO 130
1000 PRINT AT 1.26;"
1010 PRINT AT 3, 26; "
1020 PRINT AT 5.26;"
1030 RETURN
1100 INPUT "SAVE "; Tit: IF n* = "" THEN GO TO 1100
И 10 SAVE П» CODE 54600.699
1120 GO TO 40
1130 INPUT "LOAD ";П»: LOAD П* CODE: CLS
1140 GO TO 40
1150 STOP
1160 LET f=INT (S/32) LET w-S-f»32
1170 RETURN
1200 FOR K=8 TO 200 STEP 6
1210 PLOT K,6: DRAW 0.167
1220 NEXT К
1230 FOR K = 6 TO 175 STEP 6
1240 PLOT 6. K: DRAW 192,0
1250 NEXT К
1260 PLOT 8.175: DRAW 192,0
1270 RETURN
Листинг_2
Блок рабочих процедур.
2000 LET b=54200: LET Z = 0: LET r=350: RESTORE 3000
£010 FOR K=0 Tp Г-1 READ a
2020 POKE tb+K). a: LET Z=Z+a
2030 NEXT К
£040 LET Z= INT ((<Z/r)-INT (Z/D)«r)
£050 READ a: IF a<>z THEN PRINT "??": STOP
3000 DATA 33. 250. 212. 17. 1
3001 DATA 68. 14. 3. £13. 237
3002 DATA 83. £46. £12, 6. 21
3003 DATA 237. 91. 246, 212. 197
3004 DATA 6, 6, 26, 254. 0
3005 DATA 40. 4. 254. 130. 32
3006 DATA 6, 55. 203. 22, 195
3007 DATA 224. 211. 167. 203. 22
3008 DATA 19. 16, 235. 229. 42
3009 DATA 246. 212. 1. 32. 0
3010 DATA 9. 34. 246. 212. 225
ЗОИ DATA 193. 35. 16, 212. 209
3012 DATA 62, 6. 131, 95, 13
3013 DATA 32. 197. 33, 250, 212
3014 DATA 17, 123, 72, 6. 3
3015 DATA 213. 197, 14, 3. 6
3016 DATA 6. 213. 126, 16. 20
3017 DATA 35, 16, 250. 209. 62
3016 DATA 32. 131. 95, 121. 61
3019 DATA 254. 1. 32. 5. 6
3020 DATA 5. 79. 24. 233. 6
3021 DATA 6. 79, 254, 0. 32
3022 DATA 226. 193. 209. 19. 16
3023 DATA 215. 201. 205. 64. 212
3024 DATA 34. 248, 212. 237, 91
3025 DATA 248. 212. 33. 250. 212
3026 DATA 1. 63. 0. 237. 176
3027 DATA 201, 58. 4, 91. 71
3028 DATA 33. 72. 213, 17. 63
3029 DATA 0, 167, 237, 82. 25
3030 DATA 16. 253. 201. 205. 64
3031 DATA 212. 34. 248. 212. 17
3032 DATA 1. 88. 14. 3. 213
3033 DATA 237, 83, 246, 212. 6
3034 DATA 21. 237. 91, 246. 212
3035 DATA 197. 6. 8. 126. 167
3036 DATA 203. 39, 245, 48. 5
3037 DATA 62. 0. 195. 120. 212
3038 DATA 62. 56. 18. 241. 19
3039 DATA 16. 239. 229. 42. 246
3040 DATA 212. 1, 32. 0, 9
3041 DATA 34. 246. 212. 225. 193
3042 DATA 35, 16. 214. 209. 62
3043 DATA 6. 131. 95. 13. 32
3044 DATA 199. 201. 33. 250, 212
3045 DATA б. 63. 62. 255. 174
3046 DATA 119. 35, 16. 249. 24
3047 DATA 39. 33. 250. 212. 6
3046 DATA 63. 197. 126, 1. 0
3049 DATA 8. 167, 203, 31, 203
3050 DATA 17. 16. 250. 113. 193
3051 DATA 35. 16, 239, 6. 21
3052 DATA 33. 250. 212. 17. 36
3053 DATA 213, 76, 26, 119, 121
3054 DATA 16. 35, 19. 16. 247
3055 DATA 33. 250, 212, 205. 67
3056 DATA 212. 201, 33, 14, 213
3057 DATA 17, 250, 212. 6. 3
3056 DATA 197. 213. 229, 6. 10
3059 DATA 78. 26, 119. 121, 18
3060 DATA 43. 19, 16. 247. 225
3061 DATA 209. 1. 21. 0, 84
3062 DATA 93. 19. 9. 193. 16
3063 DATA 230. 24. 213. 0. 0
3064 DATA 0. 0, 0, 0. 255
3065 DATA 255, 255, 0. 0. 190
3066 DATA 190. 190, 190, 190, 190
3067 DATA 190. 190. 190, 190. 128
3068 DATA 254. 254. 254, 254, 254
3069 DATA 254. 254. 254. 0.0
3070 DATA 190, 0, 0, 0. 0