Чтобы предоставить более общий ответ - вместо цикла вы хотите запланировать последовательность будущих задач, каждая из которых выполняет одну итерацию или шаг вашего AI-кода (или любого другого фонового процесса, который вы хотите запустить).
Вы можете шаг задача рекурсивно планировать себя:
dynamic doSomething(_) {
print('Doing something ...');
if(!stop) {
new Future.delayed(delay,(){}).then(doSomething);
}
return null;
}
main() async {
doSomething(null);
}
Хотя я не рекомендую это делать. Это неудобно контролировать - код шага должен проверять переменную флага, чтобы увидеть, следует ли продолжать или останавливаться, и это бесплатный запуск.
В качестве альтернативы можно использовать Timer
:
void doSomething(Timer timer) {
print('Doing something ...');
}
main() async {
new Timer.periodic(delay, doSomething);
}
Это дросселируется с постоянной скоростью и имеет равномерный шаг по времени, и проще остановить (вызов cancel()
по таймеру).
Другой подход может синхронизироваться с Жеребьевка циклом обновления браузера, запрашивая будущий кадр анимационного S:
import 'dart:html';
doSomething(num delta) {
print('Doing something ...');
window.animationFrame.then(doSomething);
}
void main() {
window.animationFrame.then(doSomething);
}
временные шаги не являются постоянными, но вы получите время дельту. Преимущество такого подхода заключается в том, что фреймы фреймов анимации не будут запланированы, если окно браузера будет скрыто.
How do I drive an animation loop at 60fps with Dart? См
Это очень простые примеры. Настройка правильных фоновых процессов для физического моделирования и ИИ в веб-играх на самом деле удивительно (по крайней мере для меня) нетривиальна. Вот два ресурса, которые я нашел полезными.
http://gameprogrammingpatterns.com/ - отличная бесплатная онлайн-книга шаблонов игрового программирования. http://gameprogrammingpatterns.com/game-loop.html - глава о игровых циклах.
http://gafferongames.com/game-physics/fix-your-timestep/ - часть последовательности статей по физическому моделированию в играх.
Почему вы wan't рассчитывать в цикле? Не могли бы вы просто измерить время, когда вы «начинаете считать» до тех пор, пока не произойдет щелчок? –
Я хочу, чтобы иметь возможность выполнять некоторые куски обработки в цикле while - задача будет искать слова в стек случайных букв. Это необходимо остановить, когда противник движется, поэтому я хочу, чтобы в этот момент можно было изменить значение OK с true на false. –
Я до сих пор не знаю, что вы подразумеваете под «контролем цикла while». В любом случае ваша функция генератора делает ваш код управляемым событием. 'await sleep()' добавляет некоторые дополнительные циклы для основного потока браузера. Я не знаю, полезно ли это. –