ZX Spectrum графика 1994 г.

Графические команды ZX SPECTRUM - Команды PAPER и INK; Дисплейный файл; Команда BORDER; Символьные блоки; Команды PLOT и DRAW; Команды PRINT и LIST; Команды INVERSE и OVER; Команды FLASH и BRIGHT; Атрибуты; Простейшее движущееся изображение; Команды CIRCLE и DRAW; Цвета в символьном блоке; Простая игра.


ГЛАВА 1

Графические команды ZX SPECTRUM

Мы полагаем, что читатель хорошо знает язык бейсик-спектрум. В этой главе, однако, мы приводим обзор некоторых команд бейсика - тех, которые связаны с графикой. Серия примеров и упражнений демонстрирует графические возможности SPECTRUMa. Сведения, приведенные в этой главе, используются в последующем для построения теории и практических приложений машинной графики.

Вначале мы рассмотрим графические возможности оборудования и программного обеспечения. Все микрокомпьютеры, которые могут производить телевизионное изображение, используют технологию RASTER SCAN. Это относится к большинству современных коммерческих микрокомпьютеров и большим машинам. В памяти отводится специальная область, в которой хранится информация об изображении на экране, которая просматривается бит за битом по мере того, как электронный луч скользит по поверхности экрана. Изображение на экране состоит из точек, каждая из которых представлена одним битом (бинарное да/нет) памяти. В простейшем случае точка экрана высвечивается на короткое время каждый раз, когда встречается "да".

Команды PAPER и INK ("бумага" и "чернила", фон и тон)

Изображением на экране, состоящим из рисующих INK-точек (бинарное "да") и фоновых PAPER-точек (бинарное "нет"), можно по точечно управлять с помощью двух команд. Эти команды PAPER и INK вызываются указанием имени команды и следующего за ним номера N (0<=N<=9).

Команда PAPER N устанавливает N-ый цвет фона; изображение будет иметь фон цвета N, пока в программе не встретится другая команда PAPER.

Аналогичным образом команда INK N устанавливает цвет тона, если 0<=N<=7, тона соответствующей клавише клавиатуры дисплея написан цвет N. Если N=8, то используется цвет, который использовался ранее для области. Если N=9, то цвет PAPER/INK становится белым или черным и будет контрастным для текущего цвета INK/PAPER.

Сочетание черного INK цвета и белого PAPER цвета дают самые четкие картинки и являются нормальными значениями этих цветов для SPECTRUM.

128 32 8 2

64 16 4 1

00000000= = 0 01100010= • • • =98

10010100= 10001000= 10001000= 10001000= 10010100=

= 148

= 136 = 136 = 136 = 148

01100010= • • • =98

Дисплейный файл (отобразить на экране содержимое файла) Такой тип изображения мы называем "отображением участка памяти" (MEMORY-MAPPED), так как оно однозначно определяется содержимым участка памяти. В SPECTRUME этот участок называется дисплей-файлом и начинается с ячейки 16384.Программа на листинге 1.1 демонстрирует, как меняется изображение на экране при изменении содержимого памяти. LISTING 1.1

10 LET CORNER=16384 20 LET VALUE=137 30 POKE CORNER,VALUE 40 STOP

Эта программа использует программу РОКЕ для занесения значения (десятичного)переменной VALUE в первую позицию дисплей-файла. В этой позиции содержится информация, управляющая изображением в левом верхнем углу экрана. Так как каждая ячейка, или байт, содержит восемь бит, то программа затрагивает первые восемь точек экрана (двоичное значение - 10001001), так что изображение в первых восьми точках экрана соответствует этому числу.

Упражнение 1.1

1. Попробуйте различные значения VALUE и измените программу так чтобы либо

а). использовать BIT (двоичное) представление VALUE, либо

б). использовать для изменения VALUE цикл FOR..NEXT.

2. Использовать команды PAPER и INK и посмотреть, какой это производит эффект.

Команда BORDER (граница, рамка экрана) Если изменить PAPER-цвет, то можно увидеть, что мы не можем рисовать на всем экране. По краям поля PAPER идет поле BORDER; это делается для того, чтобы избежать искажений, характерных для всех телевизионных дисплеев. Цвет этого поля может быть изменен аналогично цветам PAPER и INK с помощью команды BORDER N, где 0<=N<=7

Символьные блоки

Присваивая ячейкам памяти различные значения VALUE, можно получить любую картинку. Например, присваивая значения VALUE 0, 98, 148, 136, 136, 136, 148, 98 ячейкам, соответствующим первым восьми точкам восьми последовательных линий экрана (листинг 1.2), мы увидим картинку из INK-точек (см рис. 2).

Таким образом, определяются (и переопределяются) символы в SPECTRUMe, но оставим эту тему до главы 5. Мы видим, что для составления даже такой простой программы требуется сравнительно сложная подпрограмма. LISTING 1.2

10 LET CORNER=16384 20 LET LINE=256

30 DATA 0,98,148,136,136,136,148,98

40 FOR I=0 TO 7

50 LET MEMORY=CORNER+I*LINE

60 READ VALUE

70 POKE MEMORY,VALUE

80 NEXT I

90 STOP

Команды PLOT и DRAW ("нанести точку" и "начертить линию") Мы видим, что изображение на экране можно изменять, занося различные значения в дисплейный файл. Но было бы весьма утомительно менять содержимое каждой из6000 ячеек дисплейного файла; нам, очевидно, необходим более эффективный способ менять изображение.

Простейшими командами бейсика, служащими этой цели, являются PLOT и DRAW. Во всех графических команда дисплей считается сеткой, состоящей из 256горизонтальных строк и 176 вертикальных столбцов (всего 45056 точек). Точки, из которых состоит экран, называются пикселями (PIXELS), и каждой из них соответствует пара целых чисел. Графические команды позволяют нам управлять так называемым графическим пером, которое в начале работы расположено над точкой (0,0).Перейдем к самим командам.

По команде PLOT X,Y перо перемещается в точку X,Y и ставит там INK-точку.

По команде DRAW X,Y перо проводит прямую из точки, в которой оно находилось, в точку, которая удалена от нее на X столбцов по горизонтали и Y строк по вертикали. Если X отрицательно, то перо сдвинется влево, а если X положительно, то перо сдвинется вправо, а если Y положительно, то перо сдвинется вверх.

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

Мы готовы к созданию более крупных рисунков. Например, мы можем заключить графическое поле дисплея в рамку (листинг 1.3). LISTING 1.3 10 PLOT 0,175 20 PLOT 255,175 30 PLOT 255,0 40 PLOT 0,0

50 IF INKEY$ <>"" THEN GO TO 50

60 IF INKEY$ ="" THEN GO TO 60

70 DRAW 0,175

80 DRAW 255,0

90 DRAW 0,-175

100 DRAW -255,0

110 STOP

Эта программа сначала ставит точки в углах экрана; затем она ожидает нажатия любой клавиши для того, чтобы соединить их прямыми. Сравнивая команды PLOT и DRAW, мы видим одно принципиальное различие между ними: PLOT использует абсолютные координаты, a DRAW - относительные координаты, соответствующие взаимному расположению точек на экране. Это означает, что перед тем, как провести линию между двумя точками экрана, сначала следует использовать команду PLOT для установки пера в первой точке, а затем вычислить расположение второй относительно первой. Обратите внимание, что в программе на листинге 1.3 позиции всех точек являются константами. Обычно они являются входными параметрами или вычисляются в процессе выполнения программы. Упражнение 1.2

Напишите программу, которая бы вычисляла позиции линий в сетке. Начертите эти линии, используя два цикла FOR...NEXT (один для горизонтальных прямых, другой для вертикальных). Упражнение 1.3

Напишите программу, которая содержит в качестве входной информации координаты N точек экрана, вводимые с клавиатуры, а рисует неправильный многоугольник с вершинами в этих точках (следует внимательно обдумать эту программу, так как первая точка должна быть соединена с последней).

Команды PRINT и LIST Мы пока не обсуждали самого простого способа изменения изображения на экране, а именно, использования команд PRINT и LIST. Это произошло потому, что эти команды оперируют с символьными блоками и пригодны лишь для графических работ с низкой разрешающей способностью. Эти вопросы будут обсуждаться в главе 5, так как SPECTRUM позволяет сочетать технику графики с высокой разрешающей способностью. Рассмотрим один такой пример здесь. Предположим, что мы добавили строчку

5 LIST

к началу программы упражнения 1.2, а затем нарисуем с помощью программы сетку из 32 вертикальных и 22 горизонтальных линии. Мы получим картинку, на которой видны размеры и позиции символов.

Мы можем использовать команду PLOT для того, чтобы продемонстрировать графические возможности SPECTRUMa для получения изображения фракталей.

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

затов. которые мы нумеруем согласно рисунку 3.

Рассмотрим квадрат со стороной 4 в степени N, это 16 квад

13

14

15

16

9

10

11

12

5

6

7

8

1

2

3

4

Рис. 3.

Четыре из этих квадратов, с номерами 2, 8, 9, 15 мы переставляем, как это показано на рис. 4.

15

13

14

16

10

11

12

8

9

5

6

7

1

3

4

2

Рис. 4.

Каждый из этих квадратов разбивается на 16 меньших квадратов, с каждым из которых производится та же процедура. Мы продолжаем этот процесс, пока длина квадрата не становится равной 1. В результате мы получаем фракталь, состоящую исключительно из единичных квадратов, которые мы можем интерпретировать как точки и нанести на экран командой PLOT. Программа, текст которой приведен на листинге 1.4, начинает с квадрата со стороной 64=43 и содержит три вложенных цикла FOR...NEXT. В результате выполнения этой программы мы получим рисунок, приведенный на рис. 5.

Рис. 5.

LISTING 1.4

10 DIM X(16):DIM Y(16)

20 FOR I=1 TO 4

30 FOR J=1 TO 4

40 LET K=4*I+J-4

50 LET X(K)=J-3: LET Y(K)=I-3

60 NEXT J: NEXT I

70 LET X(2)=0: LET Y(2)=-3

80 LET X(8)=2: LET Y(8)=0

90 LET X(9)=-3: LET Y(9)=-1

100 LET X(15)=-1: LET Y(15)=2

110 FOR I=1 TO 16

120 FOR J=1 TO 16

130 FOR K=1 TO 16

140 LET XX=16*X(I)+4*X(J)+X(K)

150 LET YY=16*Y(I)+4*Y(J)+Y(K)

160 PLOT 126+XX,88+YY

170 NEXT K:NEXT J:NEXT I

180 STOP

Команды INVERSE и OVER Сейчас мы рассмотрим возможности изменения способа изображения точек и прямых на экране. Имеются две такие команды, и при использовании их следует указывать имя этой команды, за которой должно следовать число: 1 -включает эффект, а 0- выключает..

При включенной команде OVER точка экрана, которую затрагивает любая из графических операций, меняет свое состояние на противоположное. Каждая точка цвета INK становится цвета PAPER и наоборот. Это означает перекидывание двоичного ключа из одной позиции в противоположную.

Используя эти команды, мы можем создавать программы, которые создают сложные на вид рисунки с быстроменяющимся изображением. На листинге 1.5 приведена программа, которая содержит два способа создания сложных узоров с помощью простых алгоритмов. LISTING 1.5 10 OVER 1 20 LET LINES=400

30 LET A=0: LET ANGLE=2*PI /LINES

40 FOR I=1 TO LINES

50 LET X=85*COS A

60 LET Y=85*SIN A

70 PLOT 128,88

80 DRAW X,Y

90 LET A=A+ANGLE

100 NEXT I

110 OVER 0

120 STOP

На дисплее, состоящем из дискретных точек, линии, не являющиеся горизонталями или вертикалями, состоят из последовательно коротких горизонтальных и вертикальных участков. Когда две такие линии пересекаются под небольшим углом, то множество этих участков накладываются друг на друга. Рассмотрим рисунок 6, на котором изображена фигура, полученная с помощью программы на листинге 1.5. В центральной части линии многократно пересекаются, и если бы команда OVER не была включена, то центральный участок был бы черным от этих пересечений. Когда включена команда OVER, то включены те точки, которые лежат на пересечении нечетного числа линий, а остальные выключены. С другой стороны дыры по краям рисунка образованы точками, не лежащими ни на одной прямой.

Рис. 6.

Упражнение 1.4

Модифицируйте текст программы на листинге 1.5 так, чтобы можно было вводить значение LINES и значение новой STRING переменной с помощью программы. Выясните, какую роль играет команда OVER и элементы, из которых состоят соседние линии.

Использование последовательно генерируемых случайных чисел для создания быстроменяющихся картин на экране - излюбленный прием для привлечения внимания к компьютерам. Этот прием применяется в программе на листинге 1.6, где используются команды RND и OVER. LISTING 1.6 10 OVER 1

20 LET X=INT (RND *256) 30 LET Y=INT (RND *176) 40 PLOT X,Y 50 BEEP 0.05,(X-Y)/10 60 GO TO 20 Упражнение 1.5

Измените программу на листинге 1.6 с тем, чтобы она рисовала прямые, либо соединяющие случайные точки между собой, либо соединяющие случайные точки с центром (128,88).

В одном из предыдущих упражнений мы видим, что команда OVER позволяет изменять изображение на экране после выполнения каждой команды, даже если эта команда повторяется, например: повторное вычерчивание линии или точки. Команда OVER может использоваться для вычерчивания объекта на короткий промежуток времени - сначала рисуя его, а затем стирая. Программа на листинге 1.7 передвигает точку по экрану, сначала нанося ее программой PLOT в новой позиции, и тут же стирая ее со старой той же командой. LISTING 1.7

10 OVER 1: PAPER 0: INK 7: BORDER 4: CLS

20 LET SPEED=2

30 LET X=0: LET Y=0

40 LET XADD=SPEED: LET YADD=SPEED

50 PLOT X,Y

60 LET OLDX=X: LET OLDY=Y

70 LET X=X+XADD

80 IF X>255-SPEED OR X<SPEED THEN LET XADD=-XADD 90 LET Y=Y+YADD

100 IF Y>174-SPEED OR Y<SPEED THEN LET YADD=-YADD

110 PLOT X,Y

120 PLOT OLDX,OLDY

130 GO TO 60

Эту программу можно дополнить с тем, чтобы можно было управлять с клавиатуры движением точки (листинг 1.8.). Расположенные вокруг "F" буквы нижнего регистра позволяют нам посылать точку в восьми различных направлениях. Если нажать клавишу "Р", то точка при движении будет оставлять след; если нажать "Q", то следа не остается.

Этот способ приведения объекта в движение является важной и часто используемой техникой. Мы будем часто пользоваться этим приемом, как в программах игрового типа, так и в программах типа "курсор" главы 6. LISTING 1.8 10 OVER 1

20 LET X=0: LET Y=0 30 PLOT X,Y

40 LET OLDX=X: LET OLDY=Y 50 LET XADD=0: LET YADD=0

60 LET A$=INKEY$ : IF A$="" THEN GO TO 60 70 IF A$="P" THEN OVER 0 80 IF A$="Q" THEN OVER 1

90 IF (A$="E" OR A$="D" OR A$="C") AND X>0 THEN LET XADD=-1

100 IF (A$="C" OR A$="V" OR A$="B") AND Y>0 THEN LET YADD=-1

110 IF (A$="T" OR A$="G" OR A$="B") AND X<255 THEN LET XADD=1

120 IF (A$="E" OR A$="R" OR A$="T") AND Y<175 THEN LET YADD=1

130 IF XADD=0 AND YADD=0 THEN GO TO 60

140 LET X=X+XADD: LET Y=Y+YADD

150 PLOT X,Y

160 PLOT OLDX,OLDY

170 GO TO 40

Хороших эффектов можно добиться, используя линии для увеличения или уменьшения областей, имеющих форму многоугольников. Программа на листинге 1.9 использует этот метод в комбинации с командой INVERSE для имитации эффекта быстрой трансфокации. LISTING 1.9 10 LET I=0: INK 9 20 LET UP=175: LET ACROSS=255 30 LET X=0:LET Y=0 40 LET DIF=1 50 INVERSE 0 60 PLOT X,Y

70 DRAW 0,UP: DRAW ACROSS,0 80 PLOT X,Y

90 DRAW ACROSS,0: DRAW 0,UP 100 LET X=X+DIF: LET Y=Y+DIF 110 LET UP=UP-2*DIF 120 LET ACROSS=ACROSS-2*DIF

130 IF UP<0 OR UP=175 THEN LET DIF=-DIF: LET I=1-I 140 IF UP=175 THEN PAPER RND *7: CLS 150 GO TO 50 Упражнение 1.6

Нарисуйте квадрат 40 точек на 40 точек. Управляйте движением этой фигуры с помощью клавиатуры. Обратите внимание, что для этого достаточно управлять движением вершин квадрата.

Команды FLASH и BRIGHT (мерцание и яркость) Рассмотрев возможности монохромной графики, обратимся к многоцветной. На экране SPECTRUMa могут присутствовать одновременно все краски, однако, внутри символьного блока используется не более двух цветов INK и PAPER. Эти цвета могут находиться в состоянии BRIGHT и (или) FLASH, кроме того, могут быть включены особые эффекты, такие как OVER и INVERSE. По команде FLASH для символьного блока цвета сменятся с INK на фоне PAPER на PAPER на фоне цвета INK каждую 1/3секунды.

При включенном состоянии BRIGHT для некоторого блока увеличивается яркость, как цвета INK, так и PAPER. В результате блоки с выключенным состоянием BRIGHT выглядят темнее.

Если вы хотите, чтобы существующее состояние блока не изменилось по команде PRINT, то для FLASH и BRIGHT следует установить значение, равное 8.

Атрибуты

Текущая комбинация состояний FLASH, BRIGHT, PAPER и INK для каждого символьного блока хранится в

памяти в так называемом "файле атрибутов", в котором для каждого блока отводится одна ячейка; этот файл располагается сразу за дисплейным файлом и начинается с ячейки с номером 22528. Модификация программы на листинге 1.1 позволяет непосредственно изменять состояние блоков, как мы это делали ранее для дисплейного файла. LISTING 1.10 10 LET CORNER=22528 20 INPUT "VALUE-BIN ";LINE V$ 30 LET VALUE= VAL ("BIN "+V$) 40 PRINT AT 0,0;"*" 50 POKE CORNER,VALUE 60 GO TO 20 Упражнение 1.7

Используйте программу на листинге 1.10 для того, чтобы изменить значение битов, хранящихся в первой ячейке файла атрибутов.

Переменной VALUE можно присвоить любое значение первой ячейки файла атрибутов, определяя, будут ли включены состояния FLASH и BRIGHT для первого символьного блока и какие цвета INK и PAPER используются в этом блоке. Состояниям блока соответствуют двоичные числа: FLASH - 0 или 1; BRIGHT - 0 или 1; PAPER -000до

111; ШК-000до 111.

_Значение VALUE можно вычислить, как и в примере на рис. 7.

FLASH

BRIGHT

PAPER

INK

Десятичное значение

= 1

0

5

2

Двоичное значение

= 1

0

101

010

BIN 10101010

= 128+

32+

8+

2

=170

Рис. 7.

В предыдущем примере содержимое ячейки соответствует состоянию с включенным FLASH, выключенным BRIGHT, цвет PAPER - циановый, цвет INK - красный. Атрибуты каждого элемента можно узнать, используя функцию ATTR (ROW,COLUMN). Число ROW означает номер строки точки, считая от верхнего края экрана. Те же параметры используются в команде PRINT AT, что позволяет без труда изменять содержимое ячеек файла атрибутов случайным образом (см. листинг 1.11). Такого же эффекта можно добиться, используя команду РОКЕ. LISTING 1.11

10 FLASH INT (RND *2) 20 BRIGHT INT (RND *2) 30 PAPER INT (RND *8) 40 INK INT (RND *8)

50 LET ROW=INT (RND *22): LET COL=INT (RND *32) 60 PRINT AT ROW,COL;"*" 70 BEEP 0.22,RND *40 80 GO TO 10 Упражнение.1.8

Измените эту программу так, чтобы случайным образом менялось содержимое одного блока и вычислялось с помощью функции ATTR значение FLASH, BRIGHT, PAPER, INK.

В таблице 1 приводится зависимость между величиной числа в ячейке файла атрибутов и состоянием символьного блока, соответствующего этой ячейке.

Таблица 1

Соответствие между атрибутами и величиной числа в ячейке файла атрибутов

PAPER

INK

MODE

black

blue

red

magenta

green

yellow

cyan

white

BLACK

0

1

2

3

4

5

6

7

NORMAL

64

65

66

67

68

69

70

71

BRIGHT

128

129

130

131

132

133

134

135

FLASH

192

193

194

195

196

197

198

199

BRIGHT +FLASH

BLUE

8

9

10

11

12

13

14

15

NORMAL

72

73

74

75

76

77

78

79

BRIGHT

136

137

138

139

140

141

142

143

FLASH

200

201

202

203

204

205

206

207

BRIGHT +FLASH

RED

16

17

18

19

20

21

22

23

NORMAL

80

81

82

83

84

85

86

87

BRIGHT

144

145

146

147

148

149

150

151

FLASH

208

209

210

211

212

213

214

215

BRIGHT +FLASH

MAGENTA

24

25

26

27

28

29

30

31

NORMAL

88

89

90

91

92

93

94

95

BRIGHT

152

153

154

155

156

157

158

159

FLASH

216

217

218

219

220

221

222

223

BRIGHT +FLASH

GREEN

32

33

34

35

36

37

38

39

NORMAL

96

97

98

99

00

01

02

03

BRIGHT

160

161

162

163

164

165

166

167

FLASH

224

225

226

227

228

229

230

231

BRIGHT +FLASH

YELLOW

40

41

42

43

44

45

46

47

NORMAL

104

05

06

07

08

09

10

11

BRIGHT

168

169

170

171

172

173

174

175

FLASH

232

233

234

235

236

237

238

239

BRIGHT +FLASH

CYAN

48

49

50

51

52

53

54

55

NORMAL

112

113

114

115

116

117

118

119

BRIGHT

176

177

178

179

180

181

182

183

FLASH

240

241

242

243'

244

245

246

247

BRIGHT +FLASH

WHITE

56

57

58

59

60

61

62

63

NORMAL

120

121

122

123

124

125

126

127

BRIGHT

184

185

186

187

188

189

190

191

FLASH

248

249

250

251

252

253

254

255

BRIGHT +FLASH

Мы можем считать, что каждый пиксель состоит из трех точек, расположенных в вершинах небольшого треугольника. Каждый элемент изображения содержит одну красную, одну синюю и одну зеленую точку, а ячейки файла атрибутов управляют яркостью свечения этих точек. Положим, что для некоторого пикселя в дисплейном файле содержится информация, что он должен иметь цвет INK. Последние три двоичных разряда значения переменной в ячейке, соответствующей символьному блоку, в котором содержится элемент изображения, определяют, какие из трех люминофоров следует высветить. В глазу человека содержится три типа рецепторов (для зеленого, красного и синего цветов). Цвет трех точек элемента изображения мы воспринимаем как одну точку смешанного типа. Если последние три разряда значения ячейки файла атрибутов - 111-7, то светится зеленая, красная, синяя, что соответствует белому цвету. Другие цвета можно определить по таблице 2.

аблица2

COLOUR

NUMBER

BINARY

ILLUMINATED DOTS

BLACK

0

000

BLUE

1

001

BLUE

RED

2

010

RED

MAGENT

3

011

RED + BLUE

GREEN

4

100

GREEN

CYAN

5

101

GREEN + BLUE

YELLOW

6

110

GREEN + RED

WHITE

7

111

GREEN + RED + BLUE

Информация о цвете фона (PAPER) записана в разрядах 3-5 таким же образом. В шестом разряде содержится информация о том, включено BRIGHT или нет, и это определяет яркость свечения всех трех точек элемента изображения. Когда включено состояние FLASH, то цвета INK и PAPER будут меняться на PAPER и INK с частотой, зависящей от компьютера, для SPECTRUMa такая частота составляет примерно 1 /3 с.

При использовании монохромной графики высокой разрешающей способности мы не встречаем никаких сложностей, но при работе с многоцветной графикой следует помнить, что в символьном блоке одновременно могут присутствовать точки только двух цветов. Упражнение 1.9

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

Простейшее движущееся изображение Еще одну движущуюся картинку можно построить, используя графику низкой разрешающей способности, цветовые эффекты и команду FLASH. Первая часть программы на листинге 1.12 интересна тем, что после получения изображения им не надо управлять. На границе экрана расположена последовательность блоков с включенным FLASH, красным цветом PAPER и циановым цветом INK, чередующихся с блоками с включенным FLASH, циановым цветом PAPER и красным INK. Когда мы смотрим на эту картинку, то нам кажется, что красный и циановый цвета движутся.

LISTING 1.12

10 FLASH 1:PAPER 2: INK 5 20 FOR I=0 TO 1 30 FOR J=0 TO 15

40 PRINT AT 0,2*J+I;" "

50 PRINT AT 21,2*J+1-I;" "

60 NEXT J

70 FOR J=0 TO 10

80 PRINT AT 2*J+I,0;" "

90 PRINT AT 2*J+1-I,31;" "

100 NEXT J

110 PAPER 5: INK 2

120 NEXT I

130 FLASH 0:LET P=0

140 FOR I=1 TO 20

150 PRINT AT I,15; PAPER P;" "

160 LET P=P+1: IF P=7 THEN LET P=0

170 NEXT I

180 GO TO 140

Упражнение 1.10

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

Команды CIRCLE и DRAW (окружность и чертить) В SPECTRUMe имеются еще две встроенные команды графики с высокой разрешающей способностью. Это команды CIRCLE и DRAW для вычерчивания кривых.

По команде CIRCLE X,Y,P вычерчивается круг радиуса "Р" в пикселях изображения с центром в точке (X,Y). Следует помнить, что после выполнения команды перо находится в правой части окружности, непосредственно под центром.

По команде DRAW X,Y,A чертится кривая из данной точки в точку, смещенную от нее на X,Y и поворачивающуюся на угол "А"; эта кривая будет дугой окружности. Угол поворота задается в радианах и изменяется в диапазоне от -PI до PI.

На листинге 1.13 приведена программа, использующая команду DRAW для построения фигуры на рис. 8. LISTING 1.13

10 CIRCLE 126,88,80: LET N=24 20 LET A=0: LET ADIF=2+PI/N 30 FOR I=1 TO N 40 PLOT 128,88

50 LET X=40*COS A: LET Y=40*SIN A 60 DRAW X,Y,-PI: DRAW X,Y,PI 70 LET A=A+ADIF 80 NEXT I 90 STOP

Цвета в символьном блоке Использование различных цветов для INK в графике высокого разрешения может привести к неожиданным результатам. Пропустите программу на листинге 1.14, и вы увидите, к чему может привести непродуманное использование нескольких цветов. LISTING 1.14

10 PAPER 5: INK 7: CLS 20 FOR I=0 TO 175 STEP 8 30 PLOT 0,I: DRAW 255,0 40 NEXT I 50 INK 0

60 CIRCLE 128,88,80 70 STOP

Из этого эффекта можно извлечь пользу, употребив его для получения быстроменяющихся сложных изображений, выполненных в графике с низкой разрешающей способностью. Вначале мы располагаем в фиксированных позициях блоки, окрашенные цветом INK. Любая проведенная линия изменит цвет элементов изображения, через которые она проходит. Эта техника работает с внушительной скоростью, в чем вы можете

убедиться, пропустив программу на листинге 1.15. LISTING 1.15 10 INK 7: CLS

20 FOR I=1 TO 704: PRINT " ";: NEXT I 30 LET DIST=80: LET I=0: LET D=2 40 INK I

50 PLOT 127,86+DIST: DRAW -DIST,-DIST: DRAW DIST, DIST 60 PLOT 127,86-DIST: DRAW -DIST, DIST: DRAW DIST, DIST 70 LET DIST=DIST-D: IF DIST=0 OR DIST=80 THEN LET D=-D 80 LET I=I+1: IF I=8 THEN LET I=0 90 GO TO 40

Простая игра

Сейчас мы попробуем небольшую программу (листинг 1.16) как пример использования технологии, разобранной в этой главе. Червь может перемещаться по экрану шагами в одну знаковую позицию, горизонтально или вертикально, влево или вправо и управляется с клавиатуры. Цель игры: червь может съедать монетку (мишень). Съев монетку, червь удлиняется. Если хоть раз голова червя упрется в границу экрана или в собственное тело, червь погибает. Червь не может менять направление движения на противоположное. После десяти успешных поеданий монетки червь возвращается к своему первоначальному размеру, и игра продолжается.

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

A. Инициализация переменных. Б. Установка игрового поля.

B. Управление игрой.

Г. Рестарт и вывод счета игры. Каждую из этих задач мы можем разбить на еще более мелкие. Например, задача "Б" может быть представлена так:

1. Воспроизведение монетки.

2. Использование клавиатуры для изменения направления движения червя.

3. Перемещение червя.

4. Фанфары.

Задача "3" в свою очередь может быть разбита на еще более мелкие подзадачи:

A) рисование червя;

Б) червь упирается в границу или сам в себя и погибает;

B) червь съедает монетку и растет.

Теперь попробуйте самостоятельно найти, где в программе реализованы эти задачи LISTING 1.16

1000 DIM R(55):DIM C(55)

1009 REM Инициализация указателей подпрограмм и установка счета игры в 0

1010 LET FANFARE=2000: LET WORM=3000: LET KEY=4000: LET GOBBLE=5000: LET STATUS=6000: LET TARGET=7000

1020 BORDER 1 :PAPER 7:INK 0 1030 LET HSC=0

1040 LET SCORE=0: LET WORMS=3: LET LEVEL=1

1048 REM Начало нового червя, длина 5 сегментов, начиная со строки R позиции С

1049 REM Р-указатель на сегмент, который должен перемещаться Установка флагов (0 - нет, не 0 - да)

1050 LET DEAD=0: LET WON=0: LET C=16: LET R=10: LET P=1: LET S=5: LET CMOVE=0: LET RMOVE=1: LET H$="*"

1059 REM Установка "двигательных" переменных так, что червь перемещается вниз

1060 FOR I=1 TO 55: LET R(I)=-1: NEXT I

1069 REM Установить желтым экран сверху и снизу

1070 CLS: PRINT AT 0,0; PAPER 6: PRINT AT 21,0; PAPER 6

1079 REM ВЫВОД СЧЕТА ИГРЫ

1080 GO SUB STATUS 1090 GO SUB TARGET

1099 REM ГЛАВНЫЙ ЦИКЛ. Контроль за движением червя

1100 GO SUB KEY 1110 GO SUB WORM

1120 IF NOT DEAD AND NOT WON THEN GO TO 1100

1129 REM Если червь съел монету, 10 раз дать фанфары и начать новую игру.

1130 IF WON THEN LET LEVEL=LEVEL+1: GO SUB FANFARE: GO TO 1050

1139 REM Воспроизвести шум разрушения.

1140 IF DEAD THEN FOR I=1 TO 20: BEEP 0.05,15: NEXT I

1149 REM Если у вас остался еще червь, то начать новую игру

1150 IF DEAD THEN LET WORMS=WORMS-1: IF WORMS<>0 THEN GO TO 1050

1159 REM Переместить все сегменты, двигая указатель от конца червя

1160 FOR I=1 TO S: BEEP 0.01,0: PRINT AT R(P),C(P);PAPER 7;" " 1170 LET P=P+1: IF P>S THEN LET P=1

1180 NEXT I

1189 REM Переместить монетку и заменить строку со счетом

1190 PRINT AT Y,X;PAPER 7;" ": GO SUB STATUS

1199 REM Использовать мерцание и нажать Ввод для рестарта игры

1200 LET I$=CHR$ 18+CHR$ 1+"PRESS ENTER TO START"+"GAME"+CHR$ 18+CHR$ 0 1210 INPUT (I$+" ");LINE A$

1220 GO TO 1040 2000 REM ФАНФАРЫ

2010 DATA 0.06,18,0.06,19,0.06,21,0.15,27,0.06,21,0.20,27

2019 REM Чтение и исполнение фонфар с комбинир. длительности

2020 RESTORE FANFARE: FOR I=1 TO 6: READ L,T:BEEP L,T: NEXT I 2030 RETURN

3000 REM WORM (ЧЕРВЬ)

3008 REM Червь ползет, перемещая последний сегмент вперед

3009 REM Если это не приращение сегментов, то убрать старый сегмент

3010 IF R(P)<>-1 THEN PRINT AT R(P),C(P); PAPER 7;" "

3019 REM Вычисление новой позиции для головы червя.

3020 LET R=R+RMOVE: LET C=C+CMOVE

3029 REM Проверка на столкновение с границами

3030 IF R>20 OR R<1 OR C>31 OR C<0 THEN LET DEAD=1: RETURN

3039 REM Проверка на столкновение сам с собой.

3040 IF ATTR (R,C)=16 THEN LET DEAD=1: RETURN

3049 REM Установка строки и столбца в новой позиции

3050 LET R(P)=R: LET C(P)=C

3059 REM Проверка того, была ли съедена монетка

3060 IF SCREEN$ (R,C)="$" THEN GO SUB GOBBLE

3069 REM Добавление на экран еще одного сегмента и продвижение дальше к хвосту указателя сегментов червя

3070 PRINT AT R(P),C(P); PAPER 2;H$ 3080 LET P=P+1: IF P>S THEN LET P=1 3090 RETURN

4000 REM KEY (КЛАВИШИ)

4009 REM Проверка используемых для управления клавиш

4010 LET A$=INKEY$ : IF A$="" THEN RETURN

4019 REM Установка всех букв, как показано ниже

4020 IF CODE A$>96 THEN LET A$=CHR$ (CODE A$-32)

4028 REM Червь может пойти влево или вправо, но не обратно на себя.

4029 REM "ВВЕРХ" нажато - если вы не шли вниз, то пойдете вверх.

4030 IF A$="I" AND CMOVE THEN LET RMOVE=-1: LET CMOVE=0: RETURN

4039 REM Идти ВНИЗ (если червь не шел вверх)

4040 IF A$="M" AND CMOVE THEN LET RMOVE=1: LET CMOVE=0: RETURN

4049 REM Идти ВЛЕВО (если червь не шел вправо)

4050 IF A$="J" AND RMOVE THEN LET RMOVE=0: LET CMOVE=-1: RETURN

4059 REM Идти ВПРАВО (если червь не шел влево)

4060 IF A$="L" AND RMOVE THEN LET RMOVE=0: LET CMOVE=1: RETURN 4070 RETURN

5000 REM GOBBLE (ПРОГЛАТЫВАНИЕ)

5009 REM Поедается монетка, раздается звук глотания

5010 FOR I=2 TO 4 STEP 0.5 5020 BEEP 0.01,EXP I-10: NEXT I

5029 REM Добавить к вашему счету и заменить строку со счетом

5030 LET SCORE=SCORE+1: GO SUB STATUS

5038 REM Добавить 5 сегментов

5039 REM Если червь содержит 55 сегментов, это означает, что вы съели 10 монеток и выиграли

5040 LET S=S+5: IF S=55 THEN LET WON=1: RETURN

5049 REM Установить новую монетку на экран.

5050 GO SUB TARGET 5060 RETURN

6000 REM СТАТУС

6009 REM Если ваш счет превосходит наибольший в этой игре (HISCORE), то заменить наибольший счет

6010 IF SCORE>HSC THEN LET HSC=SCORE

6019 REM Заменить строку с обеими счетами

6020 PRINT AT 0,0,-PAPER 6; " SCORE ";SCORE," HI-SCORE ";HSC 6030 PRINT AT 21,0,-PAPER 6," LEVEL "-LEVEL," WORMS "-WORMS 6040 RETURN

7000 REM TERCET (МОНЕТКА)

7009 REM Выбор знаковой позиции в игровом поле

7010 LET X=RND*31: LET Y=RND*19+1

7019 REM Проверка того, что это не та же самая позиция

7020 IF X=C AND Y=R THEN GO TO TARGET

7029 REM Проверка того, что эта позиция не находится под червем

7030 IF ATTR (Y,X)=16 THEN GO TO TARGET

7039 REM Ввод новой монетки на экран

7040 PRINT AT Y,X; PAPER 4;"$" 7050 RETURN

В следующей главе мы рассмотрим средства, необходимые для изображения реальных картин.

ПРИЛОЖЕНИЕ: управление в программах:

Листинг 1.8. Нажатие клавиш вокруг "F" - перемещает точку в одном из восьми направлений. Листинг 1.16. Для управления червем используйте клавиши I, J, L, М.




СОДЕРЖАНИЕ:
  1. Трёхмерная декартова геометрия - Определение прямой; Угол между двумя направляющими векторами; Определение плоскости70 Точка пересечения прямой и плоскости; Расстояние от точки до прямой; Точка пересечения двух прямых; Плоскость, проходящая через три неколлинеарные точки; Точка пересечения трёх плоскостей; Линия пересечения двух плоскостей; Функциональное представление поверхности; Лежит ли точка по ту же сторону от плоскости, что и начало координат?; Каково направление обхода двумерного многоугольника, заданного последовательностью своих вершин?


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

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



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

Похожие статьи:
Доктор Profi 1024K - По маленькому.
Смешно? - юмористический рассказ "Mortal Kombat".
Поиск - поиск игр, программ.
С сетки по нитке - Первоапрельские новости из Беларуси.
Анонс - Чертова дюжина неудобных вопросов.

В этот день...   21 ноября