Sanny Builder: Типы данных
Продолжая разговор о возможностях Sanny Builder, хотелось бы обсудить вопрос о типах данных. Новички зачастую не сразу понимают, что означают Integer values, что такое String и т.п. Им и посвящена данная статья. Вообще, те типы данных (Data Types), которые используются в SB, характерны для многих языков программирования. Условно, их всех можно разделить на числа и текст. Процессор понимает только числа. Текст сам по себе является набором символов, каждый из которых имеет свое численное выражение. Скриптовые возможности движка GTA не позволяют (да такой необходимости и не стоит) работать с отдельным символом в строке. Однако определенные операции со строками производить все же можно. Базовым видом данных являются числа. Они, как известно, бывают двух видов: целые и дробные. Важное замечание: отличие между ними состоит не столько в значении самого числа, а в его записи. Так число 5.0 с точки зрения математики есть число целое. Однако в скриптах оно будет именоваться дробным, или числом с плавающей точкой (floating-point value). Все числа, которые имеют в своем написании точку, являются дробными. Пример:
50.001
-10.750
0.0 Для чисел между -1 и 1 можно не писать 0 в начале. Т.е. 0.0 равнозначно .0
Поскольку способ записи числа имеет значение, то возможны ошибки, когда скриптер забывает написать точку. Компилятор в таком случае расценивает число как целое. Не вдаваясь в отдельные подробности, скажу, что значение этого числа будет немного изменено вследствие этого. В игре после этого могут появиться проблемы. Поэтому следите за этим обстоятельством.
Некоторые опкоды в игре требуют именно применения дробных значений. Это касается скорости движения отдельных объектов, здоровья, брони и т.п. Поэтому старайтесь точно узнать, какой именно тип необходимо использовать.
Sanny Builder в данном случае берет часть работы на себя. Во-первых, внутри классов можно вызвать подсказку. Подсказка появляется автоматически, когда вы ставите скобку после имени члена класса:
Car.PutAt(
Вы увидете, что 2й, 3й, 4й параметры имеют тип Float. Также подсказку для данного члена класса можно вызвать в любое время нажатием Ctrl+Shift+Space.
Во-вторых, при использовании конструкции Var..End, SB начинает следить за тем, какие числа вы записываете в переменные. Например, вы объявили переменную $Var с типом Float:
var
$Var: Float
end
Теперь, если вы попытаетесь записать в эту переменную целое число
$Var = 1
компилятор автоматически преобразует его в дробное
$Var = 1.0
Примечание: Данное правило не распространяется на случаи, когда в строке стоит опкод. Тогда SB записывает все параметры as is, не анализируя их. Поэтому лучше, если вы будете следить за своими скриптами.
Еще один тип данных это хендл (handle). Строго говоря это простое число, однако оно представляет собой указатель в памяти на какой-либо объект. Опять-таки, опуская подробности, скажу, что хендл - это "имя" объекта (машины, актера и т.п.). По данному имени вы можете обратиться к объекту и производить над ним определенные действия.
Хендлы содержатся в переменных целого типа (Integer values). Их содержимое заполняется после использования специального опкода - конструктора. В SB в каждом классе есть такой конструктор.
Имеются ввиду классы опкодов для динамических объектов, которые создаются непосредственно в скриптах. Например актер (actor), игрок (player), объект (object) и т.д. Нединамические объекты (гаражи) или некоторые отдельные виды объектов, которые не создаются в ходе игры (модели), такого конструктора не имеют.
Конструктор имеет одинаковое для всех классов имя - Create. После его срабатывания игра создает в памяти указатель на новый объект и записывает его в переменную:
Теперь хендл актера хранится в переменной $ActorHandle, и вы можете, используя ее, делать с ним все, что угодно.
Строго говоря, хендл можно получить не только создавая нового актера (или еще что-нибудь). В игре существуют специальные опкоды, позволяющие "захватить" случайного прохожего и превратить его таким образом в актера. Но это тема для отдельного разговора.
Как уже говорилось, хендл суть есть обычное число. Его значение можно легко узнать, и в принципе с хендлом можно проводить любые арифметические и логические операции. Поэтому все математические опкоды, предназначенные для целых чисел действительны и для хендлов. В комментариях к ним это иногда указано:
0084: $IntVar = $ActorHandle // integer values and handles
Ну и наконец заключительный тип - String. Он использовался во всех GTA, но только в SA получил развитие.
String представляет собой строку, т.е. набор символов. В скриптах SA используются два вида строк: фиксированной и переменной длины. Последний вид НЕ поддерживается в GTA3 и VC.
Строки фиксированной длины (fixed-length string) могут содержать до 7 символов включительно. Если строка будет меньше этой длины, остаток заполняется пустотой. Данные строки оформляются в одинарные кавычки:
05AA: s$MyString = 'MY_STR' // 8-byte strings
Обратите внимание, что для работы со строками используется специальный вид переменных. Они обозначаются буквой s: s$GlobalVar, 1@s.
Данный вид строк может использоваться и как хендл. Обратите внимание на команду
thread 'MAIN'
MAIN в данном случае - это имя потока. Используя его, можно прекратить поток из любого места
Такие строки, кроме функции хендлов, используются как идентификаторы отдельных полей в .GXT-файле.
00BA: text_styled 'STAD_01' 1000 ms 2
Другой вид строк - строки переменной длины (variable-length string). Они обозначаются двойными кавычками и могут содержать в себе большее по сравнению с предыдущим видом число символов. Точное число не известно.
Данный вид может использоваться для тех же целей, что и предыдущий. Чаще всего в оригинальных скриптах он используется для указания имен анимаций
04ED: load_animation "LOWRIDER"
Переменные, содержащие такие строки, обозначаются символом v: v$GlobalVar, 1@v.
Ограничений по использованию разных видов строк не было замечено. Это значит, что вы можете использовать в опкоде либо первый, либо второй вид. Выбор будет осуществляться в зависимости от длины строки.
В математических операциях работа со строками существенно ограничена. Вы можете проводить лишь операции присваивания и сравнения:
Перечисленные выше типы данных присущи и элементам массивов. Т.е. массивы могут быть типа Integer, Float, String. Подробнее о работе с массивами в Sanny Builder будет рассказано отдельно.