Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.12.2009, 23:03
veles2008 вне форума Посмотреть профиль Отправить личное сообщение для veles2008 Найти все сообщения от veles2008
  № 1  
Ответить с цитированием
veles2008
 
Аватар для veles2008

Регистрация: Sep 2008
Сообщений: 158
По умолчанию цикл 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);
	  }
}

Старый 07.12.2009, 23:34
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 2  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
По крайней мере есть одна неправильность. Вы стартуете в цикле несколько "интервалов".
А удаляется интервал только один раз, последний.

Что делает это кусок, зачем несколько раз задается повторное выполнение moveIt ?
Код AS1/AS2:
for (var i:Number = 0; i < pole1; i++) {
	moveBk = setInterval(moveIt, 100);
}
Вы же не задаете никакого меняющегося параметра в интервальной функции, просто мгновенно запускается несколько параллельных периодических выполнений... Они наслоятся, и удалится только последнее периодическое выполнение..

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


Последний раз редактировалось mooncar; 07.12.2009 в 23:43.
Старый 07.12.2009, 23:49
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 3  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Разберитесь, для чего предназначена функция setInterval() и как ее использовать.
Некоторые замечания:
moveBk - это что у вас? кнопка или идентификатор интервала?
нет текста функции moveIt(), что она из себя представляет? // пардон, разглядел-таки.
vperod, pusk, powtor, pole, povtoryt3, func ... - режет глаза.
получаем плохо читаемый код в итоге, даже столь малый его кусок просматривать трудно.
....
опа.. сразу не увидел:
Цитата:
moveBK.onPress = function () {
...
в сочетании с
Цитата:
moveBk = setInterval(moveIt, 100);
и
Цитата:
clearInterval (moveBk);
- это как так?
и да, у вас не цикл не хочет останавливается, у вас плодятся интревалы в цикле, mooncar прав, пожалуй.


Последний раз редактировалось alexcon314; 08.12.2009 в 00:05.
Старый 07.12.2009, 23:52
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 4  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Код 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]);
}
__________________
return this...

Старый 07.12.2009, 23:57
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 5  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
По моим ощущениям, у него цикл-то останавливается, когда цикловое условие срабатывает, но вот процессы, которые им запущены, будучи безымянными и безответными, никак не прибить, если только не воспользоваться методом, предложенным AlexCooper.
Потом также в цикле нужно останавливать все интервалы.

Старый 07.12.2009, 23:59
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 6  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
AlexCooper, и вы туда же?

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


Последний раз редактировалось alexcon314; 08.12.2009 в 00:16.
Старый 08.12.2009, 00:00
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 7  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
alexcon314: Вообще я считаю бред создавать интервалы цыклом. Если б был весь код или хоть постановка задачи я уверен что можно сделать всё гараздо проще.

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

Старый 08.12.2009, 00:17
veles2008 вне форума Посмотреть профиль Отправить личное сообщение для veles2008 Найти все сообщения от veles2008
  № 8  
Ответить с цитированием
veles2008
 
Аватар для veles2008

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

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

Старый 08.12.2009, 00:19
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 9  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
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
__________________
return this...


Последний раз редактировалось AlexCooper; 08.12.2009 в 00:22.
Старый 08.12.2009, 00:28
veles2008 вне форума Посмотреть профиль Отправить личное сообщение для veles2008 Найти все сообщения от veles2008
  № 10  
Ответить с цитированием
veles2008
 
Аватар для veles2008

Регистрация: Sep 2008
Сообщений: 158
то что хотел сказать alexcon314 тоже не работает

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:01.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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