Переменные
Переменная - это именованная область памяти со значением, которое может быть многократно прочитано и/или изменено. Существует два вида переменных - глобальные и локальные.
Глобальная переменная начинается со знака
$
, после которого следует ее имя. Имя глобальной переменной может состоять из латинских букв, цифр и _
:$variable1 $100 $____
Глобальная переменная, чье имя состоит из цифр, называется
DMA
-переменная (Direct Memory Address). См. Alloc.Значения глобальных переменных дост упны из любого места в коде.
Сохраняемые переменные - это особый вид глобальных переменных, добавленный в
LCS
и VCS
режимах. Перед их именем стоит $_
, например $_var
. Значение такой переменной восстанавливается при загрузке сохраненной игры. Глобальные переменные, которые начинаются только с $
(например, $var
), не сохраняют свое значение и обнуляются при загрузке сохранения в LCS или VCS.Именем локальной переменной служит число, после которого стоит знак
@
.Значения локальных переменных доступны только в пределах текущего скрипта или миссии.
Каждый скрипт или миссия также имеют две особые локальные переменные, которые называются
TIMERA
и TIMERB
. Значение переменной-таймера постоянно увеличивается с ходом игры, поэтому они обычно используются, чтобы измерять время, пройденное с определенного момента (сброса таймера).0006: TIMERA = 0 // сброс таймера
:WAIT_2S
0001: wait 0 ms
00D6: if
0019: TIMERA > 2000 // если таймер увеличился до 2000, т.е. прошло 2 секунды
004D: jump_if_false @WAIT_2S
0662: printstring "2 seconds has passed" // показать текст
Имена
TIMERA
иTIMERB
доступны начиная с Sanny Builder v3.3.0. В более ранних скриптах таймеры использовались как обычные локальные переменные [email protected], [email protected]
(в GTA3 и VC) либо [email protected], [email protected]
(SA).Переменные обычно используются в арифметических или усл овных выражениях. Если в выражении правая часть является числом, опкод указывать не обязательно:
$var = 0
$myarray($index, 10i) >= 150
Если же обе части выражения являются переменными, компилятор не сможет подобрать нужный опкод, т.к. типы переменных неизвестны.
Например, существует два опкода, которые складывают значения двух переменных:
0058
для целых чисел и 0059
для дробных.0058: $Var1 += $Var2 // (целые числа)
0059: $Var1 += $Var2 // (дробные числа)
Если убрать опкод, как скомпилировать такое выражение?
$Var1 += $Var2 // ??
Чтобы сообщить компилятору тип переменных, используется конструкция
VAR..END
.Конструкция
VAR..END
позволяет объявлять переменные и их типы.Синтаксис:
var
<переменная>: <тип>
end
Когда обе переменные имеют объявленный тип, выражение компилируется без опкода:
var
$Var1 : Integer
$Var2 : Integer
end
$Var1 += $Var2 // здесь будет опкод 0058
Поддерживаются следующих типы переменных:
Integer
,Int
- целые числаFloat
- дробные числаString
,ShortString
- переменная, содержащая короткий строковый литерал (используется только при объявлении массивов, для одиночных переменных используются префиксs$
или суффикс@s
)LongString
- переменная, содержащая длинный строковый литерал (используется только при объявлении массивов, для одиночных переменных используются префиксv$
или суффикс@v
)
Типы локальных переменных также могут быть объявлены.
Как только тип переменной объявлен, он используется везде ниже по коду. Тип переменной может быть изменен, если она используется по-другому:
script_name 'Food'
var
[email protected] : Float
$Var : Float
end
$var = 1
[email protected] = $Var
end_thread
thread 'Loop'
var
[email protected] : Int
$Var : Int
end
$var = 1
[email protected] = $Var
end_thread
В скрипте
'Food'
[email protected]
является дробной переменной. В скрипте'Loop'
[email protected]
уже целочисленная переменная.Тип переменной может быть переобъявлен многократно.
Начиная с версии 3.2.0 можно объявлять переменные, используя только имя типа (доступно для типов
Int
, Float
, String
, LongString
).С интаксис:
<type> <variable name>
int [email protected] // [email protected] объявлена как целочисленная переменная
Начиная с версии 3.4.0 появилась возможность объявить переменную с собственным именем:
int a
float distance
string name
a = 1
distance = 15.5
name = 'CJ'
Одновременно с объявлением такой переменной можно присвоить ей начальное значение, чтобы уменьшить количество строк кода:
int a = 1
float distance = 15.5
string name = 'CJ'
Компилятор связывает каждое имя с новой локальной переменной. В примере выше код будет скомпилирован примерно следующим образом:
Одновременно с объявлением переменной можно задать ей начальное значение. Для этого напишите
=
и значение:var
$fVar: float = 1.0
end
или
float $fVar = 1.0
Теперь переменная
$fVar
объявлена как Float
, и компилятор добавит в скрипт опкод 0005
:0005: $fVar = 1.0
Инициализация доступна только для переменных, но не массивов.
Last modified 2yr ago