Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   цикл FOR не хочет останавливаться (http://www.flasher.ru/forum/showthread.php?t=133536)

veles2008 07.12.2009 23:03

цикл FOR не хочет останавливаться
 
На сцене есть поле ввода pole в котороя я ввожу количество повторений в цикле. Если ввожу 1 цикл работает 1 раз. Если ввожу число больше 1 то цикл выполняется бесконечно. Почему так?

Код AS1/AS2:

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);
          }
}


mooncar 07.12.2009 23:34

По крайней мере есть одна неправильность. Вы стартуете в цикле несколько "интервалов".
А удаляется интервал только один раз, последний.

Что делает это кусок, зачем несколько раз задается повторное выполнение moveIt ?
Код AS1/AS2:

for (var i:Number = 0; i < pole1; i++) {
        moveBk = setInterval(moveIt, 100);
}

Вы же не задаете никакого меняющегося параметра в интервальной функции, просто мгновенно запускается несколько параллельных периодических выполнений... Они наслоятся, и удалится только последнее периодическое выполнение..

setInterval запускает циклический повтор сам по себе, без приравнивания возвращаемого номера интервала. Если мы присваиваем какой-то переменной возвращаемый номер, а потом ссылаемся на нее при удалении интервала, то просто указываем номер интервала для удаления. Поэтому, если переменной (moveBk) мы присваиваем последовательно несколько возвращаемых номеров интервалов, то при ссылке на moveBk в clearInterval будет остановлен только последний присвоенный номер. А в цикле-то был несколько раз вызван setInterval, остальные-то предыдущие тоже нужно поудалять, если что.

alexcon314 07.12.2009 23:49

Разберитесь, для чего предназначена функция setInterval() и как ее использовать.
Некоторые замечания:
moveBk - это что у вас? кнопка или идентификатор интервала?
нет текста функции moveIt(), что она из себя представляет? // пардон, разглядел-таки.
vperod, pusk, powtor, pole, povtoryt3, func ... - режет глаза.
получаем плохо читаемый код в итоге, даже столь малый его кусок просматривать трудно.
....
опа.. сразу не увидел:
Цитата:

moveBK.onPress = function () {
...
в сочетании с
Цитата:

moveBk = setInterval(moveIt, 100);
и
Цитата:

clearInterval (moveBk);
- это как так?
и да, у вас не цикл не хочет останавливается, у вас плодятся интревалы в цикле, mooncar прав, пожалуй.

AlexCooper 07.12.2009 23:52

Код AS1/AS2:

moveBk = new Object();
for (var i:Number = 0; i < pole1; i++) {
        moveBk['ntrvl'+i] = setInterval(moveIt, 100);
}

Добавлено через 3 минуты
and
Код AS1/AS2:

for (var i:Number = 0; i < pole1; i++) {
        clearInterval(moveBk['ntrvl'+i]);
}


mooncar 07.12.2009 23:57

По моим ощущениям, у него цикл-то останавливается, когда цикловое условие срабатывает, но вот процессы, которые им запущены, будучи безымянными и безответными, никак не прибить, если только не воспользоваться методом, предложенным AlexCooper.
Потом также в цикле нужно останавливать все интервалы.

alexcon314 07.12.2009 23:59

AlexCooper, и вы туда же?

Код:

pusk.onRelease  = function  () {
          this.enabled = false;
        //здесь проблема
        // убрать! for (var i:Number = 0; i<pole1; i++) {
                moveBk = setInterval(moveIt, 100); // переименуйте moveBk !
        // }
}

в moveIt увеличивать счетчик и проверять, не превысил-ли он либо длину массива course, либо pole1 (тут я непонял задумку). Не превысил, - двигать, превысил - clearInterval().

AlexCooper 08.12.2009 00:00

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

Добавлено через 2 минуты
но кажись, мой код верен с точки зрения функционирования...

veles2008 08.12.2009 00:17

Постановка задачи такова:
Исполнитель типа "черепашки"(LOGO). Есть определённые действия которые можно выполнять 3 алгоритмами:линейным, ветвлением и циклом.
Сначала задаём все действия, а потом нажимаем на кнопку и они по очереди выполняются.
Это фрагмент программы в котором нужно реализовать цикл но при этом чтоб и при использовании без цикла программа тоже исполнялась.
Всё готово кроме цикла. С циклом вот такие проблемы

Добавлено через 2 минуты
AlexCooper, ваш код не работает.( Может я что то не так делаю)

AlexCooper 08.12.2009 00:19

alexcon314 хочет сказать

Код AS1/AS2:

moveNtrlv = setInterval(moveIt, 100);

и

Код AS1/AS2:

function moveIt()
{
        for (var i:Number = 0; i < pole1; i++)
        {
                // ваш код
        }
}

и удалять
Код AS1/AS2:

clearInterval(moveNtrlv);

veles2008: Я не в ответе за код потому что не присваивал Кнопке интервалы в личной практике. И код писал до того как вгляделся что индетификатор интервала является объэктом класса button

veles2008 08.12.2009 00:28

то что хотел сказать alexcon314 тоже не работает


Часовой пояс GMT +4, время: 22:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.