Основы скриптинга - Форум
Новые сообщения Участники Правила Поиск
  • Страница 1 из 1
  • 1
Основы скриптинга
Fire-ix
Вторник, 12.04.2011, 17:00 | Сообщение # 1
АдминКо
Сообщений:818
:-)
В этих статьях я попытаюсь объяснить, как создавать cleo-скрипты в среде Sanny Builder 3... Последнюю версию всегда можно скачать с сайта http://sannybuilder.com/.
В первой статье я попытаюсь дать базовые понятия о том, что такое переменная, какие бывают типы данных... Тут не буде ничего нового для тех, кто имеет базовые знания о языках программирования. Такие люди могут благополучно закончить на этом чтение этой статьи, но им следует обратить внимание, что здесь существуют типы данных, с которыми они еще нигде не встречались...
Примеры рельных программ и более детальную информацию можно узнать в справке СБ (вызывается нажатием F12)[/off]

[cut=Для всех же остальных...]Начну я с того, что такое переменная. Традиционно, переменную представляют в виде «ящика», в который «кладется» некоторое значение. Строго говоря, переменная имеет свой (всегда уникальный) идентификатор и значение (то что «кладут»). По идентификатору происходит обращение к этой переменной, а значение в ней может перезаписываться… Эти значения бывают разных типов. Когда говорят о типе переменной, подразумевают тип значения в этой переменной.

Какие есть типы данных в скриптинге GTA:

Целочисленные (Integer). Принимают, как не трудно догадаться, положительные и отрицательные целые значения.

Вещественные (Float). Числа с дробной частью, дробная часть отделяется от целой точкой: например, 5.624.

Строковые (String). Значения строковых переменных представляют собой последовательность символов, отделяются двойными кавычками (строка переменной длины variable-length string) или одинарными (строка фиксированной длины fixed-length string – содержит до 15 символов, - если символов меньше, остаток заполняется символами NULL). Например, “STRING” или ‘STRING’.

Так называемые хэндлы (Handle): обобщают в себе переменные, ссылающиеся на классы: актеров (Actor), машины (Car), объекты (Object), игрока (Player)…

Переменные описанных выше типов объявлять не обязательно, но вы можете это сделать конструкцией:

Code
Var  
<идентификатор переменной> : <ее тип>  
End

Нажатие ctrl + space в Sanny Builder’е отображает список всех типов.[/off]
Массивы (Array). Содержат в себе несколько значений одного и того же типа. Обращение к этим переменным происходит по идентификатору массива и номера значения в нем.. Объявление массива в Sanny Builder'е обязательно:

Code
Var  
<идентификатор массива> : Array XX of <тип>  
End

*XX здесь – количество значений содержащихся в массиве.

Проще всего к значениям в массиве обращаться следующим образом:

Code
$My_array[0]

, здесь 0 – это номер элемента в массиве. Вместо ноля может стоять любое другое целое число, а также переменная целочисленного типа. В последнем случае обращение происходит к элементу массива под номером, равным значению в этой переменной.
Строго говоря, в СБ не существует типа массив... Это производный тип. Когда мы обращаемся к элементу массива,

Code
$My_array[0]

Компилятор оперирует им как отдельной переменной... Скриптеру во время использования массивов следует это иметь ввиду. Использование массивов в написании скриптов облегчает работу с большим количеством однотипных элементов...

логический (или булев) тип данных (Boolean). Может принимать всего 2 значения - True или False (соответсвенно "правда" или "ложь"). Значение булева типа True заменяется единицей, False - нулем.

Code
Player.CanMove($PLAYER_CHAR) = True

Игрок получает способность двигаться.
Часто этот тип используется в качестве флага для некоторых опкодов.

Code
02AB: set_actor 2@ immunities BP 0 FP 0 EP 1 CP 1 MP 0

Здесь в качестве последних пяти параметров стоят флаги, определяющие наличие иммунитета актера к определенным видам воздействия.
В этом типе данных следует обратить внимание на существование булевых (или логических) операторов: 1) оператор коньюнкции (логическое "И", and), 2) оператор дизьюнкции (логическое "ИЛИ", or), 3) оператор отрицания (логическое "НЕ", not).
Эти операторы используются с двумя или более значениями булева типа, и в конструкции с ними тоже возвращают значение True или False Например, в импликации (конструкции условия)

Code
if and  
<condition 1>  
>condition 2>  
...  
<condition N>  
jf @label

условие будет выполнено тогда и только тогда, когда будут выполнены все условия, входящие в импликацию (т.е оператору If будет возвращено значение True). Пока можете особо не зацикливаться на этом типе данных, если не понимаете, - все станет намного яснее, когда я буду объяснять о практическом его использовании в условиях и циклах.

Вот, вроде и все типы данных, используемые в скриптинге... Что важно здесь уяснить - работать с переменными определенного типа надо как с переменными определенного типа, четко понимая, чего вы хотите добиться. Можно не уделять даже внимания умным словам, которые я тут понаписал - я их дал чисто для ликбеза (ликвидации безграмотности)...[/off]

Идем дальше...

Все переменные в скриптинге GTA делятся на локальные и на глобальные. Что важно, использование глобальных переменных в cleo приводит к конфликтам, поэтому, по меньшей мере, не рекомендуется использовать их при написании cleo-скрипта.

Обращение к локальным переменным происходит следующим образом:
0@, 1@, 2@,...
Как видите, идентификатор состоит из цифр и отделяется знаком @... Локальные переменные действуют только в пределах одного потока (в нашем случае – cleo-скрипта). В скриптах с расширением .cs число локальных переменных ограничено: от 0@ до 33@. Если вы хотите использовать больше переменных, сохраняйте скрипт в формате Custom Mission (с расширением .cm).
К слову, напишу как сохранять скрипт в формате CLEO. Делается это просто – при помощи директив: нужно в шапке скрипта (то есть в самом начале, первой строчкой) написать
Code
{$CLEO <расширение файла>}

Например:

Code
{$CLEO .cm}

или

Code
{$CLEO .cs}

Все - компилятор прочтет эту директиву и сохранит ваш скрипт в нужном формате...
Подробнее о директивах потом…
Обращение к глобальным переменным:
$var_1
Идентификатор может состоять из букв латинского алфавита, цифр и знака подчеркивания. Обратите внимание, что знак доллара (говорящий программе что это не что иное как глобальная переменная) ставится в начале идентификатора. Когда мы вводим этот знак $ с клавиатуры, Sanny Builder выводит список всех использовавшихся в некоторой окрестности скрипта глобальных переменных. Эта окрестность небольшая - так что не удивляйтесь если в этом списке вдруг не окажется нужная вам переменная. Как уже говорилось, использование глобальных переменных в CLEO приводит к конфликтам (если кто-то хочет подробнее узнать, почему это так - идем сюда или сюда), но ничто не мешает использовать глобальные переменные, описанные в файле CustomVariables.ini или цифровые, если вы точно знаете на что ссылаются эти переменные в main.scm. В первую очередь это относится к переменным:
$ONMISSION - значение этой переменной равно 1, если игрок выполняет какую-либо миссию, и 0 - если нет (при этом когда $ONMISSION равна 1, запрещено сохраняться и начинать новые миссии)
$PLAYER_ACTOR - в эту переменную записан актер - Карл
$PLAYER_CHAR - а в этой игрок (не путать с предыдущим - игрок и актер - разные типы переменных)
ну, и некоторые другие..


Флуд - Ближайшая дорога к бану (Fire-ix)
Fire-ix
Вторник, 12.04.2011, 17:03 | Сообщение # 2
АдминКо
Сообщений:818
:-)
В этой небольшой статье я не буду писать что делает тот или иной опкод, а попытаюсь объяснить что же такое опкод… Если вы это и так знаете, переходим к следующей статье.
Попытаемся разобраться, что из себя представляет скрипт. Это в первую очередь последовательность команд, которые или что-то делают с переменными к которым мы обращаемся в этой команде, или меняют что-то в памяти игры, или просто являются частью логической структуры скрипта. Каждая команда, обрабатываемая компилятором, называется "операционным кодом" или просто "опкодом". Каждый опкод пишется на отдельной строчке и обрабатывается программой последовательно, один за другим (за исключением случаев, когда выполняется прыжок из одного места в скрипте в другой по созданной заранее метке).

Sanny Builder предъявляет особые требования к синтаксису - то есть к правилам написания опкодов. И если вы написали какой-то скрипт а компилятор "ругается" и выдает ошибку «Неверное число параметров», то скорее всего вы неправильно написали это опкод. Также эта ошибка может возникнуть, если в опкоде вы указали не все параметры (переменные или значения) или указали их неправильно. Используйте встроенную в Sanny Builder утилиту "Поиск опкодов" (вызывается нажатием клавиш Ctrl + Alt + 2), чтобы найти нужный опкод. В большинстве опкодов параметром может выступать как переменная так и готовое значение, но и в том, и в другом случае к ним предъявляются одинаковые требования по типу.

Пример:

Code
00A1: put_actor $PLAYER_ACTOR at 345.5621 306.2212 998.4484

Этот опкод перемещает CJ'я в точку с координатами 345.5621 306.2212 998.4484 (X, Y и Z-координаты соответственно).
Как видим, эти значения имеют тип Float. Они могут быть заменены переменными: 1@, 2@, 3@. Но следует учесть, что эти переменные должны быть определены, то есть должны содержать некоторые значения вещественного типа. Для этого нам нужно сначала записать в них эти значения - или, как говорят, присвоить им значение.
Простейший способ присваивания - опкодом

Code
0087: 1@ = 345.5621 // (float)  
0087: 2@ = 306.2212 // (float)  
0087: 3@ = 998.4484 // (float)

Знак "равенства" = говорит программе, что мы должны записать в переменную, стоящую слева, значение, стоящее справа.

Итак, получаем

0

Code
087: 1@ = 345.5621 // (float)  
0087: 2@ = 306.2212 // (float)  
0087: 3@ = 998.4484 // (float)  
00A1: put_actor $PLAYER_ACTOR at 1@ 2@ 3@

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

Code
0058: 1@ += 1 // (int)

увеличивает целочисленное значение (обозначается Integer или сокращенно int), записанное в переменную 1@ на 1. Он имеет номер 0058…
А опкод

Code
0059:1@ += 1.0 // (float)

делает тоже самое но только с переменными вещественного типа (действительные, с дробной частью, с точкой). Его номер - 0059

Sanny Builder же позволяет избавиться от подобных сложностей возникающих при написании скрипта: т.о. можно писать просто

Code
1@ += 1

или

Code
1@ += 1.0

Обратите внимание, что при записи значения в переменную с дробной частью нельзя отбрасывать эту самую дробную часть, даже если она равна 0. Следует отметить, что вместо 1 и 1.0 может стоять некоторая переменная соответствующего типа:

Code
1@ += 2@

Как вы догадались, существуют и другие подобные этому опкоды:

Code
1@ -= 2

(уменьшает целочисленное значение на два; для вещественного типа следует писать 1@ -= 2.0)

Code
1@ *= 2

(умножает на 2)

Code
1@ /= 2

(делит на 2)
Иногда бывает нужно перевести целочисленное значение в вещественное или наоборот (в последнем случае просто отбрасывается дробная часть). Делается это при помощи опкодов

Code
0093: 2@ = integer 1@ to_float  
0092: 1@ = float 2@ to_integer

Здесь 1@ - переменная типа Integer, а 2@ - типа Float.

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

Code
01B2: give_actor 2@ weapon 28 ammo 60 // Load the weapon model before using this

//То же самое, что и
01B2: 2@ 28 60


Флуд - Ближайшая дорога к бану (Fire-ix)
SLU@CKI
Суббота, 23.04.2011, 08:37 | Сообщение # 3
Сообщений:11
:-)
Fire-ix, спс полезная информация
DarkNess
Среда, 17.08.2011, 12:45 | Сообщение # 4
Карандашница!
Сообщений:22
:-)
SLU@CKI, хахаха нуб сразу видно biggrin

  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Рекламный блок

Рекламный блок

Подробнее...

Рекламный блок