Как написать игру для ZX Spectrum 1994 г.

Первые шаги к кодовой программе - применение New Supercode. Игровая программа «Звездная война».


Применение New Supercode

Пакет New Supercode создан по образу и подобию Supercode и содержит 50 подпрограмм в машинных кодах, большинство из которых не имеет аналогов в Supercode.

После загрузки вы увидите список процедур (меню), из 50 строк, каждая из которых вызывает определенную подпрограмму и имеет вид:

33 ATTR CODE 48976,29

где слева направо расположены: номер кодовой подпрограммы, ее название, слово CODE, означающее принадлежность к кодовому типу,

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

Выбор нужной строки осуществляется с помощью стрелки курсора, перемещаемой клавишами б (вниз) и 7 (вверх), а для того, чтобы воспользоваться процедурой, следует нажать Enter. При этом на экран будет выведена краткая инструкция о выбранной подпрограмме. Нажатие клавиши D (DEMO) позволит посмотреть, как действует подпрограмма, а S (SAVE) - записать ее на ленту или дискету. Возврат в меню происходит при нажатии клавиши Т.

Игровая программа «Звездная война»

Покажем теперь, как можно использовать кодовые подпрограммы на примере игры «Звездная война». Но прежде, чем мы начнем говорить об игре, перепишем из комплекта NEW Supercode на магнитную ленту или дискету четыре следующих подпрограммы: LITERY, DZWIEK2, DZWIEK3 и EKRAN 2. О том, что они из себя представляют и какие функции выполняют в игре, мы расскажем при описании строк программы, а сейчас несколько слов о самой программе и о том, что произойдет после ее запуска.

Загрузив программу и выполнив оператор RUN, вы сразу увидите действие одной из кодовых подпрограмм: на экране появятся буквы необычных размеров и форм. Налюбовавшись названием игры, нажмите любую клавишу - раздастся характерный звук летящего снаряда и затем взрыва. Очень эффектно! Далее следует традиционная информация об управляющих клавишах и, наконец, возникает звездное небо, на фоне которого передвигается космический корабль противника. Здесь же окажется перекрестье прицела вашего лазера (рис. 9.2). Чтобы убедиться в его исправности, нажмите М, появятся два грозных луча, и вы услышите звук выстрела, созданный третьей кодовой подпрограммой.

Теперь возникает типичная игровая ситуация: вы должны, передвигая прицел, совместить его с вражеским кораблем и нажать М. При попадании раздастся грохот взрыва, а на экране возникнет хаотическая картинка, созданная кодовой подпрограммой EKRAN 2. После этого игра возвращается к своему началу.

Программа 33. ЗВЕЗДНАЯ ВОЙНА.

10 CLEAR 46945 12 POKE 23658,8 15 BORDER 0: PAPER 0: INK 7 20 CLS

30 GO SUB 7000

40 GO SUB 7100 50 CLS

60 LET y=0: LET xs=3: LET ys=20: LET d$="SPACE WAR":INK 2: BRIGHT 1: GO SUB 7200 70 LET y=160: LET xs=1: LET ys=2: LET d$="PRESS ANY KEY TO START": INK 6: GO SUB 7200 80 IF INKEY$="" THEN GO TO 80 90 BRIGHT 0

100 RANDOMIZE USR 59366 110 BORDER 0

120 REM -------------

125 CLS

130 LET d$="O-LEFTПППP-RIGHT": LET y=10: LET xs=2:LET ys=5: GO SUB 7200 140 LET d$="Q-UPПППППA-DOWN ": LET y=60: LET xs=2:LET ys=5: GO SUB 7200 150 LET d$="M-FIRE": INK 2: LET y=110: LET xs=4: LET ys=5:GO SUB 7200 160 IF INKEY$="" THEN GO TO 160

170 REM -----------

172 LET s=0: LET sh=0

175 INK 7: CLS : OVER 1

176 FOR N=1 TO 200: PLOT RND*255,RND*175: NEXT N

177 PRINT AT 10,15;"E"

179 INK 3: PLOT 0,0: DRAW 0,175: DRAW 255,0: DRAW 0,-175: DRAW -255,0

180 LET zx=INT (RND*30): LET zy=INT (RND*20)

185 LET zx1=zx: LET zy1=zy

186 PRINT AT zy,zx;"AB": PRINT AT zy+1,zx;"CD" 190 LET px=15: LET py=10

195 LET px1=px: LET py1=py 197 LET f=0

200 IF INKEY$="P" THEN LET px=px+1: GO TO 300 210 IF INKEY$="0" THEN LET px=px-1: GO TO 300 220 IF INKEY$="Q" THEN LET py=py-1: GO TO 300 230 IF INKEY$="A" THEN LET py=py+1: GO TO 300 240 IF INKEY$="M" THEN LET f=1: GO TO 300 250 GO TO 400 300 REM ------------

310 IF px<0 OR px>31 OR py<0 OR py>21 THEN LET px=px1:LET py=py1: GO TO 400 315 INK 7

320 PRINT AT py1,px1;"E" 330 INK 5: PRINT AT py,px;"E" 340 LET px1=px: LET py1=py

345 IF f=1 THEN INK 2: PLOT 0,0:DRAW px*8+4,172-(py*8): PLOT 255,0: DRAW -(253-px*8),172-(py*8): RANDOMIZE USR 59342: INK 7: PLOT 0,0: DRAW px*8+4,172-(py*8): PLOT 255,0: DRAW -(253-px*8),172-(py*8)

350 IF f=1 AND ((zx=px AND zy=py) OR (px=zx+1 AND py=zy) OR (px=zx AND py=zy+1) OR (px=zx+1 AND py=zy+1)) THEN RANDOMIZE USR 59366: GO TO 1000 360 IF f=1 THEN LET f=0 400 REM ------------

410 IF s=sh THEN LET s=0: LET sh=INT (RND*5+4): LET prx=SGN (RND*2-1): LET pry=SGN

(RND*2-1)

420 LET s=s+1

422 LET zx=zx+prx: LET zy=zy+pry

425 IF zx<1 OR zx>29 OR zy<1 OR zy>19 THEN LET zx=zx1: LET zy=zy1: GO TO 200 440 INK 7

450 PRINT AT zy1,zx1;ПП"АБ" 460 PRINT AT zy1+1,zx1;"CD" 470 INK 6: PRINT AT zy,zx; "AB" 480 PRINT AT zy+1,zx;"CD" 490 LET zx1=zx: LET zy1=zy 500 GO TO 200

1000 REM ------------

1010 PAPER 0: BORDER 0: CLS 1015 FOR M=1 TO 10

1020 FOR N=1 TO 250 STEP 40: POKE 57399,N: RANDOMIZE USR 57392: NEXT N

1030 NEXT M

1040 GO TO 50

7000 REM -Graphics-

7010 FOR n=0 TO 39

7020 READ s

7030 POKE USR "A"+n,s

7040 NEXT n

7050 DATA 0,64,64,64,35,39,39,30 7060 DATA 0,2,2,2,196,228,228,120 7070 DATA 30,39,39,35,64,64,64,0 7080 DATA 120,228,228,196,2,2,2,0 7090 DATA 16,16,16,238,16,16,16,0 7095 RETURN

7100 REM -- LOAD code --7110 INK 0: PAPER 0: PRINT AT 0,0; 7120 LOAD ""CODE

7122 INK 7: LET d$="LOADING": LET y=50: LET xs=2: LET ys=10: GO SUB 7200

7123 LET d$="PLEASE WAIT": LET y=130: LET xs=2: LET ys=1:INK 3: GO SUB 7200 7130 INK 0: PRINT AT 0,0;: LOAD ""CODE

7140 PRINT AT 0,6;: LOAD ""CODE 7145 PRINT AT 0,0;: LOAD ""CODE 7150 RETURN

7200 REM -- Litery --7210 LET x=(256-xs*8*LEN d$)/2 7220 LET a=23306: POKE a,x 7230 POKE a+1,y: POKE a+2,xs 7240 POKE a+3,ys: POKE a+4,8 7250 LET a=a+4 7260 FOR i=1 TO LEN d$ 7270 POKE a+i,CODE d$(i) 7280 NEXT i 7290 POKE a+i,255

7295 RANDOMIZE USR 59033

7296 RETURN 7300 REM --10. - установка RAMTOP;

12 - включение курсора больших букв;

30 - обращение к подпрограмме ввода графических символов: для корабля - 4, для прицела - 1;

40 - обращение к подпрограмме, загружающей с ленты четыре кодовые блока: LITERY, DZWIEK2, DZWIEK3, EKRAN 2;

60 - эта часть программы выводит на экран название игры, сформированное с помощью кодовой подпрограммы LITERY. Здесь у - верхняя граница выводимых букв, измеряемая в пикселях, начиная от верхнего края экрана; xs - их ширина в знакоместах; ys - высота букв в знакоместах. В символьной переменной d$ задается текст, который требуется вывести;

70 - то же, что и в строке 60, но для текста

PRESS ANY KEY TO CONTINUE

80 - ожидание нажатия любой клавиши;

100 - с помощью кодовой подпрограммы DZWIEK3, вызываемой оператором

RANDOMIZE USR 59366

создается звуковой эффект, имитирующий полет снаряда и его взрыв; 110 - восстановление цвета бордюра после действия предыдущей подпрограммы;

130...150 - вывод на экран текста, поясняющего функции клавиш;

160 - ожидание нажатия любой клавиши;

172 - установка начальных значений переменных: s - счетчик шагов перемещений корабля, sh - указатель количества этих шагов;

176 - создание на экране рисунка звездного неба. Оператор RANDOMIZE в начале строки восстанавливает счетчик случайных чисел после обращения к подпрограммам в машинных кодах;

177 - установка прицела в средней части экрана;

179 - вывод на экран рамки, ограничивающей игровое поле;

180 - вычисление случайным образом начальных координат корабля;

185 - ввод дополнительных координат корабля, в которых будут сохраняться предыдущие их значения;

186 - вывод на экран силуэта космического корабля;

190 - ввод начальных координат прицела, которые при его перемещении потребуются для операций стирания;

197 - вводится переменная f, соответствующая текущему положению кнопки Огонь, причем в данном случае кнопка считается не нажатой (f = 0);

200...240 - эта группа операторов обеспечивает управление прицелом;

310 - ограничения на перемещения прицела;

320 - закраска белым цветом «старого» прицела при его перемещении по экрану (напомним, что был установлен режим OVER 1);

330 - голубым цветом изображается «новый» прицел;

340 - запоминание координат, необходимое для того, чтобы их можно было восстановить, если они выйдут за пределы игрового поля;

345 - проверка условия, был ли сделан выстрел. Если да, то устанавливается красный цвет «чернил» и рисуются два лазерных луча, а с помощью кодовой подпрограммы DZWIEK2 воспроизводится звук выстрела. После выстрела устанавливаются белые «чернила» и на месте лазерных лучей рисуются две линии белого цвета;

350 - если была нажата клавиша Огонь, и есть попадание в одно из четырех знакомест, обозначающих корабль, то включается кодовая подпрограмма DZWIEK3, которая формирует взрыв, а затем осуществляется переход на подпрограмму 1000... 1040, которая уничтожает все экранное изображение и создается процедурой EKRAN 2;

360 - если попадания нет, то переменной ОГОНЬ присваивается нулевое значение;

410 - если перемещение, которое сделал корабль, равно установленному ранее, то для следующего прохода S устанавливается равным 0, а переменной sh присваивается случайное значение в диапазоне от 4 до 8;

420 - увеличение счетчика на единицу;

422 - к текущим координатам корабля прибавляются приращения;

425 - проверка, не вышел ли корабль за границы игрового поля экрана;

440 - установка цвета вывода символов (белый);

450, 460 - вывод на экран изображения корабля, заданный старыми координатами;

470, 480 - установка цвета символов (желтый) и вывод на экран изображения корабля, заданного новыми координатами;

490 - изменение значений координат;

500 - безусловный переход к блоку управления прицелом;

1000... 1040 - подпрограмма, имитирующая уничтожение корабля противника. На экране мелькают хаотические пятна, созданные в двух циклах при участии

кодовой подпрограммы EKRAN 2, запускаемой оператором

RANDOMISE USR 57392

Перед ее использованием в ячейку 57399 заносится число в диапазоне от 0 до 255;

7000...7095 - подпрограмма определения графических символов, из которых четыре используются для изображения космического корабля, а один для создания перекрестья прицела;

7100...7150 - подпрограмма загрузки кодовых подпрограмм. Сначала грузится подпрограмма LITERY, затем на экран выводится фраза LOADING, PLEASE WAIT

после чего загружаются DZWIEK3, DZWIEK2 и EKRAN 2;

7200... 7296 - подпрограмма вывода на экран различных текстов, сформированных с помощью кодовой подпрограммы LITERY. При этом координату у необходимо задать заранее, а координату х определять заранее не нужно, так как подпрограмма сама выравнивает текст по центру экрана. Размеры букв по горизонтали - xs и вертикали ys задаются заранее. И, конечно же, необходимо ввести сам текст. Запуск программы осуществляется оператором RANDOMISE USR 59033




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Реклама - Пpиобpету пpошитое ПЗУ.
BBS - список рабочих ZXNet BBS.
REC lame - Ironman CD.

В этот день...   17 февраля