|
|
|||||
Регистрация: Sep 2008
Сообщений: 158
|
цикл FOR не хочет останавливаться
На сцене есть поле ввода pole в котороя я ввожу количество повторений в цикле. Если ввожу 1 цикл работает 1 раз. Если ввожу число больше 1 то цикл выполняется бесконечно. Почему так?
pole1 = 1; var course:Array = new Array(); var step:Number = 10; var count:Number = 0; povtoryt3.onPress = function () { txt.text +="Повторить" + "\n"; } pole.onChanged = function(txt:TextField) { func(); } function func() { pole1 = Number(pole.text); } powtor.onPress = function() { txt.text +=pole1 + ' ' + povy.text +"\n"; } moveBK.onPress = function () { course.push('VPEROD'); txt.text +="Вперёд" + ' ' + vp1.text +"\n"; } function moveIt () { if (count < course.length) { doMove (course[count]); count++; } else { clearInterval (moveBk); count = 0; for (i in course) { pusk.enabled = true; } } } function doMove (direct:String) { switch (direct) { case 'VPEROD' : var ss1=Number(vp1.text); bk._x += 20*ss1; break; } } _root.vp1.restrict = _root.pole.restrict = '0-9'; pusk.onRelease = function () { this.enabled = false; //здесь проблема for (var i:Number = 0; i<pole1; i++) { moveBk = setInterval(moveIt, 100); } } |
|
|||||
Модрон-ветеринар
|
По крайней мере есть одна неправильность. Вы стартуете в цикле несколько "интервалов".
А удаляется интервал только один раз, последний. Что делает это кусок, зачем несколько раз задается повторное выполнение moveIt ? Вы же не задаете никакого меняющегося параметра в интервальной функции, просто мгновенно запускается несколько параллельных периодических выполнений... Они наслоятся, и удалится только последнее периодическое выполнение.. setInterval запускает циклический повтор сам по себе, без приравнивания возвращаемого номера интервала. Если мы присваиваем какой-то переменной возвращаемый номер, а потом ссылаемся на нее при удалении интервала, то просто указываем номер интервала для удаления. Поэтому, если переменной (moveBk) мы присваиваем последовательно несколько возвращаемых номеров интервалов, то при ссылке на moveBk в clearInterval будет остановлен только последний присвоенный номер. А в цикле-то был несколько раз вызван setInterval, остальные-то предыдущие тоже нужно поудалять, если что. Последний раз редактировалось mooncar; 07.12.2009 в 23:43. |
|
|||||
listener
|
Разберитесь, для чего предназначена функция setInterval() и как ее использовать.
Некоторые замечания: moveBk - это что у вас? кнопка или идентификатор интервала? нет текста функции moveIt(), что она из себя представляет? // пардон, разглядел-таки. vperod, pusk, powtor, pole, povtoryt3, func ... - режет глаза. получаем плохо читаемый код в итоге, даже столь малый его кусок просматривать трудно. .... опа.. сразу не увидел: Цитата:
Цитата:
Цитата:
и да, у вас не цикл не хочет останавливается, у вас плодятся интревалы в цикле, mooncar прав, пожалуй. Последний раз редактировалось alexcon314; 08.12.2009 в 00:05. |
|
|||||
moveBk = new Object(); for (var i:Number = 0; i < pole1; i++) { moveBk['ntrvl'+i] = setInterval(moveIt, 100); } and
__________________
return this... |
|
|||||
Модрон-ветеринар
|
По моим ощущениям, у него цикл-то останавливается, когда цикловое условие срабатывает, но вот процессы, которые им запущены, будучи безымянными и безответными, никак не прибить, если только не воспользоваться методом, предложенным AlexCooper.
Потом также в цикле нужно останавливать все интервалы. |
|
|||||
listener
|
AlexCooper, и вы туда же?
в moveIt увеличивать счетчик и проверять, не превысил-ли он либо длину массива course, либо pole1 (тут я непонял задумку). Не превысил, - двигать, превысил - clearInterval(). Последний раз редактировалось alexcon314; 08.12.2009 в 00:16. |
|
|||||
alexcon314: Вообще я считаю бред создавать интервалы цыклом. Если б был весь код или хоть постановка задачи я уверен что можно сделать всё гараздо проще.
Добавлено через 2 минуты но кажись, мой код верен с точки зрения функционирования...
__________________
return this... |
|
|||||
Регистрация: Sep 2008
Сообщений: 158
|
Постановка задачи такова:
Исполнитель типа "черепашки"(LOGO). Есть определённые действия которые можно выполнять 3 алгоритмами:линейным, ветвлением и циклом. Сначала задаём все действия, а потом нажимаем на кнопку и они по очереди выполняются. Это фрагмент программы в котором нужно реализовать цикл но при этом чтоб и при использовании без цикла программа тоже исполнялась. Всё готово кроме цикла. С циклом вот такие проблемы Добавлено через 2 минуты AlexCooper, ваш код не работает.( Может я что то не так делаю) |
|
|||||
alexcon314 хочет сказать
и и удалять veles2008: Я не в ответе за код потому что не присваивал Кнопке интервалы в личной практике. И код писал до того как вгляделся что индетификатор интервала является объэктом класса button
__________________
return this... Последний раз редактировалось AlexCooper; 08.12.2009 в 00:22. |
|
|||||
Регистрация: Sep 2008
Сообщений: 158
|
то что хотел сказать alexcon314 тоже не работает
|
Часовой пояс GMT +4, время: 23:01. |
|
« Предыдущая тема | Следующая тема » |
|
|