Учимся программировать на Blitz BASIC
Вы хотели бы освоить первые шаги, так, чтобы в конечном счёте писать игры? Тогда вы обратились по адресу.
Blitz Basic использует специально разработанный и простой в использовании язык программирования, так что он лёгок в освоении и не требует опыта программирования, всё что нужно - это любовь к играм и ваши идеи.
Итак, добро пожаловать в ОСНОВНОЙ путеводитель по Blitz – где единственное ограничение – ваша фантазия. Основная цель этого раздела научить вас как написать программу на Blitz Basic. Программа – это задание, которое должен исполнить твой компьютер через набор инструкций. Задание описывается компьютеру используя набор инструкций, которые может понять Blitz Basic. Инструкции в вашей программе должны быть написаны используя набор правил, известных как Синтакс. Вы должны следовать этим правилам, когда пишете программу на Blitz Basic. После большого количества практики вы получите твёрдое и конкретное представление об основах BASIC`а и как их использовать как программисту, а когда у вас будут практические знания Blitz Basic, разновидности игр, которые вы будете создавать будут целиком зависеть от вас, и с капелькой фантазии вы могли бы написать следующий игровой хит.
Если вы не знали - BASIC это сокращение от Beginners All-purpose Symbollic Instruction Code (короче код для начинающих широкого использования : Scaven). Это мини курс языка BASIC, который встроен в Blitz, и планирования хороших программных структур.
Hello World Hello Me или Hello sheep! Hello cup of tea!
Хорошо – давайте начнём с команды Print – она просто печатает любой текст на ваш экран вот таким образом:
print "Hello sheep"
print "Hello cup of tea"
просто напечатайте вот так...
...и нажмите на красную ракету
чтобы запустить....
Отлично – вы только что написали свою первую программу на Blitz.
Так же вы можете вставлять комментарии/записи в свою программу – это очень рекомендуется, и является хорошей практикой в программировании. Это можно сделать поставив точку с запятой (;) в свою программу, после которой вы можете просто написать свой текст ,например:
Print "George Bray" ; Эта часть кода предназначена для печатания вашего имени на экран
Также вы можете остановить машину командой End – это остановит вашу программу на любой точке, где вы хотите чтобы она завершилась.
Вы можете дать заголовок своему коду написав AppTitle "НазваниеИгры"
Хорошо, теперь давайте узнаем как работает Blitz переводя ваши программы, и что вам нужно знать чтобы писать их...
Данные
Это главные элементы программирования. Данные представлены тремя основными формами. Первое – это целое число, которое называется Integer (лучше запомнить английские названия – потом могут пригодиться: Scaven) н-р. 8,20,100,1000. Следующий тип – действительные числа или Real они позволяют ставить дроби, н-р. 1.2, 48.20, 100.4, 3000.201 (Запомните целая часть числа разделяется от дробной точкой а не запятой: Scaven). Третий тип данных – это строковые или String, которые в общем-то не являются числами. Все строковые состоят из символов, заключённых в кавычки. Строковые могут включать в себя числа, н-р: "A", "1", "Blitz Basic", "Commodore 64", "Sheep".
Переменные
Перемененные используются для того, чтобы хранить данные – чтобы понять это – представьте, что переменная – это одна большая коробка, в которой вы храните элементы, и, если нужно, другие коробки. Пример будет таким:
A = 2 + 2
Также вы можете напечатать с помощью команды print содержимое переменной на экран:
A = 2 + 2
Print A
Другой пример будет таким:
A = 1
B = 2
C = A + B
PRINT C
Разберём это – здесь у нас есть 3 переменных A и B – в которых хранятся два числа, и, наконец переменная C, которая является сложением чисел, находящихся в переменных A и B, так что C = 1 + 2. Затем этот результат помещается в переменную C и печатается на экран.
Переменные также могут хранить Real и String. Чтобы позволить переменной хранить эти типы данных, вы должны убедиться, что сказали компьютеру где находятся переменные с Integer, Real, или String. Чтобы указать переменную с действительным числом (Real), вы должны добавить значок диеза (#) в конце названия переменной. Если вы хотите указать переменную, в которой хранятся строковые данные (String), вы должны добавить значок доллара ($) в конце, н-р:
A# = 1.2
B$ = “vic20”
Print A#:Print B$
Вы также можете использовать математические функции с переменными String н-р:
A$ = "Welcome to "
B$ = "the world "
C$ = "of programming."
D$ = A$ + B$ + C$
Print D$
Когда вы запустите эту программу, она напечатает на экране Welcome to the world of programming.
Легко, не правда ли?
(Scaven: Похоже авторы забыли одну команду – это команда Input. Она нужна для того, чтобы пользователь смог что-нибудь набрать на клавиатуре, а мы смогли это запомнить и сохранить в переменной. Пишется так: Сначала пишем название переменной, затем знак = , потом слово Input, а затем в скобках и в кавычках пишем свой вопрос н-р: A=Input(“Введите какое либо число: “) или name$=Input$(“Введите какое либо слово: “). Вы вряд ли будете её часто употреблять, но она указывается в примерах дальше…)
Массивы
Массивы (или матрицы) очень важны, потому что вы можете хранить большое количество данных под одним именем. Например, если вы хотите хранить названия 7 дней в году, вам пришлось бы создать семь переменных, н-р.
day0$ = "Monday"
day1$ = "Tuesday"
до
day6$ = "Sunday"
Но с массивом вы можете создать другой тип переменной, которая может хранить больше чем один элемент данных. Н-р. Для дней недели вы напишите:
Dim day$(6) ; Обозначаем массив... 7 элементов (от 0 до 6)
day$(0)="Monday" ; устанавливаем первый элемент
day$(1)="Tuesday"
…
day$(6)="Sunday"
Затем вы просто можете написать команду:
Print day$(3)
которая напечатает на экран Thursday
Чтобы напечатать семь дней недели, мы включим цикл FOR NEXT, н-р:
For loop = 0 to 6
Print day$(loop) ; проходит цикл и печатает данные.
Next ; Это продолжается, пока переменная loop не равняется 6 а затем переходят на следующие строчки программы.
Также вы можете использовать команду STEP (шаг) когда производите цикл FOR/NEXT н-р. Если вы создадите цикл FOR/NEXT после которого идёт команда STEP 2 компьютер будет высчитывать следующий цикл, увеличиваясь на 2 н-р. 2, 4, 6. Так, если бы мы применили это к нашим дням недели, то:
For loop = 0 to 6 step 2
То компьютер напечатает только Monday Wednesday Friday и Sunday.
Также вы можете делать шаги назад, поставив знак минуса (-) после команды, с числом шагов назад, которые вы хотели бы совершить:
For A = 10 To 0 step -2
Print A
Next
На экране будет напечатано: 10 8 6 4 2 0
Последняя заметка по массивам – как написано выше, они очень многосторонни, так как могут хранить много уровней данных, так что написав:
Dim day(6,4)
Мы устанавливаем массив от 0 до 6, но для каждого из них есть ещё 5 «коробок» данных от 0 до 4 в которых может храниться больше данных. Так что если воспринимать их «коробками» - здесь у нас есть 7 коробок с 5 коробками внутри (вообще-то я бы сказал что у нас 5 рядов по 7 коробок в каждом или то что у нас 7 коробок, каждая из которых поделена на 5 секций : Scaven), Так что в целом вы можете хранить 35 данных (7x5) в этом массиве. Итак, вводя данные в массив вы можете написать что-то вроде этого:
Dim day(1,4) ;Устанавливаем массив размером 2 на 5 (от 0 до 1 * от 0 до 4)
day(0,0) = 10
day(0,1) = 20
day(0,2) = 30
day(0,3) = 40
day(0,4) = 50
day(1,0) = 100
day(1,1) = 200
day(1,2) = 300
day(1,3) = 400
day(1,4) = 500
Как видите, массивы должны быть указаны как определённый тип - Integer, Real или String. У вас может быть массив целых, действительных или строковых данных, но у вас не может быть несколько типов в одном и том же массиве.
Математические команды
О эта ужасная математическая сторона компьютера, но НЕ ПАНИКУЙТЕ – я тоже не математик (как и я впрочем: Scaven). Я просто быстро пробегусь по "скучной" стороне вещей – не беспокойтесь – немного терпения и вы будете знакомы со всеми этими функциями не затратив времени, потому что мы заставим компьютер делать всю тяжёлую работу. Просто расслабьтесь – сделайте хорошую горячую кружку чая и читайте дальше…
Итак – давайте начнём с самого лёгкого - Сложение, Вычитание, Деление и Умножение. В компьютерных терминах это (+) (-) (/) (*). Простым примером будет:
A = 2 + 2
B = 2 * 2
C = 2 - 2
D = 2 / 2
Print A: Print B: Print C: Print D
Результатом на экране будет: 4 4 0 1 – но вы это и так знали.... Также вы можете использовать названия переменных в математических командах:
A + B
A - B
A * B
A / B
Тип Boolean
Вот где вам нужно иметь кружку чая в руках, потому что пришло время сконцентрироваться! Когда вы поймёте это – вы будете достаточно знать, чтобы владеть обычной ненавистной математической стороной программирования…
OK - Поехали...Удобно устроились?
Операторы Boolean (это слово тоже придётся запомнить: Scaven) позволяют вашей программе производить логические операции на своих данных.
У нас есть операторы AND и OR – они работают с любыми числами. (And – логическое «и»; Or – логическое «или» : Scaven)
Основа такова (изучите логику в этих примерах – они довольно понятно написаны)
(Scaven: видимо составители очень ленились когда писали этот кусок. Так команда If…Then описана ниже. Для тех кто не поймёт логические операторы, попробуйте вспомнить школьный курс информатики – конъюнкция, дизъюнкция… J)
agecategory$=Input("Каковы ограничения возраста - 15 или 18? ") ; Спросить пользователя об ограничении возраста
age$=Input("Сколько вам лет: ") ; Затем спросить сколько лет
If agecategory$ = 18 And age$<18 Or agecategory$ = 15 and age$< 15 Then Print "Извините вам нельзя смотреть этот фильм" ; использование выражений AND и OR выясняет, что он ещё слишком молод
If agecategory$ = 18 And age$>18 Or agecategory$ = 15 And age$>15 Then Print "Наслаждайтесь фильмом." ; использование выражений AND и Or выясняет, что он уже достаточно взрослый
WaitMouse ; Ждёт, пока не будет нажата кнопка мыши
End ; Когда она будет нажата – закончить программу.
Мы можем сравнивать не только числа, но также и строки (текст). Мы видели '=' который был использован в 'agecategory$ = 18' ,так что же значит `меньше` или `больше` для строковых переменных? Ну, во всяком случае это не значит 'меньше знаков', так что мы не будем допускать такой ошибки. Мы понимаем, что одна строка меньше, чем другая, если она идёт раньше в алфавитном порядке, так что
Smith < Smythe
Smythe > Smith
Sheep < Shop
Shop > Sheep
Дальше, <= значит `меньше или равно`, ну и так далее – так же, как и с числами.
Далее, у нас есть оператор NOT (Логическое «не» :Scaven).
Проще говоря это:
If agecategory$ not <> 18 – значит тоже самое, что и A = B.
Вы убедитесь, насколько эти операторы полезны, когда будете писать условия в своих программах.
Команды хранения (DATA) данных и их чтения (READ)
Хранение данных станет важным и полезным способом содержания и чтения чисел или строковых (текста). Они могут быть использованы для хранения большого количества разных типов данных н-р. Данные об уровне (построения, которыми могут атаковать враги или данные для ландшафта в вашей игре и.т.д.). Вот основной пример команд READ/DATA:
Пример 1
Read a,b,c ;прочитать следующие 3 элемента данных в переменные a, b и c
Print a+","+b+","+c ;напечатать их значения
Data 1,2,3 ;сами элементы данных
Пример 2
Restore second ;начинать читать данные с отметки '.second'
Read a,b,c ;прочитать данные
Print a+","+b+","+c ;напечатать переменные
Restore first ; начинать читать данные с отметки '.first'
Read a,b,c ; прочитать данные
Print a+","+b+","+c ; напечатать переменные
.first
Data 1,2,3 ;элементы данных
.second
Data 4,5,6 ;ещё элементы данных
Вы должно быть заметили, что я подбросил команду RESTORE в Примере 2. Она используется для сброса указателя данных в любое время. Во время программирования игр вам может понадобиться прочитать те же самые данные опять н-р. Если вы хотите очистить экран и перерисовать его, используя свою таблицу данных – сбросив указатель, команда Read переместится на начало списка данных и вы сможете прочитать его опять.
Команда GOTO
OK – пишем следующее:
Print "Emily & Ellis were here today"
Goto goat
.goat
Print "So was George and his furry animals"
Итак, здесь мы печатаем наш текст – затем прыгаем на метку, названную .goat, и затем программа продолжит читать остальную часть команд от метки, которую вы установили.
Подпрограммы
Часто определённые последовательности команд используются в программе несколько раз. Вы можете избежать написания этой последовательности несколько раз, используя команду GOTO; но это не всегда приводит к нужным результатам. Команда GOSUB – это команда GOTO которая помнит откуда её вызвали и возвращается обратно, встретив команду RETURN, на строку после GOSUB продолжая дальше. После GOSUB должна стоять метка н-р. Gosub sheep, здесь программа посылается на серию команд начинающихся строкой .sheep – часть программы, которая лежит между.sheep и командой RETURN называется подпрограммой. Пример команды GOSUB будет таким:
Print "Baa Baa" ; На экран печатается текст
Gosub sheep ; Идёт в подпрограмму .sheep
WaitMouse ; Компьютер возвращается сюда! – и ждёт пока не будет нажата кнопка мышки
End
.sheep ; подпрограмма sheep
Print "Blitz Basic" ; Печатает текст на экран
Return ; возвращается на следующую линию после команды gosub.
Команды FOR NEXT
OK – Я быстро объясню команды FOR...NEXT – эти твари уже использовались в предыдущих примерах, если вы ещё не поняли! Эти две команды создают технику под названием цикл (loop) – так чтобы ваш компьютер выполнял какие либо задания несколько раз. Посмотрите эту программу.
For a = 0 To 100 ; устанавливает цикл с переменной a, использующейся как счётчик, от 0 (начало) до 100 (конец)
Print a ; печатает значение a
Next ; a равно 100? Нет, оно 1. Прибавим 1 к a, чтобы получить 2 и возвратимся к строчке Print a
Your program continues here... ; Когда a станет равным 100 программа закончит цикл (loop) и продолжит выполняться дальше.
Результатом будет то, что компьютер напечатает числа от 0 до 100.
размер шага (STEP)
Когда вы создаёте цикл, вы можете написать таким образом.
For a = 0 To 100 Step 10 ; Это такой же пример, как и предыдущий, только компьютер будет считать шагом (STEP) 10 за раз.
Print a ; Печатает значение a
Next ; Если a не равен 100 то прибавляет 10 к нему и идёт на строку Print
Your program continues here... ; Когда a становится равным 100 программа закончит цикл (loop) и продолжит выполняться дальше.
Результатом программы будет:
0
10
20
30
40
50
60
70
80
90
100
Функции
Использование функций - Часть 1
Итак, вы уже знакомы с "основами" программирования на Basic (н-р. For...Next)! Функция позволяет вам запускать часто используемые части кодов. Например, вот функция, которая печатает "Hello" на экран, когда вы её «вызываете»:
Function PrintHello () ; Начало функции
Print "Hello"
End Function ; Конец функции
For a=1 To 5 ; Давайте напишем "Hello" 5 раз, вызвав функцию PrintHello ():
PrintHello ()
Next
Теперь запустите программу, чтобы увидеть результат.
Использование функций - Часть 2
OK, теперь мы изменим функцию так, чтобы она печатала всё что мы захотим, каждый раз разное, когда мы её будем вызывать.
Функция:
Function PrintSomething (a$)
Print a$
End Function
; В этом случае, мы "проведём" строку (или строковую переменную, например blah$, или часть текста, заключённого в кавычки, н-р. ("Hello there")) в функцию.
PrintSomething ("Эй меня напечатают.")
PrintSomething ("И меня.")
; Использование строковой переменной
sentence$="И это тоже будет напечатано."
PrintSomething (sentence$)
Итак, чтобы ни находилось в скобках (), когда вы вызываете функцию, оно будет «проведено» в неё. Если вы посмотрите на саму функцию, вы увидите, что в скобках у неё находится временная переменная “a$” "PrintSomething (a$)", что значит, что она ожидает ввода строковой переменной, как мы и сделали.
Заметьте, что переменную "a$" можно было назвать хоть как - "b$" "sometext$".
Посмотрите внутрь функции, она записывает то, что в неё «провели» в свой параметр "a$" и использует его в команде Print ("Print a$").
Чтобы поупражняться, попробуйте поменять "a$" на "b$". Убедитесь, что вы поменяли все "a$" на "b$" в функции, или она не будет работать! Сделайте это прежде чем продолжать, и запустите её.
Вот, что у вас должно было получиться:
Function PrintSomething (b$)
Print b$
End Function
Теперь попробуйте поменять строки на что нибудь по вашему желанию (пока она заканчивается на значок $)
Использование функций - Часть 3
Так, Это был вызов очень простой функции, где она в основном используется как любая другая команда. Теперь посмотрим другой способ вызова функций. Мы можем заставить их провести вычисления и вернуть нам результат.
Функция:
Function JoinString$ (a$)
Return "Вы провели: "+a$
End Function
; Опять, мы "проводим" строку в функцию, но в этот раз мы сохраняем то, что возвращает нам функция.
mysentence$=JoinString ("Эй, меня напечатают.")
Print mysentence$
Запустите программу как раньше – что теперь произошло?
Во первых, посмотрев на саму функцию, мы знаем, что возвращаем из неё строковую переменную (присоединяя "Вы провели: " к строке, которую мы туда вводим), так что мы добавляем значок $ (string) к названию функции ("JoinString"), и получаем "JoinString$". Выражение "Return" возвращает объединённую строковую переменную обратно туда, где функция вызывалась. Запомните, вот почему мы добавили "$" к названию; Мы возвращаем эту СТРОКУ (STRING). Вызывая функцию, мы просто «вводим» туда любую строку, которую хотим, и получаем её обратно в нашу строковую переменную (в этом случае, "mysentence$"). Так, переменная mysentence$ станет "Вы провели: Эй меня напечатают." как только мы вызовем функцию.
Некоторые упражнения:
Потренируйтесь изменять имена переменных "mysentence$" на что-нибудь своё, н-р. b$, something$, что угодно. Заметьте, что вам придётся менять их в выражении Print тоже!
Поменяйте строку "Вы провели: " в функции на что-нибудь ещё, и поменяйте строку, которую мы «проводим» ("Эй меня напечатают."). Запустите её.
Использование функций - Часть 4
По умолчанию, функция возвращает либо:
0 - (ноль) для числовых переменных и "" - (пустая строка) для строковых
Function AddOneAndOne ()
a=1+1
End Function ; Здесь будет возвращён 0, потому что мы не сказали возвращать результат 1+1!
Print "Result of AddOneAndOne: "+AddOneAndOne () ; Попробуйте добавить строку "Return a" (без кавычек!) к функции AddOneAndOne, и запустите её заново. ТЕПЕРЬ она возвращает значение!
Упражнение: добавьте необходимую строку в функции, так, чтобы она возвращала a$
Function GimmeString$ ()
a$="If you can read this, you must have fixed this function!"
End Function
b$=GimmeString ()
If b$=""
b$="GimmeString doesn't return a value!"
Else Print b$
EndIf
Print "Result of GimmeString (): "+b$
Команды IF...THEN
Выражение IF (переводится как «если» : Scaven) работает как условие, зависящее от того, правдиво или ложно какое-либо высказывание. Если высказывание – правда, то выполняется выражение после команды THEN, иначе оно пропускается. Самое полезное условие – это сравнение двух чисел или строк. Вы можете проверить равняется ли одно число другому, или является ли одно число больше другого, и является ли одна строка такой же как и другая, или какая из них идёт раньше в алфавитном порядке. Здесь используются отношения =,<,>,<=,>=, и <>. Если вы ещё не встречались с этими знаками, то они обозначают следующее:
Знак Значение
= Равенство
< меньше чем
> больше чем
<= меньше или равно
>= больше или равно
<> Не равно
Взгляните на эти примеры:
.start ;устанавливает метку start
question$ = Input ("Shall I tell you the meaning of life yes/no? ") ; Печатает вопрос – ждёт ответа пользователя
If question$ = "no" Then Print "Alright, Then I won't"; Если (If) введеная строка = «no», то (THEN) напечатать текст
If question$ = "yes" Then Print "42" ;Если (IF) введеная строка = «yes», то (THEN) напечатать текст
If question$ <> "yes" Or "no" Then Goto start ; Если (IF) введеная строка не равна ни «no» ни «yes», то (THEN) идти (GOTO) на start
Мы можем добиться того же эффекта с числами:
number = Input ("How old are you ") ; Печатает вопрос – ждёт ответа пользователя
If number < 18 Then Print "You are under 18" ; Если введеное число < 18, то напечатать текст
If number > 18 Then Print "You are over 18" ; Если введеное число > 18, то напечатать текст
If number = 18 Then Print "you are 18" ; Если введеное число = 18, то напечатать текст
Выражение может быть любой комбинацией чисел, переменных, массивов и операторов, создающих логическое выражение.
Команда IF ENDIF
По такому же принципу работает команда If EndIf , только вместо THEN, команда ENDIF указывает конец списка выполняемых команд – этот пример показывает вам принцип:
commodore = 20 ; устанавливает переменную commodore
atari = 20 ; устанавливает переменную atari
If commodore = atari ; Если обе переменные равны...(выполнить код между этим местом и EndIf)
Print "Welcome to the machine - commodore and atari..." ; код, который должен быть выполнен, если обе переменные равны.
EndIf
Этот код такой же как и тот который написан ниже:
IF commodore = atari THEN PRINT "Welcome to the machine - commodore and atari..."
Также вы можете заставить вашу программу идти по другой цепочке событий, если значения не будут равны. Здесь мы представляем команду ELSE (переводится как «иначе» :Scaven), так, чтобы вы могли указать другой кусок кода, который вы хотите выполнить – вот так:
IF commodore = atari
PRINT "The values are equal to"
ELSE
PRINT "The values are different"
ENDIF
Запомните, что когда не употребляется команда THEN вы должны употреблять команду ENDIF – Заметьте также, что команда ENDIF используется не зависимо от использования команды ELSE.
Типы
Используя нормальные массивы (как написано выше), мы можем хранить важную информацию, например о положении игрока:
player = 3
x = 640
y = 480
Dim players (player, x, y)
players (2, 100, 100) ; так можно поставить игрока на позицию x = 100, y = 100
Это конечно хорошо, но вдруг мы захотим добавить ещё игроков? Нам придётся переустанавливать массив с максимальным количеством игроков! Также довольно сложно запомнить, для чего предназначен каждый элемент, если элементов много, н-р.
Dim playerdata (player, x, y, animframe, weaponselected, lives, rockets, jewelscollected, blah, blah2)
Попробуйте потом изменить количество «ракет», когда вы не будете видеть весь список элементов, без прокручивания обратно!
Способ избежать этой безнравственности – использовать Типы (types). Как мы установили массив "playerdata", так мы и установим тип "playerdata" вместо этого:
Type playerdata
Field player
Field x
Field y
Field animframe
Field weaponselected
Field lives
Field rockets
Field jewelscollected
Field blah
Field blah2
End Type
Думаете это сложно выглядит? Что же, давайте посмотрим:
Type playerdata
Эта линия просто создаёт новый тип (типы также называют "объектами", так что это надо называть "объект playerdata").
Field player
Field whatever
Строка Field просто говорит, какую информацию мы хотим держать в объекте «playerdata».
End Type
Эта строка просто показывает, что установка типа завершена. Не забудьте её!
Так, в примере с массивами мы хотели поменять элемент rocket (дадим ему 1000 ракет), что означало бы примерно столько:
playerdata (player, x, y, animframe, weaponselected, lives, 1000, jewelscollected, blah, blah2)
Ого, сколько текста! И я надеюсь вы запомнили порядок элементов? (ага, и вам пришлось вернуться назад, чтобы вспоминить что эти элементы означают!) Рациональный (читайте: по умному ленивый) программист будет использовать типы. Используя тип «playerdata»:
playerdata\rockets = 1000
Теперь это не только короче, но нам и не нужно запоминать где стоит значение (Теперь мы даже не можем случайно «положить» их неправильно, потому что мы конкретно говорим "сделать значение ракет равным 1000").
Заметьте, что мы добираемся до данных типа через косую черту (backslash) вот так: \
Чтобы прочитать значение jewelscollected во временную переменную, и показать значение, мы делаем так:
temp = playerdata\jewelscollected
Print temp
Конечно, ничто не остановит нас от того, чтобы напечатать значение напрямую:
Print playerdata\jewelscollected
Один важный аспект использования типов – тот, что вы должны указывать Blitz`у, что вы решили назначить переменную заказанному типу. Если мы хотим сделать двух игроков используя тип playerdata, то делаем так:
player1.playerdata = New playerdata
player2.playerdata = New playerdata
Это можно прочитать так: "создать новый объект playerdata под названием player1" и " создать новый объект playerdata под названием player2". Отсюда, мы можем делать что хотим с нашими только что указанными объектами.
Важно это запомнить, потому что нельзя просто написать:
player1.playerdata\rockets = 1000
...без предварительного создания объекта player1 типа playerdata, как написано выше!
Итак, если мы хотим использовать объект под названием "zoolook", типа "whatever", мы делаем так:
; указываем структуру нашего объекта:
Type whatever
Field something
; Столько полей информации, сколько нужно для объектов zoolook
End Type
zoolook.whatever = New whatever
Теперь мы можем использовать свой объект zoolook.
Где типы действительно становятся мощным инструментом – это там, где нам нужно множество схожих объектов (например, инопланетян в клоне "Космических Пришельцев"), и какой может быть более лёгкий способ их указания и изменения?
Type invader
Field x
Field y
End Type
Мы можем указать огромное количество инопланетян обычным циклом:
For a = 1 to 100
alien.invader = New invader
alien\x = Rnd (GraphicsWidth)
alien\y = Rnd (GraphicsHeight)
Next
Кажется, что мы просто перезаписываем один объект снова и снова, но это не так! Необычно в типах, то, что когда мы создаём новый объект, мы на самом деле создаём «указатель» на объект, а не сам объект.
Каждый раз, когда вы пишите:
something.mycustomtype = New mycustomtype ; новый "mycustomtype" под названием "something"
...вы пишите «создать новый объект 'mycustomtype' и дать мне указатель на него; назвать указатель 'something'».
Хотя мы можем обращаться к каждому объекту индивидуально, если мы дадим объектам индивидуальные имена, (н-р player1.playerdata, player2.playerdata), мы также можем совсем игнорировать их. Когда мы даём одно имя нескольким объектам определённого типа, мы просто добавляем их в скрытый список объектов, к которым нам не надо обращаться индивидуально. Чтобы нарисовать всех наших инопланетян, мы просто напишем:
For nasties.invader = Each invader
DrawImage invaderimage, nasties\x, nasties\y
Next<br
...и все наши инопланетяне нарисованы!
Заметьте, что необходимо присваивать нашей переменной-счётчику nasties в For...Next тип "invader", когда мы пролистываем наш список инопланетян.
Итак, для запоминания, когда мы создаём новый объект, мы на самом деле добавляем его в скрытый список объектов этого типа. Когда мы хотим иметь возможность обращаться к каждому индивидуальному объекту, мы даём каждому индивидуальное имя:
Type playerdata
Field x
Field y
End Type
player1.playerdata = New playerdata
player2.playerdata = New playerdata
Компьютер добавляет каждый объект в свой скрытый список объектов "playerdata", который может выглядеть так:
xxxxx1.playerdata [player1]
xxxxx2.playerdata [player2]
... но нас не интересует то, как компьютер хранит свой скрытый список – мы просто ссылаемся на player1 и player2.
Если нам не нужен доступ к каждому элементу в отдельности, мы можем сделать следующее:
Type blah
Field whatever
End Type
For a = 1 to 3
myobject.blah = New blah
myobject\whatever = 5
Next
Этот пример создаёт скрытый список объектов типа "blah", и устанавливает значение "whatever" каждого равным 5. Для компьютера, они могут храниться в какой-нибудь абстрактной форме, которую мы не знаем, н-р:
xxxx1.blah [myobject]
xxxx2.blah [myobject]
xxxx3.blah [myobject]
Очевидно, что мы не можем считывать отдельные объекты из списка, потому что мы дали им одно и тоже имя! Но нас это не беспокоит; Нам это и не надо – мы можем прочитать их «массой» используя цикл For...Each...Next:
For a.blah = Each blah
Print a\whatever
Next
Разбирая это по частям, мы получим:
For a.blah = Each blah
Это прочитывает каждый элемент объекта типа "blah" во временный объект под названием "a", тип которого также "blah" (так что он может хранить такие же данные, как и остальные объекты "blah").
Print a\whatever
Эта строчка печатает содержимое поля "whatever" временной переменной "a".
Next
Это обычная команда "Next" использующаяся в цикле For...Next.
Есть ещё много информации про типы (из-за их изумительной силы!), но это основы, которые помогут вам начать!
OK Теперь, когда вы прошли основу Basic`a, зайдите в мануал Blitz`а чтобы взглянуть на более продвинутые команды :)