Рейтинг - 4.0 (6)

Мы продолжаем изучать циклы и в этом уроке вы познакомитесь с другим типом циклов.

Вторая часть уроков о циклах посвящена циклу for. Особенностью этого цикла в том, что он может выполнить одну и ту же последовательность действий несколько раз, используя специальный счётчик. Например, этот счётик можно использовать для создания актёров или транспорта. Отличие этого цикла от "while" в том, что мы сами задаём сколько раз нужно обойти цикл, а "while" понятия не имеет сколько раз он будет это делать. Вот просто пример "for":

for 0@ = 0 to 16 step 1
 // ...опкоды...
end
Здесь:
0@ = 0 - назначаем переменную в качестве счётчика
16 - указываем границу, если переменная 0@ будет больше этого числа, то цикл прекращается
step 1 - указываем шаг, то есть число, которое будет прибавляться к 0@ после прохождения кода внутри блока. Если шаг равен 1, то писать его не нужно, так как по-умолчанию этот шаг равен 1.

Такой цикл может только прибавлять к переменной шаг, однако есть возможность и убавлять. Вот пример:

for 0@ = 16 downto 0 step 1
 // ...опкоды...
end

Принцип работы такой же, как и в предыдущем примере, только от переменной 0@ будет отниматься 1 ( step ) до тех пор, пока переменная не будет меньше 0 ( downto ). "Зачем он нужен?" - спросите вы. Отвечу. Вот, например, нам нужно создать 5 актёров. Ну 5 - это не так и много, а представьте, что вам нужно создать 100 актёров. Вручную их писать будет только безумец, поэтому и создан этой цикл - для облегчения подобной рутины. Нам нужно только подставить несколько опкодов для создания. Давайте, для примера, создадим скрипт, который будет спавнить 100 автомобилей:

var
$CAR : array 100 of car
end

:CAR
thread 'CAR'
wait 0
gosub @CAR_1
$X = 2493.0298
$Y = -1658.8713
$Z = 13.3487

for $I = 0 to 100 step 1
 $CAR[$I] = car.Create(#MANANA, $X, $Y, $Z)
 car.Angle($CAR[$I]) = 170.1416
 $X += -4.0
end

Model.Destroy(#MANANA)
end_thread

:CAR_1
wait 0
model.Load(#MANANA)
038B: load_requested_models

:CAR_2
wait 0
if
model.Available(#MANANA)
jf @CAR_2
return

Сначала нужно объявить массив автомобилей. Дальше в цикле создаём транспорт, путём изменения индекса, которой изменяется в цикле ( переменная "$I" ) а так же изменяем в цикле координату "$X", чтобы тачки не спавнились в одном месте. Не стоит забывать, что память не резиновая, поэтому не надо злоупотреблять количеством создаваемых игровых объектов.

Думаю необходимую информацию я вам предоставил. Вам остаётся делать свои тесты. И, для практики, предлагаю вам создать небольшую армию ( Пед "#ARMY" с оружием "#M4" ). Ваши скрипты пишите на форум. Если что не ясно - спрашивайте!


Теги: for, Циклы

KiLLeR96   (15.05.12 14:22)
biggrin 100 машин - это безумие!

KiLLeR96   (15.05.12 14:24)
а ты их пересчитал?

wmysterio   (15.05.12 15:07)
Я уверен, что создалось 100(или 101). Но некоторые взорвались, создались где то в текстурах. Считать нету смысла )) это ведь только пример )

KiLLeR96   (15.05.12 16:12)
array 100 of car
А для педов как?

wmysterio   (15.05.12 22:38)
array 100 of actor

Cool_T   (06.04.14 11:39)
А почему машин с водителями на улицах нету? Специально местность зачистил или они забоялись за руль садиться?)

wmysterio   (06.04.14 15:51)
При создании нового игрового субъекта любые другие в этих координатах будут удалятся ( за исключением статических объектов карты и субъектов, в которых отключена коллизия ).

)))DiMoN(((   (24.06.14 14:15)
а как сделать чтобы машины были в 2 ряда, то есть 10 спереди и 10 сзади?

0
wmysterio   (24.06.14 18:15)
Примерно так:
Код
$X = 0.0
$Y = 0.0
$Z = 0.0
$K = 0
for $I = 0 to 2 step 1
      for $J = 0 to 10 step 2
          $CAR[$K] = car.Create(#MANANA, $X, $Y, $Z)
          car.Angle($CAR[$K]) = 170.1416
          $X += -4.0
          $K += 1
      end
      $Y += -4.0
      $X = 0.0
end

DemonSC   (09.01.15 16:17)
WMYSTERIO, помоги пожалуйста. Почему вылетает игра?
сode:
Код
{$CLEO}
0000: NOP
var
0@: array 10 of actor
end
:ARMY
thread 'ARMY'
wait 0
gosub @ARMY_1
1@ = 2484.0989
2@ = -1674.5958
3@ = 13.3359
for 4@ = 0 to 10 step 1
0@[4@] = actor.Create(7,#FAM1,1@,2@,3@)
actor.Angle(0@[4@]) = 171.2266
01B2: give_actor 0@[4@] weapon 38 ammo 1000 // Load the weapon model before using this
model.Destroy(#FAM1)
model.Destroy(#MINIGUN)
1@ += -1.0
end
0A93: end_custom_thread
:ARMY_1
wait 0
model.Load(#FAM1)
model.Load(#MINIGUN)
038B: load_requested_models
:ARMY_2
wait 0
if and
model.Available(#ARMY)
model.Available(#MINIGUN)
jf @ARMY_2
return

0
wmysterio   (09.01.15 16:49)
Помогу.
1) Модели нужно выгружать только после создания актёров.
2) Массив локальных переменных не имеет сигнатуры 0@[index]. В место этого используется неудобная 0@(index_var,count+TYPE).
3) Локальный массив всегда "забирает" часть переменных под типы. Например:
0@ array 10 of actor резервирует 10 переменных начиная от 0 до 0+10. Если мы используем переменные из этого места, то возможен вылет из за типов, как в этом случаи.

Правильный код вот:
Код
{$CLEO}    
0000: NOP    

var    
0@: array 10 of actor    
end    

:ARMY    
thread 'ARMY'    
wait 0    
gosub @ARMY_1    
12@ = 2484.0989    
13@ = -1674.5958    
14@ = 13.3359    

for 15@ = 0 to 10 step 1    
    0@(15@,10i) = Actor.Create( 7, #FAM1, 12@, 13@, 14@ )
    Actor.Angle( 0@(15@,10i) ) = 171.2266    
    01B2: give_actor 0@(15@,10i) weapon 38 ammo 1000  
    12@ += 2.0 // увеличил шаг здесь на всякий случай   
end    

model.Destroy(#FAM1)    
model.Destroy(#MINIGUN)
0A93: end_custom_thread    

:ARMY_1    
wait 0    
model.Load(#FAM1)    
model.Load(#MINIGUN)    
038B: load_requested_models    

:ARMY_2    
wait 0    
if and    
model.Available(#FAM1)    
model.Available(#MINIGUN)    
jf @ARMY_2    
return

DemonSC   (10.01.15 06:37)
Благодарю!
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
Как Вы относитесь к ситуации с OpenIV?
Всего ответов: 8
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 2
Гостей: 1
Пользователей: 1
wmysterio
Сегодня нас посетили:
wmysterio, Dyabda
Реклама