You are not logged in.
Pages: 1
Тему выложил чисто ради эксперимента для людей которые пишут в "Один вопрос" такие вопросы, ответы на которые можно найти где угодно или тем кому лень читать мануал 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
Без примера никак
: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
Молодец, отличная тема для новичков!
Offline
Молодец, отличная тема для новичков!
Спасибо
У меня есть так же английская версия, если что её тоже могу кинуть в Forum for English-speaking users.
Offline
Народ, я правильно понимаю, что если есть два потока, и в первом объявлен массив
var
$Preved: array 4 of Integer
end
а во втором объявлена переменная
var
$Medved: Integer
end
то в памяти они будут размещаться на одном и том же месте? Т.е. изменяем $Preved[0], изменяется и $Medved?
Offline
Pages: 1