Циклы могут быть вложенными (т.е. один цикл внутри другого).
Внимание: не забывайте устанавливать задержку (0001: wait) в циклах, чтобы предотвратить зависание игры. FOR..END
Этот оператор задает цикл со строго определенным числом итераций (повторений) Для него используется следующий синтаксис:
FOR = TO/DOWNTO [step = 1] ... END
Основные параметры: - переменная, которая используется в качестве счетчика итераций (повторений) цикла.
- стартовое значение счетчика: любое число (может быть имя модели).
TO/DOWNTO - при TO счетчик будет наращивать свое значение, при DOWNTO уменьшать.
- конечное значение цикла, при котором он завершит работу: любое число (может быть имя модели). Помните, что при DOWNTO конечное значение должно быть меньше стартового.
- (необязательный параметр) значение приращения или уменьшения счетчика при итерациях. По умолчанию его значение равно 1. При использовании дробных чисел в качестве значений счетчика, вы должны также указать параметр step с дробным значением.
Пример цикла:
var $value: int = 0 $final: int = 100 end
FOR $MyCounter = 1 to $final step 2 $value += $mycounter end
WHILE..END
Синтаксис:
WHILE ... END
Цикл WHILE работает до тех пор, пока выполняется условие. Условие проверяется перед итерациями, поэтому если оно будет сразу ложным, то цикл не выполнится никогда.
$var = 10
while $var > 11 inc($var) end
так как условие в цикле ложно, скрипт никогда не придет на команду Inc($var)
Оператор While может принимать в качестве условий логические константы True и False: While True .. End - цикл будет выполняться бесконечно, пока вы не прервете его командой Break. While False .. End - цикл будет игнорироваться компилятором.
В текущей версии для цикла WHILE доступно только одно условие. Вы можете проверять большее кол-во условий внутри тела цикла и использовать команды Break и Continue. REPEAT..UNTIL
Синтаксис:
REPEAT ... UNTIL
Цикл Repeat работает до тех пор пока не выполнится условие после команды Until. Условие проверяется после итераций, поэтому цикл всегда будет иметь минимум одну итерацию.
Оператор Repeat может принимать в качестве условий логические константы True и False: Repeat .. Until True - цикл будет иметь только одну итерацию Repeat .. Until False - цикл будет выполняться бесконечно, пока вы не прервете его командой Break.
В текущей версии для цикла REPEAT доступно только одно условие. Вы можете проверять большее кол-во условий внутри тела цикла и использовать команды Break и Continue. Использование Continue и Break
Иногда вам может потребоваться пропустить текущую итерацию и перейти к следующей, например после проверки условия. Для этого существует ключевое слово Continue. Оно может использоваться в качестве параметра. Тогда оно обозначает метку, после которой происходит приращение счетчика и переход к следующей итерации.
Например:
if $currentactor.dead jf continue // 'continue' это внутренняя метка в начале цикла
В качестве отдельной команды оно обозначает опкод 0002 (jump), с переходом на следующую итерацию.
if not $currentactor.dead jf @next Continue // jump continue :next
Кроме этого существует команда Break, которая прерывает цикл. Она может использоваться как отдельная команда так и как параметр (jf break)
Примеры :
1) Пример использование цикла REPEAT...UNTIL:
Смысл следующий: мы создаём машину и актёра в ней , затем заставляем машину понтоваться, т.е. поднимать и удерживать колёса разными способами, прям как на соревновании лоурайдеров.
create_thread @Anims // создаём поток с именем Anims ...
:Anims // начинаем поток wait 0 // ждём 0 мс,если не напишем,то может вылететь #REMINGTN.Load // объявляем нужную модель машины - Ремингтон #FAM2.Load // объявляем нужную модель актёра - Член Грув Стрит банды 038B: load_requested_models // загружаем ранее объявленые модели
:Anims_2 // создаём второй label wait 0 // ждём 0 мс,если не напишем,то может вылететь if and // условие с выполнением всех подусловий(проверок) #REMINGTN.Available // проверка (загрузилась ли модель #REMINGTN) #FAM2.Available // проверка (загрузилась ли модель #FAM2) player.Defined($PLAYER_CHAR) // проверка (существует ли игрок) jf @Anims_2 // если хоть одна из проверок возвратила значение False, // т.е. не выполнилась, то переходим к началу label'a wait 5000 // ждём 5 мс,просто для удобства car.Create(4@,#REMINGTN,2492.6,-1669.5,13.4) // создаём тачку напротив дома Карла 0129: 5@ = create_actor 4 #FAM2 in_car 4@ driverseat // создаём актёра в этой машине wait 3000 // ждём 3 мс,просто для удобства Car.ToggleHydraulics(4@) = True // устанавливаем на машину гидравлику, если // не поставим, то финтов машина делать не будет $Timer = 25 // Создаём переменную,и приравниваем её к 25, это будет наш таймер
:Anims_3 // создаём следующий label wait 0 // ждём 0 мс,если не напишем,то может вылететь REPEAT // начинаем цикл wait 10 // ждём 10 мс 07F5: car 4@ control_hydraulics 1000.0 0.0 0.0 0.0 // машина поднимает к-л колесо, вот номера колёс 1000.0 - переднее левое, // 0.0 - заднее левое, следующий 0.0 - переднее правое и // последний 0.0 - заднее правое. $Timer -= 1 // отнимаем от нашей переменной 1 UNTIL $Timer <= 1 // пока таймер не будет меньше либо равен 1, наш цикл будет выполнятся, // так всё запутано из-за того, что чтобы поднять колесо надо выоплнить // эту команду большое количество раз и за маленькое время, и чтобы колесо // держалось навису эту команду тоже надо поддерживать // принцип действия заключается в том, что мы задаём переменной $Timer //значение 25, и с каждым разом когда мы выполняем команду поднятия колеса, // от этой переменной отнимается еденица, // команда выполняется каждые 10 мс(wait 10), и когда $Timer становится //равной или меньше единицы, мы переходим к следующему действию, //поднятие уже другого колеса, но предварительно опять // задаём переменной $Timer значение 25, а то если она равна нулю, // то выполнение перекинется на поднятие другого колеса, // и так пока не будет найдено хоть одно нормальное значение $Timer $Timer = 25 REPEAT wait 10 07F5: car 4@ control_hydraulics 0.0 1000.0 0.0 0.0 $Timer -= 1 UNTIL $Timer <= 1 $Timer = 25 REPEAT wait 10 07F5: car 4@ control_hydraulics 0.0 0.0 1000.0 0.0 $Timer -= 1 UNTIL $Timer <= 1 $Timer = 25 REPEAT wait 10 07F5: car 4@ control_hydraulics 0.0 0.0 0.0 1000.0 $Timer -= 1 UNTIL $Timer <= 1 $Timer = 25 REPEAT wait 10 07F5: car 4@ control_hydraulics 1000.0 0.0 1000.0 0.0 $Timer -= 1 UNTIL $Timer <= 1 $Timer = 25 REPEAT wait 10 07F5: car 4@ control_hydraulics 0.0 1000.0 0.0 1000.0 $Timer -= 1 UNTIL $Timer <= 1 $Timer = 25 REPEAT wait 10 07F5: car 4@ control_hydraulics 1000.0 1000.0 0.0 0.0 $Timer -= 1 UNTIL $Timer <= 1 $Timer = 25 REPEAT wait 10 07F5: car 4@ control_hydraulics 0.0 0.0 1000.0 1000.0 $Timer -= 1 UNTIL $Timer <= 1 $Timer = 120 REPEAT wait 10 07F5: car 4@ control_hydraulics 1000.0 0.0 0.0 1000.0 $Timer -= 1 UNTIL $Timer <= 1 $Timer = 120 REPEAT wait 10 07F5: car 4@ control_hydraulics 0.0 1000.0 1000.0 0.0 $Timer -= 1 UNTIL $Timer <= 1 $Timer = 25 jump @Anims_3 // тут прыгаем на начало label'a , чтобы все действия
Если вытащить из машины актёра,то машина перестанет поднимать колёса.
2) Пример использование цикла FOR...END:
Давайте создадим последовательно 10 актёров на одинаковом расстоянии друг от друга,используя данный тип цикла и массив:
create_thread @Actors // создаём поток с именем Actors :Actors // начинаем поток wait 5000 // делаем задержку в 5 секунд,чтобы увидить действие цикла в игре самому var // объявляем переменные $num: Integer = 10 // это количесво актёров $actor: array 10 of Actor // это массив из 10 актёров $X: Float // координата по оси X $Y: Float // координата по оси Y end // заканчивание объявления переменных
#WMOPJ.Load // объявляем нужную модель 038B: load_requested_models // загружаем модель
while not #WMOPJ.Available //цикл-пока модель не загрузится,действие скрипта дальше не пойдёт wait 0 // задержка,даже нулевая,неотемлемая часть любого цикла end // конец цикла
wait 0 // ждём 0 мс, желательно писать после любого цикла,на всякий случай Actor.StorePos($PLAYER_ACTOR, $x, $y, $z) // записываем коорд-ы игрока в переменные $x,$y и $z inc($y,2) // прибавляем к Y координате число 2 dec($x,3) // отнимаем от X координаты число 3
FOR $CurrentIndex = 1 TO $num // начинаем цикл создания актёра inc($x)// прибавляем к координате X число 1, // 1 - число,которое задаётся автоматически $actor[$CurrentIndex].Create(4, #WMOPJ, $x, $y, $z) //тут создаём актёра,теперь поподробнее: // $actor - имя массива актёров, // $CurrentIndex - номер элемента массива, мы номера // элементов перебираем этим циклом,сами посмотрите wait 250 //задержка - неотемлемая часть любого цикла,// если не писать, то толку от цикла не будет end // конец цикла
Дата: Суббота, 11.09.2010, 22:39 | Сообщение # 1268
Создатель
Группа: Администраторы
Сообщений: 2242
Статус: Offline
ЧИтЕР, ты же их делал, помнишь в том скрипте где надевал на игрока свои текстуры. Там ведь была куча проверок, скрипт проходил через все проверки и возвращался к началу. Это и есть цикл. А что к справке посылают, так правильно делают, в неё тоже надо заглядывать. Mortal Kombat Conquest for GTA SA V2.0 GTA Invasion V2.0 Частная собственность
Да я не про то говорю! Вот у меня гоночная миссия.Я же не буду после каждого чекпоинта проверять "стал ли игрок на чкпоинт,и не умер ли актер $PLAYER_ACTOR,не умер ли актер 1@,явл ли уровень розыска >0 и.т.д." вот как это все по нормальному проверить ?чтоб много раз писать только проверку "сталлиигрокначкпоинт"
ЧИтЕР, советую скачать программу SARMC ( или как-то так ) это программа для создания гоночных миссий, пишешь координаты, противников и т.п и он дает тебе готовый код Forever
а как мне создать маркер что бы сесть в пагрузчик и подъехать к объекту напримр подн с каробками взять падон поднять и подъехать к поезду или к грузовеку и падон типа загрузился а потом когда несколько падонов загрузил то на поезде или на машине перевёз и там выгрузить погрузчиком.
Дата: Воскресенье, 12.09.2010, 09:12 | Сообщение # 1273
Создатель
Группа: Администраторы
Сообщений: 2242
Статус: Offline
Quote (ЧИтЕР)
Вот у меня гоночная миссия.Я же не буду после каждого чекпоинта проверять "стал ли игрок на чкпоинт,и не умер ли актер $PLAYER_ACTOR,не умер ли актер 1@,явл ли уровень розыска >0 и.т.д."
Там маркер светиться как стандартный, а мне он не нужен. У меня сделан свой вход в FBI. Мне нужны только актеры. Я удалил эту строчку : 07FB: set_interior "PAPER" access 1 Предполагая что это и есть маркер, ига запустилась, работает, но когда начинаешь выходить из нее выдает ошибку, кстате маркет предусмотренный этим скриптом перестал светить, но как быть с ошибкой?
Как в банду нанять более 7 человек, что надо сделать для этого.
С помощью этого скрипта можно добавить жителей San Andreas. Для каждого педа устанавливается стиль походки, принадлежность к определённой группе жителей San Andreas (проститутка, коп, ганстер какой-либо группировки и т.д.)
Да я не про то говорю! Вот у меня гоночная миссия.Я же не буду после каждого чекпоинта проверять "стал ли игрок на чкпоинт,и не умер ли актер $PLAYER_ACTOR,не умер ли актер 1@,явл ли уровень розыска >0 и.т.д." вот как это все по нормальному проверить ?чтоб много раз писать только проверку "сталлиигрокначкпоинт"
Если необходимо много раз выполнить один и тот же кусок кода, то можно использовать gosub. Не нужно писать больше проверок, чем необходимо. Результат проверки достоверен до ближайшего wait-а.
Den_spb а как мне создать маркер что бы сесть в пагрузчик и подъехать к объекту напримр подн с каробками взять падон поднять и подъехать к поезду или к грузовеку и падон типа загрузился а потом когда несколько падонов загрузил то на поезде или на машине перевёз и там выгрузить погрузчиком.
Дата: Воскресенье, 12.09.2010, 16:32 | Сообщение # 1285
Создатель
Группа: Администраторы
Сообщений: 2242
Статус: Offline
Ford, забываещь писать [/spoiler] в конце поста.
Quote (Ford)
Подскажите плиз что надо сделать в этом скрипте чтобы действовал он когда игрок сидит пассажиром
Держи
// This file was decompiled using sascm.ini published by Seemann (http://sannybuilder.com/files/SASCM.rar) on 13.10.2007 {$VERSION 3.1.0027} {$CLEO .cs}
//-------------MAIN--------------- 0000: NOP
:NONAME_2 wait 0 if and Player.Defined($PLAYER_CHAR) $ONMISSION == 0 else_jump @NONAME_2 if 0449: actor $PLAYER_ACTOR in_a_car else_jump @NONAME_2 if and not Actor.Driving($PLAYER_ACTOR) 84A7: not actor $PLAYER_ACTOR driving_boat 84A9: not actor $PLAYER_ACTOR driving_heli not Actor.DrivingPlane($PLAYER_ACTOR) 84C8: not actor $PLAYER_ACTOR driving_flying_vehicle 89AE: not actor $PLAYER_ACTOR driving_train else_jump @NONAME_2 if and not Actor.DrivingVehicleType($PLAYER_ACTOR, #BMX) not Actor.DrivingVehicleType($PLAYER_ACTOR, #BIKE) not Actor.DrivingVehicleType($PLAYER_ACTOR, #MTBIKE) not Actor.DrivingVehicleType($PLAYER_ACTOR, #COMBINE) not Actor.DrivingVehicleType($PLAYER_ACTOR, #TRACTOR) else_jump @NONAME_2 0570: 0@ = create_asset_radar_marker_with_icon 55 at 1944.852 -1769.554 13.0125 0570: 1@ = create_asset_radar_marker_with_icon 55 at 2209.816 2481.934 10.8203 0570: 2@ = create_asset_radar_marker_with_icon 55 at 604.8804 1705.273 6.541 0570: 3@ = create_asset_radar_marker_with_icon 55 at -2414.49 982.081 45.2969 0570: 4@ = create_asset_radar_marker_with_icon 55 at -2244.623 -2561.828 31.9219 0570: 5@ = create_asset_radar_marker_with_icon 55 at -1327.512 2678.107 50.0625 0570: 6@ = create_asset_radar_marker_with_icon 55 at -95.1488 -1174.303 1.9281 0570: 7@ = create_asset_radar_marker_with_icon 55 at -1679.982 408.9051 7.2365 0570: 13@ = create_asset_radar_marker_with_icon 55 at 652.03 -571.34 16.34 0570: 14@ = create_asset_radar_marker_with_icon 55 at -1605.897 -2714.252 48.5335 0570: 15@ = create_asset_radar_marker_with_icon 55 at -1471.48 1864.31 32.64 0570: 16@ = create_asset_radar_marker_with_icon 55 at 1596.5 2199.1 10.83 0570: 17@ = create_asset_radar_marker_with_icon 55 at 2145.9 2748.16 10.83 0570: 18@ = create_asset_radar_marker_with_icon 55 at 2642.11 1106.53 10.83 0570: 19@ = create_asset_radar_marker_with_icon 55 at 2117.42 920.42 10.83 0570: 20@ = create_asset_radar_marker_with_icon 55 at 1381.68 456.26 19.91 03C0: 8@ = actor $PLAYER_ACTOR car 046C: 26@ = car 8@ driver if 803B: not 26@ == $PLAYER_ACTOR // (int) else_jump @NONAME_2 0390: load_txd_dictionary "GASOLINE" 038F: load_texture "SCALEF" as 1 // Load dictionary with 0390 first 038F: load_texture "SCALEE" as 2 // Load dictionary with 0390 first 038F: load_texture "ARROW" as 3 // Load dictionary with 0390 first 038F: load_texture "LOCK" as 4 // Load dictionary with 0390 first wait 250 gosub @NONAME_2130 if 88B7: not test 12@ bit 1 else_jump @NONAME_626 0099: 10@ = random_int_in_ranges_0_to_32767 08BD: set 12@ bit 1 0A8C: write_memory 11@ size 1 value 12@ virtual_protect 0 jump @NONAME_656