#1 27-03-2010 11:45

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Основы скриптинга

Тему выложил чисто ради эксперимента для людей которые пишут в "Один вопрос" такие вопросы, ответы на которые можно найти где угодно или тем кому лень читать мануал Sanny Builderа. Если тема вам чем-то не нравится, напишите об этом прямо.
Внимание! Используется оригинальный текст написанный мною от руки, за всеми исправлениями и прочим пишем в эту тему.

В этом учебнике я постараюсь рассказать обо всём что знаю. Всё что нужно для этого: Sanny Builder (далее просто SB) последней версии, оригинальная игра Grand Theft Auto San Andreas (её мы будем "разрезать"), ну и собственно желание.

[large]1. Потоки и метки[/large]
Потоком, в нашем случае, мы будем называть определённый блок с командами (опкодами) которые компилятор в последствии скомпилирует на понятный игре язык.
Простой пример потока это его создание и завершение. Смотрим ниже.

:TEST // имя нашего потока. оно может быть любым и даже содержать цифры.
wait 0 ms // кейворд wait - ожидание в 0 милисекунд.
end_thread // конец потока.
:TEST
wait 0 ms
jump @TEST_1092 // новый кейворд jump, является сигналом для перехода на указанную после @ метку

:TEST_1092
wait 0 ms
end_thread

Можете спросить, почему я каждый раз ставлю "wait 0 ms". По сути, это является правилом хорошего тона, да и так будет надёжнее.

Теперь давайте я объясню. В первом варианте, мы просто создали поток и завершили его. Во втором варианте, создали поток с ссылкой на другую метку и перешли на неё, во втором потоке просто поставили его завершение.

[large]2. Переменные - локальные и глобальные[/large]
Теперь, когда вы обладаете навыками по созданию, переходу и завершению потоков переходим к главной теме скриптинга - переменные.
Для чего-же существуют переменные и какую погоду они делают в вашем скрипте? Можно сказать основное - переменные служат для хранения в них информации. Всего их может быть создано 32 (плюс 2 таймера или 1024 если в миссии) локальных и (вроде) бесконечное число глобальных. Глобальные переменные можно так же использовать в качестве массива.
То есть:

var // кейворд который по смыслу можно перевести как "пусть"
$tempVAR : Array 5 of Integer // назначаем глобальной переменной $tempVAR массив типа Integer (Целочисленное) с пятью индексами.
end // конец кейворда "пусть"

Будет верным заметить, что существуют предопределённые переменные. Это значит что они уже (с момента старта игры) содержат в себе какие-то значения и менять их содержимое будет не самым верным шагом.
Примеры предопределённых переменных: $PLAYER_ACTOR, $PLAYER_CHAR (обозначение игрока)
Пример всего вышеперечисленного:

:TEST
wait 0 ms
15@ = 0 // присваиваем локальной переменной 15 значение 0
$CARS = 1352 // глобальной переменной CARS присвоили значение в 1352
$CARS[0] = 325 // в индекс массива глобальной переменной CARS (любой индекс начинается с нуля) 0, записали значение 325
end_thread

[large]3. Условия[/large]
Ещё одна, не менее важная тема. Умея умело манипулировать условиями можно добиться многого. В мини-таблице ниже идут перечисления "условий" и их объяснение.

if ... then ... end- если "..." тогда "..." конец
if and ... then ... end- ... то же самое, но для массовых проверок
while <условие> ... end - пока <условие> не правда, делай "..."
repeat ... until <условие> - делай "..." до тех пор пока <условие> не вернёт результат true (правда)

1) Пример для условия "if"

if
    $tempVAR = 5
then
Inc($tempVAR) // данный кейворд служит для увеличения переменной в скобках на 1.
end

2) Пример для условия "if and"

if and
     $tempVAR = 5
     $tempVAR = 4
then
Dec($tempVAR) // аналог кейворда Inc, но здесь идёт уменьшение на 1.

3) Пример для условия "while"

while $tempVAR == 5 // заметьте, присваивание переменной значения делается одним знаком равно, а проверка значения двумя.
Dec($tempVAR)
end

4) Пример для условия "repeat until"

repeat
Inc($tempVAR)
until $tempVAR == 2

Немного об кейворде "var"

var
     19@ : Integer // пустой переменной 19 присваивается тип Integer (Целочисленное)
     $PLAYER_CHAR: Player // помните, я говорил о том что некоторые переменные не изменяют своих значений. это одна из них. данная переменная содержит класс "Игрок". о том что такое класс и с чем его едят, поговорим прямо сейчас
end

[large]4. Классы[/large]
Класс в SB, это опкод записанный в виде кейворда-массива. В предыдущем примере, вы могли видеть присвоение переменной PLAYER_CHAR класс Player (Игрок по-русски). Всего классов порядка девяти, вот они (в алфавитном порядке):
A
Actor
C
Car
Camera
G
Garage
M
Marker
Model
O
Object
P
Pickup
Player

Без примера никак smile

:TEST
wait 0 ms
if
    Player.Defined($PLAYER_CHAR)
then
8@ = 1
if
    8@ == 1
jf @TEST
end_thread

В данном примере мы проверили "существует-ли игрок". Если это так, то присвоили переменной 8 значение в 1. Затем проверили, равно-ли значение переменной 8 единице. Если нет, переходим в самое начало потока, а если да то завершаем поток успехом и аплодисментами.

[large]5. Gosub - безусловный переход[/large]
Время для последней главы. Мы уже ознакомились со всеми базовыми понятиями SB и время последней темы - gosub.
Gosub является безусловным переходом на указанную метку с последующим возвратом на поток-родитель. Если проще, то смотрите пример:

:ONE
gosub @_Check // переход на метку _Check (ставить "_" ,не обязательно)
if
    $tempVAR == 150
then
Dec($tempVAR)
end
end_thread

:_Check
$tempVAR = 150
return // возвращение на последнее слово "gosub"

В данном примере мы сразу-же после старта перешли на метку-инициализацию (gosub очень хорошо подходит для инициализации каких-то данных или чтения параметров из файла с его последующим присвоением переменным и константам) в которой присвоили переменной tempVAR значение в 150 и сразу же вернулись в начало первой метки. Там нас встретила проверка "равно-ли значение tempVAR 150? Если это правда, то значение переменной уменьшается на единицу.

Собственно это всё о чём я успел рассказать. Следует заметить, что эта тема - основа основ для базовых понятий о скриптинге. Никаких мелочей, чисто по делу. В общем, оцениваем, учимся.

Last edited by Sw[ee]t (27-03-2010 11:46)

Offline

#2 27-03-2010 16:41

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Основы скриптинга

Молодец, отличная тема для новичков!

Offline

#3 27-03-2010 17:52

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Основы скриптинга

~AquaZ~ wrote:

Молодец, отличная тема для новичков!

Спасибо grin
У меня есть так же английская версия, если что её тоже могу кинуть в Forum for English-speaking users.

Offline

#4 01-06-2012 22:14

Hryuckinnen
Registered: 01-06-2012
Posts: 1

Re: Основы скриптинга

Народ, я правильно понимаю, что если есть два потока, и в первом объявлен массив

var
$Preved: array 4 of Integer
end

а во втором объявлена переменная

var
$Medved: Integer
end

то в памяти они будут размещаться на одном и том же месте? Т.е. изменяем $Preved[0], изменяется и $Medved?

Offline

Board footer

Powered by FluxBB