Показать сообщение отдельно
Старый 01.12.2011, 19:40
PainKiller вне форума Посмотреть профиль Отправить личное сообщение для PainKiller Найти все сообщения от PainKiller
  № 1  
Ответить с цитированием
PainKiller
 
Аватар для PainKiller

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
Attention Задача с перебором двух массивов

Начну с описания задачи. Имеется 18 предметов (класс Value), которые надо расставить по 18 гнездам (класс Target).Соответственно, предметы содержатся в массиве termValueArray, а гнезда в массиве targetsArray. Когда предмет встает в гнездо, справа от него появляется галочка (метод checkShow принимает булево значение и отрисовывает галочку). Когда предмет вынимается из гнезда или переставляется в др. гнездо галочка должна исчезать и появляться только у занятого предметом гнезда. Перетаскивание предметов осуществляется драг-энд-дропом, при отпускании мыши (событие MOUSE_UP) в классе Value диспатчится событие, по которому начинается проверка занятых и свободных гнезд. Проблема как раз и возникла с алгоритмом этой проверки. Поначалу я думал, что задача достаточно тривиальная, и с ходу написал примерно такой код (это только одна из моих многочисленных версий):

Код AS3:
function checkHit(e:Event):void
{
    for (var j:Number = 0; j < termValueArray.length; j++)
			{
				for (var i:Number = 0; i < targetsArray.length; i++)
				{
					if (termValueArray[i].hitTestObject(targetsArray[j]))
					{
						trace("Hitting");
						termValueArray[i].rank = targetsArray[j].targetRank;
						termValueArray[i].x = targetsArray[j].x;
						termValueArray[i].y = targetsArray[j].y;
						targetsArray[j].checkShow = true;
						trace (targetsArray[j].checkShow + " ветвь if" + " i=" + i + " j=" + j);
					}
					else
					{
						trace (targetsArray[j].checkShow + " ветвь else" + " i=" + i + " j=" + j);
						if (targetsArray[j].checkShow)
						{
						       targetsArray[j].checkShow = false;
						}
 
					}
 
				}
Естественно этот код не работает т.к. отрисованная галочка закрывается при последующих прохождениях цикла. Если же вывести код закрытия галочки за цикл с i то она все равно закрывается. Я ломал над этой задачей голову полдня, честно говоря уже ничего не соображаю, начал приходить к выводу, что перебором двух массивов эту задачу решить нельзя вообще. Видимо надо писать какой то внешний контроллер, но он опять же должен проверять занятые и свободные гнезда, и опять же это надо делать перебором! В общем буду рад хоть какому намеку на пути решения этой задачи.