Перейти к основному содержимому

2.4. Как сделать, чтобы цикл выполнялся параллельно остальному коду, а не прерывал его?

В: Как сделать, чтобы цикл выполнялся параллельно остальному коду, а не прерывал его?

Дело в том, что в цикле много операций, и пока он не выполнится, игра висит. Можно ли сделать так, чтобы цикл выполнялся, но игра продолжалась?

О: В этом случае нужно использовать локацию-счётчик. Если игра может продолжаться даже пока цикл не выполнен, то локация-счётчик позволит распределить вычисления цикла во времени. Однако, это вовсе не означает, что код локации-счётчика выполняется параллельно коду остальной игры. Плеер только лишь прерывает выполнение основного кода (с определённой периодичностью) и выполняет код на локации-счётчике, затем продолжает выполнение основного кода.

Для начала нужно создать локацию-счётчик:

  • создаём локацию, название может быть любым, например "реалтайм".
  • указываем плееру, какую локацию ему нужно использовать, как локацию-счётчик. Пишем, например на самой первой локации в игре:
$counter = "реалтайм"

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

! обращение к локации-счётчику каждые 100 мс.

settimer 100

На локации счётчике пишем непосредственно код для циклических вычислений:

! чтобы запустить выполнение цикла,

! необходимо переменной цикл_вкл присвоить единицу

if цикл_вкл=1:
! если цикл запущен

! увеличиваем частоту обращения к локации-счётчику

settimer 10
if i<1000:
! если значение счётчика не достигло предела

! выполняем требуемые операции

! здесь заполняем массив

data[i]=i
! увеличиваем счётчик

i=i+1
else
! если значение счётчика достигло предела

! останавливаем выполнение цикла

цикл_вкл=0
! уменьшаем частоту обращения к локации-счётчику

settimer 500
end
end
! все перечисленные переменные - глобальные